ZGlmZiAtLWdpdCBhLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcyBiLy5zZXR0aW5ncy9vcmcuZWNsaXBzZS5qZHQuY29yZS5wcmVmcwppbmRleCBhNjk4ZTU5Li44Zjg4NDFlIDEwMDY0NAotLS0gYS8uc2V0dGluZ3Mvb3JnLmVjbGlwc2UuamR0LmNvcmUucHJlZnMKKysrIGIvLnNldHRpbmdzL29yZy5lY2xpcHNlLmpkdC5jb3JlLnByZWZzCkBAIC0xLDEyICsxLDUgQEAKKyNUdWUgSnVsIDMxIDE2OjA4OjA4IElTVCAyMDEyCitvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtPTEuNgogZWNsaXBzZS5wcmVmZXJlbmNlcy52ZXJzaW9uPTEKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4uaW5saW5lSnNyQnl0ZWNvZGU9ZW5hYmxlZAotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi5tZXRob2RQYXJhbWV0ZXJzPWRvIG5vdCBnZW5lcmF0ZQotb3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIuY29kZWdlbi50YXJnZXRQbGF0Zm9ybT0xLjgKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvZGVnZW4udW51c2VkTG9jYWw9cHJlc2VydmUKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS44Ci1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5saW5lTnVtYmVyPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5sb2NhbFZhcmlhYmxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5kZWJ1Zy5zb3VyY2VGaWxlPWdlbmVyYXRlCi1vcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmFzc2VydElkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnByb2JsZW0uZW51bUlkZW50aWZpZXI9ZXJyb3IKLW9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjgKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZT0xLjYKK29yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2U9MS42CmRpZmYgLS1naXQgYS9ldGMvc2FudHVhcmlvLXBtZC1ydWxlc2V0LnhtbCBiL2V0Yy9zYW50dWFyaW8tcG1kLXJ1bGVzZXQueG1sCmluZGV4IDQzNTUzZWUuLjU5NWI4NTkgMTAwNjQ0Ci0tLSBhL2V0Yy9zYW50dWFyaW8tcG1kLXJ1bGVzZXQueG1sCisrKyBiL2V0Yy9zYW50dWFyaW8tcG1kLXJ1bGVzZXQueG1sCkBAIC0yNiw3ICsyNiw2IEBACiAKICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9qYXZhL2Jhc2ljLnhtbCI+CiAgICAgIDxleGNsdWRlIG5hbWU9IkF2b2lkVXNpbmdIYXJkQ29kZWRJUCIgLz4KLSAgICAgPGV4Y2x1ZGUgbmFtZT0iU2ltcGxpZmllZFRlcm5hcnkiIC8+CiAgIDwvcnVsZT4KICAgPHJ1bGUgcmVmPSJydWxlc2V0cy9qYXZhL3VudXNlZGNvZGUueG1sIi8+CiAgIDxydWxlIHJlZj0icnVsZXNldHMvamF2YS9pbXBvcnRzLnhtbCIvPgpkaWZmIC0tZ2l0IGEvcG9tLnhtbCBiL3BvbS54bWwKaW5kZXggNWRjZjAxMi4uZDI5ZmEwZSAxMDA2NDQKLS0tIGEvcG9tLnhtbAorKysgYi9wb20ueG1sCkBAIC0yMiw3ICsyMiw3IEBACiAgICAgPGFydGlmYWN0SWQ+eG1sc2VjPC9hcnRpZmFjdElkPgogICAgIDxwYWNrYWdpbmc+YnVuZGxlPC9wYWNrYWdpbmc+CiAgICAgPG5hbWU+QXBhY2hlIFhNTCBTZWN1cml0eSBmb3IgSmF2YTwvbmFtZT4KLSAgICA8dmVyc2lvbj4yLjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8dmVyc2lvbj4yLjAuODwvdmVyc2lvbj4KICAgICA8ZGVzY3JpcHRpb24+CiAgICAgICAgIEFwYWNoZSBYTUwgU2VjdXJpdHkgZm9yIEphdmEgc3VwcG9ydHMgWE1MLVNpZ25hdHVyZSBTeW50YXggYW5kIFByb2Nlc3NpbmcsCiAgICAgICAgIFczQyBSZWNvbW1lbmRhdGlvbiAxMiBGZWJydWFyeSAyMDAyLCBhbmQgWE1MIEVuY3J5cHRpb24gU3ludGF4IGFuZApAQCAtNTcsMTIgKzU3LDEyIEBACiAgICAgPC9saWNlbnNlcz4KICAgICA8c2NtPgogICAgICAgICA8Y29ubmVjdGlvbj4KLSAgICAgICAgICAgIHNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9zYW50dWFyaW8veG1sLXNlY3VyaXR5LWphdmEvdHJ1bmsvCisgICAgICAgICAgICBzY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvc2FudHVhcmlvL3htbC1zZWN1cml0eS1qYXZhL3RhZ3MveG1sc2VjLTIuMC44CiAgICAgICAgIDwvY29ubmVjdGlvbj4KICAgICAgICAgPGRldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgICAgICAgICBzY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NhbnR1YXJpby94bWwtc2VjdXJpdHktamF2YS90cnVuay8KKyAgICAgICAgICAgIHNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2Yvc2FudHVhcmlvL3htbC1zZWN1cml0eS1qYXZhL3RhZ3MveG1sc2VjLTIuMC44CiAgICAgICAgIDwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NhbnR1YXJpby94bWwtc2VjdXJpdHktamF2YS90cnVuay88L3VybD4KKyAgICAgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL3NhbnR1YXJpby94bWwtc2VjdXJpdHktamF2YS90YWdzL3htbHNlYy0yLjAuODwvdXJsPgogICAgIDwvc2NtPgogICAgIDxvcmdhbml6YXRpb24+CiAgICAgICAgIDxuYW1lPlRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbjwvbmFtZT4KQEAgLTExMSw3ICsxMTEsNyBAQAogICAgICAgICAgICAgPHBsdWdpbj4KICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcG1kLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjc8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My41PC92ZXJzaW9uPgogICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8cnVsZXNldHM+CiAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXNldD4ke2Jhc2VkaXJ9L2V0Yy9zYW50dWFyaW8tcG1kLXJ1bGVzZXQueG1sPC9ydWxlc2V0PgpAQCAtMTY2LDcgKzE2Niw3IEBACiAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjUuNDwvdmVyc2lvbj4KICAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgogICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgogICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgpAQCAtMTk4LDcgKzE5OCw3IEBACiAgICAgICAgICAgICA8cGx1Z2luPgogICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5qdm5ldC5qYXhiMi5tYXZlbjI8L2dyb3VwSWQ+CiAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF4YjItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjAuMTMuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4wLjEyLjM8L3ZlcnNpb24+CiAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CiAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CiAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YmluZGluZ3M8L2lkPgpAQCAtMjc0LDYgKzI3NCw1NCBAQAogICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgogICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTAuMzwvdmVyc2lvbj4KICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbmltYWwtc25pZmZlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNpZ25hdHVyZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvLnNpZ25hdHVyZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmExNjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICA8L3NpZ25hdHVyZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Y2hlY2stamF2YS1jb21wYXRpYmlsaXR5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLWNsYXNzZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmNoZWNrPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS1ieXRlY29kZS12ZXJzaW9uPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVuZm9yY2VCeXRlY29kZVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SmRrVmVyc2lvbj4ke3RhcmdldEpka308L21heEpka1ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW5mb3JjZUJ5dGVjb2RlVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3J1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYWlsPnRydWU8L2ZhaWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXh0cmEtZW5mb3JjZXItcnVsZXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAtYmV0YS0zPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8L3BsdWdpbj4KIAogICAgICAgICA8L3BsdWdpbnM+CiAKQEAgLTQyMyw3ICs0NzEsNyBAQAogCiAgICAgPHByb3BlcnRpZXM+CiAgICAgICAgIDx4bWwuYXBpcy52ZXJzaW9uPjEuNC4wMTwveG1sLmFwaXMudmVyc2lvbj4KLSAgICAgICAgPG9sZHhtbHNlYy52ZXJzaW9uPjIuMC43PC9vbGR4bWxzZWMudmVyc2lvbj4KKyAgICAgICAgPG9sZHhtbHNlYy52ZXJzaW9uPjEuNS44PC9vbGR4bWxzZWMudmVyc2lvbj4KICAgICAgICAgPHNsZjRqLnZlcnNpb24+MS43LjIxPC9zbGY0ai52ZXJzaW9uPgogICAgICAgICA8eGFsYW4udmVyc2lvbj4yLjcuMjwveGFsYW4udmVyc2lvbj4KICAgICAgICAgPHhlcmNlcy52ZXJzaW9uPjIuMTEuMDwveGVyY2VzLnZlcnNpb24+CkBAIC00MzMsMTAgKzQ4MSwxMCBAQAogICAgICAgICA8eG1sdW5pdC52ZXJzaW9uPjEuNjwveG1sdW5pdC52ZXJzaW9uPgogICAgICAgICA8Y29tbW9ucy5jb2RlYy52ZXJzaW9uPjEuMTA8L2NvbW1vbnMuY29kZWMudmVyc2lvbj4KICAgICAgICAgPHdvb2RzdG94LmNvcmUuYXNsLnZlcnNpb24+NC40LjE8L3dvb2RzdG94LmNvcmUuYXNsLnZlcnNpb24+Ci0gICAgICAgIDxqZXR0eS52ZXJzaW9uPjkuMy45LnYyMDE2MDUxNzwvamV0dHkudmVyc2lvbj4KKyAgICAgICAgPGpldHR5LnZlcnNpb24+OC4xLjIyLnYyMDE2MDkyMjwvamV0dHkudmVyc2lvbj4KICAgICAgICAgPHhtbHNlYy5qYXhiLmNvbnRleHQuY2xhc3MgLz4KICAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gICAgICAgIDx0YXJnZXRKZGs+MS44PC90YXJnZXRKZGs+CisgICAgICAgIDx0YXJnZXRKZGs+MS42PC90YXJnZXRKZGs+CiAgICAgICAgIDxjbGlyci52ZXJzaW9uPjIuNzwvY2xpcnIudmVyc2lvbj4KIAogICAgICAgICA8IS0tIEFsbG93IENsaXJyIHNldmVyaXR5IHRvIGJlIG92ZXJyaWRlbiBieSB0aGUgY29tbWFuZC1saW5lIG9wdGlvbiAtRG1pblNldmVyaXR5PWxldmVsIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9hbm9ueW1vdXNSZWZlcmVuY2VTaWduYXR1cmUuZmlyc3RSZWZlcmVuY2UudHh0IGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9hbm9ueW1vdXNSZWZlcmVuY2VTaWduYXR1cmUuZmlyc3RSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNDc3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvZGlnZXN0SW5wdXRzL2Fub255bW91c1JlZmVyZW5jZVNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSwzIEBACis8QW5vbnltb3VzIHhtbG5zPSJodHRwOi8vYW5vbnltb3VzLmNvbSI+DQorICBUaGlzIFhNTCBmaWxlIGlzIHJlZmVyZW5jZWQgdmlhIGFuIGFub255bW91cyBSZWZlcmVuY2UgaW4gdGhlIFhNTCBzaWduYXR1cmUuDQorPC9Bbm9ueW1vdXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9tYW5pZmVzdFJlZmVyZW5jZS5maXJzdFJlZmVyZW5jZS50eHQgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvZGlnZXN0SW5wdXRzL21hbmlmZXN0UmVmZXJlbmNlLmZpcnN0UmVmZXJlbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjYzYjZmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9tYW5pZmVzdFJlZmVyZW5jZS5maXJzdFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSBAQAorPGRzaWc6TWFuaWZlc3QgeG1sbnM9Imh0dHA6Ly9pYWlrLmF0I0VudmVsb3BlIiB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0ibWFuaWZlc3QiPjxkc2lnOlJlZmVyZW5jZSBVUkk9IiI+PGRzaWc6VHJhbnNmb3Jtcz48ZHNpZzpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSI+PC9kc2lnOlRyYW5zZm9ybT48L2RzaWc6VHJhbnNmb3Jtcz48ZHNpZzpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSI+PC9kc2lnOkRpZ2VzdE1ldGhvZD48ZHNpZzpEaWdlc3RWYWx1ZT5LUXVvWnNlaWJZM2JJdXJVRmJ5WWhMQ205blk9PC9kc2lnOkRpZ2VzdFZhbHVlPjwvZHNpZzpSZWZlcmVuY2U+PGRzaWc6UmVmZXJlbmNlIFVSST0iLi4vc2FtcGxlcy9zYW1wbGVYTUxEYXRhLnhtbCI+PGRzaWc6VHJhbnNmb3Jtcz48ZHNpZzpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSI+PC9kc2lnOlRyYW5zZm9ybT48L2RzaWc6VHJhbnNmb3Jtcz48ZHNpZzpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSI+PC9kc2lnOkRpZ2VzdE1ldGhvZD48ZHNpZzpEaWdlc3RWYWx1ZT5vVXFwUStla0F2b2VDUmpsTWMxRVh6ckZKSkE9PC9kc2lnOkRpZ2VzdFZhbHVlPjwvZHNpZzpSZWZlcmVuY2U+PC9kc2lnOk1hbmlmZXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvbWFuaWZlc3RSZWZlcmVuY2UubWFuaWZlc3QuZmlyc3RSZWZlcmVuY2UudHh0IGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9tYW5pZmVzdFJlZmVyZW5jZS5tYW5pZmVzdC5maXJzdFJlZmVyZW5jZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4YTg0MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvbWFuaWZlc3RSZWZlcmVuY2UubWFuaWZlc3QuZmlyc3RSZWZlcmVuY2UudHh0CkBAIC0wLDAgKzEsNSBAQAorPEVudmVsb3BlIHhtbG5zPSJodHRwOi8vaWFpay5hdCNFbnZlbG9wZSI+DQorICA8RGF0YUl0ZW0gSWQ9IkRhdGFJdGVtIj4NCisgICAgU29tZSBEYXRhIGZyb20gSUFJSw0KKyAgPC9EYXRhSXRlbT4NCis8L0VudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvbWFuaWZlc3RSZWZlcmVuY2UubWFuaWZlc3Quc2Vjb25kUmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvbWFuaWZlc3RSZWZlcmVuY2UubWFuaWZlc3Quc2Vjb25kUmVmZXJlbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDVmMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9tYW5pZmVzdFJlZmVyZW5jZS5tYW5pZmVzdC5zZWNvbmRSZWZlcmVuY2UudHh0CkBAIC0wLDAgKzEsMyBAQAorPFNhbXBsZSB4bWxucz0iaHR0cDovL2lhaWsuYXQjU2FtcGxlIj48RGF0YUl0ZW0gSWQ9IkRhdGFJdGVtIj4NCisgICAgU29tZSBEYXRhIGZyb20gSUFJSw0KKyAgPC9EYXRhSXRlbT48L1NhbXBsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvZGlnZXN0SW5wdXRzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLmZpZnRoUmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvc2lnbmF0dXJlVHlwZXNTaWduYXR1cmUuZmlmdGhSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNTQ1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvZGlnZXN0SW5wdXRzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLmZpZnRoUmVmZXJlbmNlLnR4dApAQCAtMCwwICsxIEBACis8ZHNpZzpPYmplY3QgeG1sbnM9Imh0dHA6Ly9pYWlrLmF0I0VudmVsb3BlIiB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0ib2JqZWN0SWQiPkEgdGV4dCBmcm9tIElBSUs8L2RzaWc6T2JqZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvc2lnbmF0dXJlVHlwZXNTaWduYXR1cmUuZm91cnRoUmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvc2lnbmF0dXJlVHlwZXNTaWduYXR1cmUuZm91cnRoUmVmZXJlbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWQ0YzcyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9zaWduYXR1cmVUeXBlc1NpZ25hdHVyZS5mb3VydGhSZWZlcmVuY2UudHh0CkBAIC0wLDAgKzEsMyBAQAorPERhdGFJdGVtIHhtbG5zPSJodHRwOi8vaWFpay5hdCNTYW1wbGUiIElkPSJEYXRhSXRlbSI+DQorICAgIFNvbWUgRGF0YSBmcm9tIElBSUsNCisgIDwvRGF0YUl0ZW0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9zaWduYXR1cmVUeXBlc1NpZ25hdHVyZS5zZXZlbnRoUmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvc2lnbmF0dXJlVHlwZXNTaWduYXR1cmUuc2V2ZW50aFJlZmVyZW5jZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4YTg0MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvc2lnbmF0dXJlVHlwZXNTaWduYXR1cmUuc2V2ZW50aFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSw1IEBACis8RW52ZWxvcGUgeG1sbnM9Imh0dHA6Ly9pYWlrLmF0I0VudmVsb3BlIj4NCisgIDxEYXRhSXRlbSBJZD0iRGF0YUl0ZW0iPg0KKyAgICBTb21lIERhdGEgZnJvbSBJQUlLDQorICA8L0RhdGFJdGVtPg0KKzwvRW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9zaWduYXR1cmVUeXBlc1NpZ25hdHVyZS5zaXh0aFJlZmVyZW5jZS50eHQgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvZGlnZXN0SW5wdXRzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLnNpeHRoUmVmZXJlbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDU0NWZkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL2RpZ2VzdElucHV0cy9zaWduYXR1cmVUeXBlc1NpZ25hdHVyZS5zaXh0aFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSBAQAorPGRzaWc6T2JqZWN0IHhtbG5zPSJodHRwOi8vaWFpay5hdCNFbnZlbG9wZSIgeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgSWQ9Im9iamVjdElkIj5BIHRleHQgZnJvbSBJQUlLPC9kc2lnOk9iamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvZGlnZXN0SW5wdXRzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLnRoaXJkUmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9kaWdlc3RJbnB1dHMvc2lnbmF0dXJlVHlwZXNTaWduYXR1cmUudGhpcmRSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMGFmZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvZGlnZXN0SW5wdXRzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLnRoaXJkUmVmZXJlbmNlLnR4dApAQCAtMCwwICsxLDMgQEAKKzxEYXRhSXRlbSB4bWxucz0iaHR0cDovL2lhaWsuYXQjRW52ZWxvcGUiIElkPSJEYXRhSXRlbSI+DQorICAgIFNvbWUgRGF0YSBmcm9tIElBSUsNCisgIDwvRGF0YUl0ZW0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL3NhbXBsZXMvYW5vbnltb3VzUmVmZXJlbmNlQ29udGVudC54bWwgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2FtcGxlcy9hbm9ueW1vdXNSZWZlcmVuY2VDb250ZW50LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDdmMmFmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL3NhbXBsZXMvYW5vbnltb3VzUmVmZXJlbmNlQ29udGVudC54bWwKQEAgLTAsMCArMSw1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKw0KKzxBbm9ueW1vdXMgeG1sbnM9Imh0dHA6Ly9hbm9ueW1vdXMuY29tIj4NCisgIFRoaXMgWE1MIGZpbGUgaXMgcmVmZXJlbmNlZCB2aWEgYW4gYW5vbnltb3VzIFJlZmVyZW5jZSBpbiB0aGUgWE1MIHNpZ25hdHVyZS4NCis8L0Fub255bW91cz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2FtcGxlcy9zYW1wbGVUZXh0RGF0YS50eHQgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2FtcGxlcy9zYW1wbGVUZXh0RGF0YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwNzRmZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9zYW1wbGVzL3NhbXBsZVRleHREYXRhLnR4dApAQCAtMCwwICsxIEBACitTb21lIHRleHQgZnJvbSBJQUlLIGluIGEgZmlsZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2FtcGxlcy9zYW1wbGVYTUxEYXRhLnhtbCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9zYW1wbGVzL3NhbXBsZVhNTERhdGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDlkZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2FtcGxlcy9zYW1wbGVYTUxEYXRhLnhtbApAQCAtMCwwICsxLDE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KKw0KKzwhRE9DVFlQRSBTYW1wbGUNCisgIFsNCisgICAgPCFFTEVNRU5UIFNhbXBsZSAoRGF0YUl0ZW0pID4NCisgICAgPCFFTEVNRU5UIERhdGFJdGVtICgjUENEQVRBKSA+DQorICAgIDwhQVRUTElTVCBEYXRhSXRlbSBJZCBJRCAjSU1QTElFRD4NCisgIF0NCis+DQorDQorPFNhbXBsZSB4bWxucz0iaHR0cDovL2lhaWsuYXQjU2FtcGxlIj4NCisgIDxEYXRhSXRlbSBJZD0iRGF0YUl0ZW0iPg0KKyAgICBTb21lIERhdGEgZnJvbSBJQUlLDQorICA8L0RhdGFJdGVtPg0KKzwvU2FtcGxlPg0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9zaWduYXR1cmVzL2Fub255bW91c1JlZmVyZW5jZVNpZ25hdHVyZS54bWwgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2lnbmF0dXJlcy9hbm9ueW1vdXNSZWZlcmVuY2VTaWduYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NGQ2MzYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2lnbmF0dXJlcy9hbm9ueW1vdXNSZWZlcmVuY2VTaWduYXR1cmUueG1sCkBAIC0wLDAgKzEsNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxkc2lnOlNpZ25hdHVyZSB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHNpZzpTaWduZWRJbmZvPjxkc2lnOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIvPjxkc2lnOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPjxkc2lnOlJlZmVyZW5jZT48ZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1Ii8+PC9kc2lnOlRyYW5zZm9ybXM+PGRzaWc6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHNpZzpEaWdlc3RWYWx1ZT43SGZwM3lUZEtLQnYwZDdNMG96TnhDdTdWOTg9PC9kc2lnOkRpZ2VzdFZhbHVlPjwvZHNpZzpSZWZlcmVuY2U+PC9kc2lnOlNpZ25lZEluZm8+PGRzaWc6U2lnbmF0dXJlVmFsdWU+bVUrOC9qN3ZGSkdYRzZYdy9WZ1ZSSWNSUU5sNUx0b0hWNmxITlBxckhYRjZTWk5ReHplNmxYdkl2L01JTm5Baworb1p2Vld6NHNNWW9kZFA2d1hhZVFKd0RQanpPMUVRTmUyVW43M0ovbmptelpEZklKcVNhaDFTRyt6U3RlTVI2bQorSjY4bkt6bmJSVGR4bk9rbkJvK3JaaXJYaUFzUGd1ZFJSNk5VeVhuK0Q4QT08L2RzaWc6U2lnbmF0dXJlVmFsdWU+PGRzaWc6S2V5SW5mbz48ZHNpZzpLZXlWYWx1ZT48ZHNpZzpSU0FLZXlWYWx1ZT48ZHNpZzpNb2R1bHVzPnNEYTV5elV2NElKbUJZNjBHWkNua1FTQWhwRzd0Z3hlcGk2c2ozRGxDenhqVHRPNU1OcmpJOXNLM1doaW1wTmkKK05EbWFnek5FanhQMyt4MWh1eEwxOUdvSXhaZ3I1TzdFL0YySUluU0FTVlpUUXN2V1psTmF1aFJzMEtaQXN6SVMKK0ZjaHZyaWhJTExvVWY0dHphT1NlNmpnTUVxNklrTzBkV1ZwY0ZwQWpYVGM9PC9kc2lnOk1vZHVsdXM+PGRzaWc6RXhwb25lbnQ+QXc9PTwvZHNpZzpFeHBvbmVudD48L2RzaWc6UlNBS2V5VmFsdWU+PC9kc2lnOktleVZhbHVlPjwvZHNpZzpLZXlJbmZvPjwvZHNpZzpTaWduYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL3NpZ25hdHVyZXMvbWFuaWZlc3RTaWduYXR1cmUueG1sIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvY29yZUZlYXR1cmVzL3NpZ25hdHVyZXMvbWFuaWZlc3RTaWduYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxNmFlMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2lnbmF0dXJlcy9tYW5pZmVzdFNpZ25hdHVyZS54bWwKQEAgLTAsMCArMSwxMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhRE9DVFlQRSBFbnZlbG9wZSBbCisgICAgPCFBVFRMSVNUIERhdGFJdGVtIElkIElEICNJTVBMSUVEPgorICBdPgorPEVudmVsb3BlIHhtbG5zPSJodHRwOi8vaWFpay5hdCNFbnZlbG9wZSI+CisgIDxkc2lnOlNpZ25hdHVyZSB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHNpZzpTaWduZWRJbmZvPjxkc2lnOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIvPjxkc2lnOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIvPjxkc2lnOlJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjTWFuaWZlc3QiIFVSST0iI21hbmlmZXN0Ij48ZHNpZzpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkc2lnOkRpZ2VzdFZhbHVlPjFrRjVhVWVSVGk5SnVsMlF6M0RtYlowT2Q3ST08L2RzaWc6RGlnZXN0VmFsdWU+PC9kc2lnOlJlZmVyZW5jZT48L2RzaWc6U2lnbmVkSW5mbz48ZHNpZzpTaWduYXR1cmVWYWx1ZT5NMmJGOHcxSVF2ZEVlZFE2U0I5dzh6YVdjK0tETmlnb3lzQnZpTnBpZkI2aHR5bVBob1crMU5CYm95Z2ZrbUF5Cis4R1NzT2htUTdnYnBIb2xqam0yUVBtWm1vOEJJdDdaR3k3aXpod3cxV1ppSVF4bXFjeklFYWlQZUJjc2dzeERXCitTZk9oN0V2OVlYRmZMRjRVeEo1OWRmVFIzWlRiOUNWekdmNkNTRzR4WEprPTwvZHNpZzpTaWduYXR1cmVWYWx1ZT48ZHNpZzpLZXlJbmZvPjxkc2lnOktleVZhbHVlPjxkc2lnOlJTQUtleVZhbHVlPjxkc2lnOk1vZHVsdXM+c0RhNXl6VXY0SUptQlk2MEdaQ25rUVNBaHBHN3RneGVwaTZzajNEbEN6eGpUdE81TU5yakk5c0szV2hpbXBOaQorTkRtYWd6TkVqeFAzK3gxaHV4TDE5R29JeFpncjVPN0UvRjJJSW5TQVNWWlRRc3ZXWmxOYXVoUnMwS1pBc3pJUworRmNodnJpaElMTG9VZjR0emFPU2U2amdNRXE2SWtPMGRXVnBjRnBBalhUYz08L2RzaWc6TW9kdWx1cz48ZHNpZzpFeHBvbmVudD5Bdz09PC9kc2lnOkV4cG9uZW50PjwvZHNpZzpSU0FLZXlWYWx1ZT48L2RzaWc6S2V5VmFsdWU+PC9kc2lnOktleUluZm8+PGRzaWc6T2JqZWN0Pjxkc2lnOk1hbmlmZXN0IElkPSJtYW5pZmVzdCI+PGRzaWc6UmVmZXJlbmNlIFVSST0iLi4vc2FtcGxlcy9zYW1wbGVYTUxEYXRhLnhtbCI+PGRzaWc6VHJhbnNmb3Jtcz48ZHNpZzpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIvPjwvZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+VVhjcTJPT0grYU1sYTRmYjVVT25ZdWFZOXVRPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjwvZHNpZzpNYW5pZmVzdD48L2RzaWc6T2JqZWN0PjwvZHNpZzpTaWduYXR1cmU+PERhdGFJdGVtIElkPSJEYXRhSXRlbSI+CisgICAgU29tZSBEYXRhIGZyb20gSUFJSworICA8L0RhdGFJdGVtPgorPC9FbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2lnbmF0dXJlcy9zaWduYXR1cmVUeXBlc1NpZ25hdHVyZS54bWwgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9jb3JlRmVhdHVyZXMvc2lnbmF0dXJlcy9zaWduYXR1cmVUeXBlc1NpZ25hdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRkMTVhNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL2NvcmVGZWF0dXJlcy9zaWduYXR1cmVzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLnhtbApAQCAtMCwwICsxLDEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIEVudmVsb3BlIFsKKyAgICA8IUFUVExJU1QgRGF0YUl0ZW0gSWQgSUQgI0lNUExJRUQ+CisgIF0+Cis8RW52ZWxvcGUgeG1sbnM9Imh0dHA6Ly9pYWlrLmF0I0VudmVsb3BlIj4KKyAgPGRzaWc6U2lnbmF0dXJlIHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxkc2lnOlNpZ25lZEluZm8+PGRzaWc6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1Ii8+PGRzaWc6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+PGRzaWc6UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2Ij48ZHNpZzpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkc2lnOkRpZ2VzdFZhbHVlPk4yc2pac0tyMlcxa3c2VVA3bWNXd3J6N1Q1ST08L2RzaWc6RGlnZXN0VmFsdWU+PC9kc2lnOlJlZmVyZW5jZT48ZHNpZzpSZWZlcmVuY2UgVVJJPSIuLi9zYW1wbGVzL3NhbXBsZVRleHREYXRhLnR4dCI+PGRzaWc6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHNpZzpEaWdlc3RWYWx1ZT5WeUdCRWFrVWpsT3VLVDRXQkkrdERtMHRZZTA9PC9kc2lnOkRpZ2VzdFZhbHVlPjwvZHNpZzpSZWZlcmVuY2U+PGRzaWc6UmVmZXJlbmNlIFVSST0iIj48ZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhwYXRoLTE5OTkxMTE2Ij48ZHNpZzpYUGF0aCB4bWxuczppYWlrPSJodHRwOi8vaWFpay5hdCNFbnZlbG9wZSI+YW5jZXN0b3Itb3Itc2VsZjo6aWFpazpEYXRhSXRlbTwvZHNpZzpYUGF0aD48L2RzaWc6VHJhbnNmb3JtPjwvZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+OXlNRkx0a3dpVFZMdlFhQ096RTYrbzRIclFFPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjxkc2lnOlJlZmVyZW5jZSBVUkk9Ii4uL3NhbXBsZXMvc2FtcGxlWE1MRGF0YS54bWwiPjxkc2lnOlRyYW5zZm9ybXM+PGRzaWc6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHBhdGgtMTk5OTExMTYiPjxkc2lnOlhQYXRoIHhtbG5zOmlhaWs9Imh0dHA6Ly9pYWlrLmF0I1NhbXBsZSI+YW5jZXN0b3Itb3Itc2VsZjo6aWFpazpEYXRhSXRlbTwvZHNpZzpYUGF0aD48L2RzaWc6VHJhbnNmb3JtPjwvZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+UmRlTmMrTWZaZVk4dXFTTHE4QXRRNkRCeWdzPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjxkc2lnOlJlZmVyZW5jZSBVUkk9IiNvYmplY3RJZCI+PGRzaWc6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHNpZzpEaWdlc3RWYWx1ZT4zeDh0SHRJeVZvYlpNUTdab0JJSHlpRlU3Rms9PC9kc2lnOkRpZ2VzdFZhbHVlPjwvZHNpZzpSZWZlcmVuY2U+PGRzaWc6UmVmZXJlbmNlIFVSST0iIj48ZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhwYXRoLTE5OTkxMTE2Ij48ZHNpZzpYUGF0aCB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj5hbmNlc3Rvci1vci1zZWxmOjpkc2lnOk9iamVjdDwvZHNpZzpYUGF0aD48L2RzaWc6VHJhbnNmb3JtPjwvZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+M3g4dEh0SXlWb2JaTVE3Wm9CSUh5aUZVN0ZrPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjxkc2lnOlJlZmVyZW5jZSBVUkk9IiI+PGRzaWc6VHJhbnNmb3Jtcz48ZHNpZzpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIvPjwvZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+S1F1b1pzZWliWTNiSXVyVUZieVloTENtOW5ZPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjwvZHNpZzpTaWduZWRJbmZvPjxkc2lnOlNpZ25hdHVyZVZhbHVlPmdDQXAwd3QrWklHMytHbVpBN0tLWGZDQTVkNVFiaTdHWTVCaE1weFZBMkJ4bVZlOU00dm1DMmgraGNCekNSbUgKK3dqQXVhSWtQWXhQQ2FpRC9TU2E0aTI3dWZNTkpiYnhNaThBR1dQUlJ0Z2ZPRysvS1FacnJ2VVF0cG54UzNjMTYKKzgxQ2xjaXZsVEExd0tWTTd4S0pPbjhsaS84SWxkSk5tMVpnTjhKUVM4c2s9PC9kc2lnOlNpZ25hdHVyZVZhbHVlPjxkc2lnOktleUluZm8+PGRzaWc6S2V5VmFsdWU+PGRzaWc6UlNBS2V5VmFsdWU+PGRzaWc6TW9kdWx1cz5zRGE1eXpVdjRJSm1CWTYwR1pDbmtRU0FocEc3dGd4ZXBpNnNqM0RsQ3p4alR0TzVNTnJqSTlzSzNXaGltcE5pCitORG1hZ3pORWp4UDMreDFodXhMMTlHb0l4WmdyNU83RS9GMklJblNBU1ZaVFFzdldabE5hdWhSczBLWkFzeklTCitGY2h2cmloSUxMb1VmNHR6YU9TZTZqZ01FcTZJa08wZFdWcGNGcEFqWFRjPTwvZHNpZzpNb2R1bHVzPjxkc2lnOkV4cG9uZW50PkF3PT08L2RzaWc6RXhwb25lbnQ+PC9kc2lnOlJTQUtleVZhbHVlPjwvZHNpZzpLZXlWYWx1ZT48L2RzaWc6S2V5SW5mbz48ZHNpZzpPYmplY3QgSWQ9Im9iamVjdElkIj5BIHRleHQgZnJvbSBJQUlLPC9kc2lnOk9iamVjdD48L2RzaWc6U2lnbmF0dXJlPjxEYXRhSXRlbSBJZD0iRGF0YUl0ZW0iPgorICAgIFNvbWUgRGF0YSBmcm9tIElBSUsKKyAgPC9EYXRhSXRlbT4KKzwvRW52ZWxvcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvcmVhZG1lLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3JlYWRtZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0ZmVhNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3JlYWRtZS50eHQKQEAgLTAsMCArMSwyMDEgQEAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitUaGlzIGZpbGUgY29udGFpbnMgYSBkZXNjcmlwdGlvbiBvZiBzYW1wbGUgc2lnYW50dXJlcyBwcm9kdWNlZAord2l0aCB0aGUgSUFJSyBTaWduYXR1cmUgTGlicmFyeSAoSVhTSUwpLgorCitBdXRob3I6IEdyZWdvciBLYXJsaW5nZXIKK0RhdGU6IDE1LiAxMS4gMjAwMQorSVhTSUwgQnVpbGQ6IDEwMTAKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKK3NpZ25hdHVyZUFsZ29yaXRobXMvZFNBU2lnbmF0dXJlLnhtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgU2ltcGxlIHNpZ25hdHVyZSB1c2luZyBEU0EgYXMgc2lnbmF0dXJlIGFsZ29yaXRobS4KKyAgRFNBIHB1YmxpYyBrZXkgaXMgZW5jb2RlZCBhcyBLZXlWYWx1ZS4KKyAgCisgIFRoZSBpbnB1dCB1c2VkIGZvciB0aGUgZGlnZXN0IGNvbXB1dGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBmaWxlCisgICIuLi9kaWdlc3RJbnB1dHMvZFNBU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCIuCisgIAorc2lnbmF0dXJlQWxnb3JpdGhtcy9yU0FTaWduYXR1cmUueG1sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBTaW1wbGUgc2lnbmF0dXJlIHVzaW5nIFJTQSBhcyBzaWduYXR1cmUgYWxnb3JpdGhtLgorICBSU0EgcHVibGljIGtleSBpcyBlbmNvZGVkIGFzIEtleVZhbHVlLgorCisgIFRoZSBpbnB1dCB1c2VkIGZvciB0aGUgZGlnZXN0IGNvbXB1dGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBmaWxlCisgICIuLi9kaWdlc3RJbnB1dHMvclNBU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCIuCisgIAorc2lnbmF0dXJlQWxnb3JpdGhtcy9oTUFDU2lnbmF0dXJlLnhtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNpbXBsZSBzaWduYXR1cmUgdXNpbmcgSE1BQyBhcyBhdXRoZW50aWNhdGlvbiBhbGdvcml0aG0uCisgIFRoZSBzZWNyZXQga2V5IGlzICJzZWNyZXQiLmdldEJ5dGVzKCJBU0NJSSIpLgorICAKKyAgVGhlIGlucHV0IHVzZWQgZm9yIHRoZSBkaWdlc3QgY29tcHV0YXRpb24gY2FuIGJlIGZvdW5kIGluIGZpbGUKKyAgIi4uL2RpZ2VzdElucHV0cy9oTUFDU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCIuCisKK3NpZ25hdHVyZUFsZ29yaXRobXMvaE1BQ1Nob3J0U2lnbmF0dXJlLnhtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgU2ltcGxlIHNpZ25hdHVyZSB1c2luZyBITUFDIGFzIGF1dGhlbnRpY2F0aW9uIGFsZ29yaXRobS4KKyAgSE1BQyBvdXRwdXQgbGVuZ3RoIGlzIGxpbWl0ZWQgdG8gNDAgYml0cy4KKyAgVGhlIHNlY3JldCBrZXkgaXMgInNlY3JldCIuZ2V0Qnl0ZXMoIkFTQ0lJIikuCisgIAorICBUaGUgaW5wdXQgdXNlZCBmb3IgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBjYW4gYmUgZm91bmQgaW4gZmlsZQorICAiLi4vZGlnZXN0SW5wdXRzL2hNQUNTaG9ydFNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQiLgorCitjb3JlRmVhdHVyZXMvc2lnbmF0dXJlVHlwZXNTaWduYXR1cmUueG1sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgU2lnbmF0dXJlIGNvbnRhaW5pbmcgc2V2ZXJhbCBSZWZlcmVuY2VzIHRvIGRlbW9uc3RyYXRlCisgIElYU0lMJ3MgYWJpbGl0eSB0byB3b3JrIHdpdGggZW52ZWxvcGluZywgZW52ZWxvcGVkIGFuZAorICBkZXRhY2hlZCBzaWduYXR1cmVzLgorICAKKyAgKiBUaGUgZmlyc3QgUmVmZXJlbmNlIHJlZmVycyB0byBhbiBleHRlcm5hbCBzb3VyY2UgCisgICAgKGh0dHApIC0gZGV0YWNoZWQgc2lnbmF0dXJlLgorICAKKyAgKiBUaGUgc2Vjb25kIFJlZmVyZW5jZSByZWZlcnMgdG8gYW4gZXh0ZXJuYWwgc291cmNlCisgICAgKGZpbGUgc3lzdGVtKSAtIGRldGFjaGVkIHNpZ25hdHVyZS4gVGhlIGV4dGVybmFsIGZpbGUKKyAgICBpcyAiLi4vc2FtcGxlcy9zYW1wbGVUZXh0RGF0YS50eHQiCisgICAgCisgICogVGhlIHRoaXJkIFJlZmVyZW5jZSByZWZlcnMgdG8gWE1MIGRhdGEgdGhhdCBpcyBhIAorICAgIHNpYmxpbmcgb2YgdGhlIFhNTCBTaWduYXR1cmUsIGJ1dCB3aXRoaW4gdGhlIHNhbWUKKyAgICBkb2N1bWVudCAtIGRldGFjaGVkIHNpZ25hdHVyZQorICAgIAorICAgIFRoZSBpbnB1dCB1c2VkIGZvciB0aGUgZGlnZXN0IGNvbXB1dGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBmaWxlCisgICAgIi4uL2RpZ2VzdElucHV0cy9zaWduYXR1cmVUeXBlc1NpZ25hdHVyZS50aGlyZFJlZmVyZW5jZS50eHQiLgorICAgIAorICAqIFRoZSBmb3VydGggUmVmZXJlbmNlIHJlZmVycyB0byBhbiBleHRlcm5hbCBYTUwgZmlsZQorICAgIGFuZCB1c2VzIGFuIFhQYXRoIHRyYW5zZm9ybSB0byBzZWxlY3QgcGFydHMgb2YgdGhlCisgICAgZG9jdW1lbnQgZm9yIHNpZ25pbmcgLSBkZXRhY2hlZCBzaWduYXR1cmUuIFRoZSBleHRlcm5hbAorICAgIGZpbGUgaXMgIi4uL3NhbXBsZXMvc2FtcGxlWE1MRGF0YS54bWwiCisgICAgCisgICAgVGhlIGlucHV0IHVzZWQgZm9yIHRoZSBkaWdlc3QgY29tcHV0YXRpb24gY2FuIGJlIGZvdW5kIGluIGZpbGUKKyAgICAiLi4vZGlnZXN0SW5wdXRzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLmZvdXJ0aFJlZmVyZW5jZS50eHQiLgorICAgIAorICAqIFRoZSBmaWZ0aCBSZWZlcmVuY2UgcmVmZXJzIHRvIGRhdGEgaW4gYW4gT2JqZWN0IG9mIHRoZQorICAgIHNpZ25hdHVyZSB2aWEgYW4gSUQgcmVmZXJlbmNlIC0gZW52ZWxvcGluZyBzaWduYXR1cmUuCisgICAgCisgICAgVGhlIGlucHV0IHVzZWQgZm9yIHRoZSBkaWdlc3QgY29tcHV0YXRpb24gY2FuIGJlIGZvdW5kIGluIGZpbGUKKyAgICAiLi4vZGlnZXN0SW5wdXRzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLmZpZnRoUmVmZXJlbmNlLnR4dCIuCisgICAgCisgICogVGhlIHNpeHRoIFJlZmVyZW5jZSByZWZlcnMgdG8gZGF0YSBpbiBhbiBPYmplY3Qgb2YgdGhlCisgICAgc2lnbmF0dXJlIHZpYSBhbiBlbXB0eSBVUkkgKFVSST0iIikgYW5kIHVzaW5nIGFuIFhQYXRoCisgICAgdHJhbnNmb3JtIHRvIHNlbGVjdCB0aGUgZGF0YSBmb3Igc2lnbmluZyAtIGVudmVsb3BpbmcKKyAgICBzaWduYXR1cmUuCisgICAgCisgICAgVGhlIGlucHV0IHVzZWQgZm9yIHRoZSBkaWdlc3QgY29tcHV0YXRpb24gY2FuIGJlIGZvdW5kIGluIGZpbGUKKyAgICAiLi4vZGlnZXN0SW5wdXRzL3NpZ25hdHVyZVR5cGVzU2lnbmF0dXJlLnNpeHRoUmVmZXJlbmNlLnR4dCIuCisgICAgCisgICogVGhlIHNldmVudGggUmVmZXJlbmNlIHJlZmVycyB0byB0aGUgc2lnbmF0dXJlIGRvY3VtZW50CisgICAgaXRzZWxmIChVUkk9IiIpIGFuZCB1c2VzIGFuIGVudmVsb3BlZCBzaWduYXR1cmUKKyAgICB0cmFuc2Zvcm0gLSBlbnZlbG9wZWQgc2lnbmF0dXJlCisgIAorICAgIFRoZSBpbnB1dCB1c2VkIGZvciB0aGUgZGlnZXN0IGNvbXB1dGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBmaWxlCisgICAgIi4uL2RpZ2VzdElucHV0cy9zaWduYXR1cmVUeXBlc1NpZ25hdHVyZS5zZXZlbnRoUmVmZXJlbmNlLnR4dCIuCisgICAgCitjb3JlRmVhdHVyZXMvbWFuaWZlc3RTaWduYXR1cmUueG1sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgU2lnbmF0dXJlIGNvbnRhaW5pbmcgYSBSZWZlcmVuY2UgdG8gYSBNYW5pZmVzdCBlbGVtZW50IHRoYXQKKyAgaXMgc3RvcmVkIGluIGFuIE9iamVjdCBjb250YWluZXIgd2l0aGluIHRoZSBTaWduYXR1cmUuCisgIAorICBUaGUgaW5wdXQgdXNlZCBmb3IgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBjYW4gYmUgZm91bmQgaW4gZmlsZQorICAiLi4vZGlnZXN0SW5wdXRzL21hbmlmZXN0U2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCIuCisKKyAgKiBUaGUgZmlyc3QgUmVmZXJlbmNlIGluIHRoZSBNYW5pZmVzdCByZWZlcnMgdG8gdGhlIHdob2xlCisgICAgc2lnbmF0dXJlIGRvY3VtZW50IGFuZCB1c2VzIGFuIGVudmVsb3BlZCBzaWduYXR1cmUgdHJhbnMtCisgICAgZm9ybSB0byBjdXQgb3V0IHRoZSBTaWduYXR1cmUgZWxlbWVudC4KKyAgICAKKyAgICBUaGUgaW5wdXQgdXNlZCBmb3IgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBjYW4gYmUgZm91bmQgaW4gZmlsZQorICAgICIuLi9kaWdlc3RJbnB1dHMvbWFuaWZlc3RTaWduYXR1cmUubWFuaWZlc3QuZmlyc3RSZWZlcmVuY2UudHh0Ii4KKworICAqIFRoZSBzZWNvbmQgUmVmZXJlbmNlIGluIHRoZSBNYW5pZmVzdCByZWZlcnMgYW4gZXh0ZXJuYWwKKyAgICByZXNvdXJjZSAoZmlsZSBzeXN0ZW0pLiBUaGUgZXh0ZXJuYWwgZmlsZSBpcworICAgICIuLi9zYW1wbGVzL3NhbXBsZVhNTERhdGEueG1sIi4KKyAgICAKKyAgICBUaGUgaW5wdXQgdXNlZCBmb3IgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBjYW4gYmUgZm91bmQgaW4gZmlsZQorICAgICIuLi9kaWdlc3RJbnB1dHMvbWFuaWZlc3RTaWduYXR1cmUubWFuaWZlc3Quc2Vjb25kUmVmZXJlbmNlLnR4dCIuCisKK2NvcmVGZWF0dXJlcy9hbm9ueW1vdXNSZWZlcmVuY2VTaWduYXR1cmUueG1sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNpZ25hdHVyZSBjb250YWluaW5nIGFuIGFub255bW91cyBSZWZlcmVuY2UsIGkuZS4gdGhlIFVSSQorICBhdHRyaWJ1dGUgb2YgdGhlIFJlZmVyZW5jZSBpcyBtaXNzaW5nLiBJbiBzdWNoIGEgY2FzZSwgdGhlCisgIGFwcGxpY2F0aW9uIG11c3QgcHJvdmlkZSB0aGUgaGludCB3aGVyZSB0byBmaW5kIHRoZSBjb3JyZXMtCisgIHBvbmRpbmcgZGF0YS4gSW4gdGhpcyBjYXNlLCB0aGUgZGF0YSBjYW4gYmUgZm91bmQgaW4gZmlsZQorICAiLi4vc2FtcGxlcy9hbm9ueW1vdXNSZWZlcmVuY2VDb250ZW50LnhtbCIuCisgIAorICBUaGUgaW5wdXQgdXNlZCBmb3IgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBjYW4gYmUgZm91bmQgaW4gZmlsZQorICAiLi4vZGlnZXN0SW5wdXRzL2Fub255bW91c1JlZmVyZW5jZVNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQiLgorCit0cmFuc2Zvcm1zL2Jhc2U2NERlY29kZVNpZ25hdHVyZS54bWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNpZ25hdHVyZSBjb250YWluaW5nIGEgUmVmZXJlbmNlIHRvIGEgYmFzZTY0IGVuY29kZWQgZmlsZS4KKyAgVGhlIFJlZmVyZW5jZSBjb250YWlucyBhIEJhc2U2NCB0cmFuc2Zvcm0sIGkuZS4gdGhlIGZpbGUKKyAgd2lsbCBiZSBkZWNvZGVkIHByaW9yIHRvIGRpZ2VzdCBjb21wdXRhdGlvbi4gVGhlIGVuY29kZWQKKyAgZmlsZSBpcyAiLi4vc2FtcGxlcy9zYW1wbGVCYXNlNjRFbmNvZGVkRGF0YS50eHQiLgorICAKKyAgVGhlIGlucHV0IHVzZWQgZm9yIHRoZSBkaWdlc3QgY29tcHV0YXRpb24gY2FuIGJlIGZvdW5kIGluIGZpbGUKKyAgIi4uL2RpZ2VzdElucHV0cy9iYXNlNjRTaWduYXR1cmUuZmlyc3RSZWZlcmVuY2UudHh0Ii4KKwordHJhbnNmb3Jtcy9jMTRuU2lnbmF0dXJlLnhtbAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNpZ25hdHVyZSBjb250YWluaW5nIHR3byBSZWZlcmVuY2VzIHRvIGFuIFhNTCBmaWxlLiBUaGUgCisgIFhNTCBmaWxlIGlzICIuLi9zYW1wbGVzL3NhbXBsZVhNTERhdGEueG1sIi4KKyAgCisgICogVGhlIGZpcnN0IFJlZmVyZW5jZSBjb250YWlucyBhIGNhbm9uaWNhbCBYTUwgdHJhbnNmb3JtLAorICAgIHRoYXQgaXMsIGNvbW1lbnRzIGluIHRoZSBYTUwgZmlsZSB3aWxsIGJlIHJlbW92ZWQgYXQKKyAgICB0cmFuc2Zvcm1hdGlvbi4KKyAgICAKKyAgICBUaGUgaW5wdXQgdXNlZCBmb3IgdGhlIGRpZ2VzdCBjb21wdXRhdGlvbiBjYW4gYmUgZm91bmQgaW4gZmlsZQorICAgICIuLi9kaWdlc3RJbnB1dHMvYzE0blNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQiLgorCisgICogVGhlIHNlY29uZCBSZWZlcmVuY2UgY29udGFpbnMgYSBjYW5vbmljYWwgWE1MIHRyYW5zZm9ybQorICAgIHdpdGggY29tbWVudHMsIHRoYXQgaXMsIGNvbW1lbnRzIGluIHRoZSBYTUwgZmlsZSB3aWxsIGJlCisgICAgcHJlc2VydmVkIGF0IHRyYW5zZm9ybWF0aW9uLgorICAgIAorICAgIFRoZSBpbnB1dCB1c2VkIGZvciB0aGUgZGlnZXN0IGNvbXB1dGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBmaWxlCisgICAgIi4uL2RpZ2VzdElucHV0cy9jMTRuU2lnbmF0dXJlLnNlY29uZFJlZmVyZW5jZS50eHQiLgorCit0cmFuc2Zvcm1zL2VudmVsb3BlZFNpZ25hdHVyZVNpZ25hdHVyZS54bWwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNpZ25hdHVyZSBjb250YWluaW5nIGEgc2luZ2xlIFJlZmVyZW5jZSB0byB0aGUgc2lnbmF0dXJlIAorICBmaWxlIGl0c2VsZiAoVVJJPSIiKS4gVGhlIFJlZmVyZW5jZSBjb250YWlucyBhbiBlbnZlbG9wZWQKKyAgc2lnbmF0dXJlIHRyYW5zZm9ybSB0byBjdXQgb3V0IHRoZSBTaWduYXR1cmUgc3RydWN0dXJlCisgIGZyb20gdGhlIFhNTC4KKyAgCisgIFRoZSBpbnB1dCB1c2VkIGZvciB0aGUgZGlnZXN0IGNvbXB1dGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBmaWxlCisgICIuLi9kaWdlc3RJbnB1dHMvZW52ZWxvcGVkU2lnbmF0dXJlU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCIuCisKK3RyYW5zZm9ybXMveFBhdGhTaWduYXR1cmUueG1sCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIFNpZ25hdHVyZSBjb250YWluaW5nIHRocmVlIGludGVybmFsIFJlZmVyZW5jZXMgdG8gZGVtb25zdHJhdGUKKyAgZG9jdW1lbnQgc3Vic2V0IHNlbGVjdGlvbi4KKyAgCisgICogVGhlIGZpcnN0IFJlZmVyZW5jZSBjb250YWlucyBhIHJlZmVyZW5jZS1vbmx5IFVSSSAoIiNvYmplY3RJZCIpLgorICAgIFRoaXMgbWVhbnMgdGhhdCB0aGUgWE1MIGVsZW1lbnQgd2l0aCBpdHMgSUQgYXR0cmlidXRlIHNldCB0byB0aGUKKyAgICB2YWx1ZSAib2JqZWN0SWQiIGlzIHNlbGVjdGVkOyBjb21tZW50cyB3aWxsIGJlIHN1cHByZXNzZWQuCisgICAgRmluYWxseSBhIGNhbm9uaWNhbCBYTUwgdHJhbnNmcm9tIHdpbGwgYmUgcGVyZm9ybWVkIHByaW9yIHRvCisgICAgZGlnZXN0IGNvbXB1dGF0aW9uLgorICAgIAorICAgIFRoZSBpbnB1dCB1c2VkIGZvciB0aGUgZGlnZXN0IGNvbXB1dGF0aW9uIGNhbiBiZSBmb3VuZCBpbiBmaWxlCisgICAgIi4uL2RpZ2VzdElucHV0cy94UGF0aFNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQiLgorCisgICogVGhlIHNlY29uZCBSZWZlcmVuY2UgYWxzbyBjb250YWlucyBhIHJlZmVyZW5jZS1vbmx5IFVSSSAKKyAgICAoIiN4cG9pbnRlcihpZCgnb2JqZWN0SWQnKSkiKS4gVGhpcyBhbHNvIG1lYW5zIHRoYXQgdGhlIFhNTCAKKyAgICBlbGVtZW50IHdpdGggaXRzIElEIGF0dHJpYnV0ZSBzZXQgdG8gdGhlIHZhbHVlICJvYmplY3RJZCIKKyAgICBpcyBzZWxlY3RlZDsgYnV0IGNvbnRyYXJ5IHRvIHRoZSBmaXJzdCBSZWZlcmVuY2UsIHRoaXMgdGltZQorICAgIGNvbW1lbnRzIGFyZSBwcmVzZXJ2ZWQuIEZpbmFsbHkgYSBjYW5vbmljYWwgWE1MIHRyYW5zZnJvbQorICAgIChwcmVzZXJ2aW5nIGNvbW1lbnRzIG9wdGlvbiBjaG9zZW4pIHdpbGwgYmUgcGVyZm9ybWVkIHByaW9yIHRvCisgICAgZGlnZXN0IGNvbXB1dGF0aW9uLgorCisgICAgVGhlIGlucHV0IHVzZWQgZm9yIHRoZSBkaWdlc3QgY29tcHV0YXRpb24gY2FuIGJlIGZvdW5kIGluIGZpbGUKKyAgICAiLi4vZGlnZXN0SW5wdXRzL3hQYXRoU2lnbmF0dXJlLnNlY29uZFJlZmVyZW5jZS50eHQiLgorCisgICAgCisgICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvc2lnbmF0dXJlQWxnb3JpdGhtcy9kaWdlc3RJbnB1dHMvZFNBU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvZGlnZXN0SW5wdXRzL2RTQVNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4OWYzMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvZGlnZXN0SW5wdXRzL2RTQVNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSBAQAorPGRzaWc6T2JqZWN0IHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIElkPSJvYmplY3QiPlNvbWUgdGV4dCBmcm9tIElBSUs8L2RzaWc6T2JqZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvZGlnZXN0SW5wdXRzL2hNQUNTaG9ydFNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL2RpZ2VzdElucHV0cy9oTUFDU2hvcnRTaWduYXR1cmUuZmlyc3RSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODlmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL2RpZ2VzdElucHV0cy9oTUFDU2hvcnRTaWduYXR1cmUuZmlyc3RSZWZlcmVuY2UudHh0CkBAIC0wLDAgKzEgQEAKKzxkc2lnOk9iamVjdCB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0ib2JqZWN0Ij5Tb21lIHRleHQgZnJvbSBJQUlLPC9kc2lnOk9iamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL2RpZ2VzdElucHV0cy9oTUFDU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvZGlnZXN0SW5wdXRzL2hNQUNTaWduYXR1cmUuZmlyc3RSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwODlmMzIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL2RpZ2VzdElucHV0cy9oTUFDU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dApAQCAtMCwwICsxIEBACis8ZHNpZzpPYmplY3QgeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgSWQ9Im9iamVjdCI+U29tZSB0ZXh0IGZyb20gSUFJSzwvZHNpZzpPYmplY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvc2lnbmF0dXJlQWxnb3JpdGhtcy9kaWdlc3RJbnB1dHMvclNBU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvZGlnZXN0SW5wdXRzL3JTQVNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4OWYzMgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvZGlnZXN0SW5wdXRzL3JTQVNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSBAQAorPGRzaWc6T2JqZWN0IHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIElkPSJvYmplY3QiPlNvbWUgdGV4dCBmcm9tIElBSUs8L2RzaWc6T2JqZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvc2lnbmF0dXJlcy9kU0FTaWduYXR1cmUueG1sIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvc2lnbmF0dXJlQWxnb3JpdGhtcy9zaWduYXR1cmVzL2RTQVNpZ25hdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU1NTRjOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvc2lnbmF0dXJlcy9kU0FTaWduYXR1cmUueG1sCkBAIC0wLDAgKzEsOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxkc2lnOlNpZ25hdHVyZSB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48ZHNpZzpTaWduZWRJbmZvPjxkc2lnOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIvPjxkc2lnOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIvPjxkc2lnOlJlZmVyZW5jZSBVUkk9IiNvYmplY3QiPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+M1JHUWVINWVISytqSjJHeEdZUGh3bnpiQkJjPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjwvZHNpZzpTaWduZWRJbmZvPjxkc2lnOlNpZ25hdHVyZVZhbHVlPldyZlh1ZWVaUlRiZHB4ZTNTYW0rWURRV3Z4enJhZ2NNUkgwU2RpTCsxekZDUFFYbjNOZGFFQT09PC9kc2lnOlNpZ25hdHVyZVZhbHVlPjxkc2lnOktleUluZm8+PGRzaWc6S2V5VmFsdWU+PGRzaWc6RFNBS2V5VmFsdWU+PGRzaWc6UD5nbjNVbktJRmFZVHBnM0d4TkExZGNZT1NoYkpheXFPQzE2dzRicFJBaEQ4S1JucW9kYWpCeWp0d3VtcVhCeEwyCitzWm50UHV4VEUvT1VDbWU3MXA4NGNpbGhxd0k5RjZFelBGSWpYWiszMFE2VjQ2VmUrYkJQeDhrZ3hYTGFlc1BWCitEeVFOdTQ1VTJwNjdjQ0VSeFRXQzVUV0ZMcDlaT1htek1sRElob09XR1JjPTwvZHNpZzpQPjxkc2lnOlE+K2xCNTJ2by9PckhvQ20zMXZSYnlKTmo0MXhzPTwvZHNpZzpRPjxkc2lnOkc+VDczMUxqTUU4RkhCZktWY2s0RzF3WDFNSUZCMmhUUlF6OW44Y3JMaHNyRnZvQkJJdVA4WDU2a0s0ZUFZQlQ0MAorMmRWaDMzRk15TnlTc1ZHMTMyWlpjR3RlVjhNWm90WllPMzB5MHVuaDhXWStxcXhHRGMxT1ozQTI5L20rQ3k0Vworb0YxcFhWdUJFNmtEeXpoalZocTlOa3BkYkJWbUYvb1FveUNaNGRJMGR4TT08L2RzaWc6Rz48ZHNpZzpZPk1CVkhpYjdUMEpXOGlQYVpUKytSLzJ6dW9jNVNiYWxDYlRIakpETUxlL0dXTUt6R1M4cytGRUpsZFFtWkMxUisKK3I2aklmQVkrd2psM2srVVR4UlRDanF0TTM0d0VCTnZ2Z1ZIdDk1QU9nQnkvTWFtOVhLcXgvZFlMbEswakNrN1QKK28vcmZXdGpoRzJCYnNKZEk2cis2OFNNME9FQnFMNWJiWVJ4UkdlV2ovUDA9PC9kc2lnOlk+PC9kc2lnOkRTQUtleVZhbHVlPjwvZHNpZzpLZXlWYWx1ZT48L2RzaWc6S2V5SW5mbz48ZHNpZzpPYmplY3QgSWQ9Im9iamVjdCI+U29tZSB0ZXh0IGZyb20gSUFJSzwvZHNpZzpPYmplY3Q+PC9kc2lnOlNpZ25hdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL3NpZ25hdHVyZXMvaE1BQ1Nob3J0U2lnbmF0dXJlLnhtbCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvc2lnbmF0dXJlcy9oTUFDU2hvcnRTaWduYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTBiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL3NpZ25hdHVyZXMvaE1BQ1Nob3J0U2lnbmF0dXJlLnhtbApAQCAtMCwwICsxLDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZHNpZzpTaWduYXR1cmUgeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzaWc6U2lnbmVkSW5mbz48ZHNpZzpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiLz48ZHNpZzpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjaG1hYy1zaGExIj48ZHNpZzpITUFDT3V0cHV0TGVuZ3RoPjQwPC9kc2lnOkhNQUNPdXRwdXRMZW5ndGg+PC9kc2lnOlNpZ25hdHVyZU1ldGhvZD48ZHNpZzpSZWZlcmVuY2UgVVJJPSIjb2JqZWN0Ij48ZHNpZzpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkc2lnOkRpZ2VzdFZhbHVlPjNSR1FlSDVlSEsrakoyR3hHWVBod256YkJCYz08L2RzaWc6RGlnZXN0VmFsdWU+PC9kc2lnOlJlZmVyZW5jZT48L2RzaWc6U2lnbmVkSW5mbz48ZHNpZzpTaWduYXR1cmVWYWx1ZT5DeCtIVSs4PTwvZHNpZzpTaWduYXR1cmVWYWx1ZT48ZHNpZzpPYmplY3QgSWQ9Im9iamVjdCI+U29tZSB0ZXh0IGZyb20gSUFJSzwvZHNpZzpPYmplY3Q+PC9kc2lnOlNpZ25hdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL3NpZ25hdHVyZXMvaE1BQ1NpZ25hdHVyZS54bWwgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL3NpZ25hdHVyZXMvaE1BQ1NpZ25hdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlmNmJmYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvc2lnbmF0dXJlcy9oTUFDU2lnbmF0dXJlLnhtbApAQCAtMCwwICsxLDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZHNpZzpTaWduYXR1cmUgeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzaWc6U2lnbmVkSW5mbz48ZHNpZzpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiLz48ZHNpZzpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjaG1hYy1zaGExIj48ZHNpZzpITUFDT3V0cHV0TGVuZ3RoPjE2MDwvZHNpZzpITUFDT3V0cHV0TGVuZ3RoPjwvZHNpZzpTaWduYXR1cmVNZXRob2Q+PGRzaWc6UmVmZXJlbmNlIFVSST0iI29iamVjdCI+PGRzaWc6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHNpZzpEaWdlc3RWYWx1ZT4zUkdRZUg1ZUhLK2pKMkd4R1lQaHduemJCQmM9PC9kc2lnOkRpZ2VzdFZhbHVlPjwvZHNpZzpSZWZlcmVuY2U+PC9kc2lnOlNpZ25lZEluZm8+PGRzaWc6U2lnbmF0dXJlVmFsdWU+cjdVcGFGQk1LNXE3aTBIM3RvR3ZBZUZKTHMwPTwvZHNpZzpTaWduYXR1cmVWYWx1ZT48ZHNpZzpPYmplY3QgSWQ9Im9iamVjdCI+U29tZSB0ZXh0IGZyb20gSUFJSzwvZHNpZzpPYmplY3Q+PC9kc2lnOlNpZ25hdHVyZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL3NpZ25hdHVyZXMvclNBU2lnbmF0dXJlLnhtbCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3NpZ25hdHVyZUFsZ29yaXRobXMvc2lnbmF0dXJlcy9yU0FTaWduYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YzM4NGEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC9zaWduYXR1cmVBbGdvcml0aG1zL3NpZ25hdHVyZXMvclNBU2lnbmF0dXJlLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZHNpZzpTaWduYXR1cmUgeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzaWc6U2lnbmVkSW5mbz48ZHNpZzpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiLz48ZHNpZzpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz48ZHNpZzpSZWZlcmVuY2UgVVJJPSIjb2JqZWN0Ij48ZHNpZzpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkc2lnOkRpZ2VzdFZhbHVlPjNSR1FlSDVlSEsrakoyR3hHWVBod256YkJCYz08L2RzaWc6RGlnZXN0VmFsdWU+PC9kc2lnOlJlZmVyZW5jZT48L2RzaWc6U2lnbmVkSW5mbz48ZHNpZzpTaWduYXR1cmVWYWx1ZT5KYnJPaStuTVcySzNZeWNrT3BHcm1tM1VhRWZXQUxxMXR1TjVXSk8wMThnK1J3dGV1NXd0K1ZlbmkzeGpaVHc4Cis3NTVNOHZHbTdRU3huS1RNblRIcEgrZmdNRlBYcFAzQWNuQjhDUWd1MzFHVjRMK2hwc2xjcW5PZU1TUWovV2JkCitCWDhUZkIxTWNsOGVQOVA5U2dvbURSU0IrZ1dUYURuc0hMNnFkSzhsVW1FPTwvZHNpZzpTaWduYXR1cmVWYWx1ZT48ZHNpZzpLZXlJbmZvPjxkc2lnOktleVZhbHVlPjxkc2lnOlJTQUtleVZhbHVlPjxkc2lnOk1vZHVsdXM+c0RhNXl6VXY0SUptQlk2MEdaQ25rUVNBaHBHN3RneGVwaTZzajNEbEN6eGpUdE81TU5yakk5c0szV2hpbXBOaQorTkRtYWd6TkVqeFAzK3gxaHV4TDE5R29JeFpncjVPN0UvRjJJSW5TQVNWWlRRc3ZXWmxOYXVoUnMwS1pBc3pJUworRmNodnJpaElMTG9VZjR0emFPU2U2amdNRXE2SWtPMGRXVnBjRnBBalhUYz08L2RzaWc6TW9kdWx1cz48ZHNpZzpFeHBvbmVudD5Bdz09PC9kc2lnOkV4cG9uZW50PjwvZHNpZzpSU0FLZXlWYWx1ZT48L2RzaWc6S2V5VmFsdWU+PC9kc2lnOktleUluZm8+PGRzaWc6T2JqZWN0IElkPSJvYmplY3QiPlNvbWUgdGV4dCBmcm9tIElBSUs8L2RzaWc6T2JqZWN0PjwvZHNpZzpTaWduYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMvYmFzZTY0U2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvZGlnZXN0SW5wdXRzL2Jhc2U2NFNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2YzRkNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvZGlnZXN0SW5wdXRzL2Jhc2U2NFNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSwzNDEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+DQorPGh0bWw+DQorPGhlYWQ+DQorPHRpdGxlPkFzc29jaWF0aW5nIFN0eWxlIFNoZWV0cyB3aXRoIFhNTCBkb2N1bWVudHM8L3RpdGxlPg0KKzxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1N0eWxlU2hlZXRzL1RSL1czQy1SRUMiPg0KKzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Y29kZSB7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2UgfTwvc3R5bGU+DQorPC9oZWFkPg0KKzxib2R5Pg0KKzxkaXYgY2xhc3M9ImhlYWQiPg0KKzxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+PGltZyBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL1dXVy93M2NfaG9tZSIgYWx0PSJXM0MiIGhlaWdodD0iNDgiIHdpZHRoPSI3MiI+PC9hPg0KKzxoMT5Bc3NvY2lhdGluZyBTdHlsZSBTaGVldHMgd2l0aCBYTUwgZG9jdW1lbnRzPGJyPlZlcnNpb24gMS4wPC9oMT4NCis8aDI+VzNDIFJlY29tbWVuZGF0aW9uIDI5IEp1bmUgMTk5OTwvaDI+DQorPGRsPg0KKzxkdD5UaGlzIHZlcnNpb246PC9kdD4NCis8ZGQ+DQorPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wNi9SRUMteG1sLXN0eWxlc2hlZXQtMTk5OTA2MjkiPmh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDYvUkVDLXhtbC1zdHlsZXNoZWV0LTE5OTkwNjI5PC9hPg0KKzxicj4NCis8L2RkPg0KKzxkdD5MYXRlc3QgdmVyc2lvbjo8L2R0Pg0KKzxkZD4NCis8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+aHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQ8L2E+DQorPGJyPg0KKzwvZGQ+DQorPGR0PlByZXZpb3VzIHZlcnNpb246PC9kdD4NCis8ZGQ+DQorPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS94bWwtc3R5bGVzaGVldC0xOTk5MDQyOCI+aHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS94bWwtc3R5bGVzaGVldC0xOTk5MDQyODwvYT4NCis8YnI+DQorPC9kZD4NCis8ZHQ+RWRpdG9yOjwvZHQ+DQorPGRkPg0KKw0KK0phbWVzIENsYXJrDQorPGEgaHJlZj0ibWFpbHRvOmpqY0BqY2xhcmsuY29tIj4mbHQ7ampjQGpjbGFyay5jb20mZ3Q7PC9hPg0KKzxicj4NCis8L2RkPg0KKzwvZGw+DQorPHAgY2xhc3M9ImNvcHlyaWdodCI+DQorPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9pcHItbm90aWNlLmh0bWwjQ29weXJpZ2h0Ij4NCisgICAgQ29weXJpZ2h0PC9hPiAmbmJzcDsmY29weTsmbmJzcDsgMTk5OSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZyI+VzNDPC9hPg0KKyAgICAoPGEgaHJlZj0iaHR0cDovL3d3dy5sY3MubWl0LmVkdSI+TUlUPC9hPiwNCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5pbnJpYS5mci8iPklOUklBPC9hPiwNCisgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5rZWlvLmFjLmpwLyI+S2VpbzwvYT4gKSwgQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVzNDDQorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvaXByLW5vdGljZS5odG1sI0xlZ2FsIERpc2NsYWltZXIiPmxpYWJpbGl0eSw8L2E+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9pcHItbm90aWNlLmh0bWwjVzNDIFRyYWRlbWFya3MiPnRyYWRlbWFyazwvYT4sDQorICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LWRvY3VtZW50cy5odG1sIj5kb2N1bWVudCB1c2UgPC9hPmFuZA0KKyAgICA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS5odG1sIj5zb2Z0d2FyZSBsaWNlbnNpbmcgPC9hPnJ1bGVzIGFwcGx5Lg0KKyAgPC9wPg0KKzxociB0aXRsZT0iU2VwYXJhdG9yIGZvciBoZWFkZXIiPg0KKzwvZGl2Pg0KKzxoMj4NCis8YSBuYW1lPSJhYnN0cmFjdCI+QWJzdHJhY3Q8L2E+DQorPC9oMj4NCisNCis8cD5UaGlzIGRvY3VtZW50IGFsbG93cyBhIHN0eWxlIHNoZWV0IHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUwNCitkb2N1bWVudCBieSBpbmNsdWRpbmcgb25lIG9yIG1vcmUgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgd2l0aCBhDQordGFyZ2V0IG9mIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBpbiB0aGUgZG9jdW1lbnQncyBwcm9sb2cuPC9wPg0KKw0KKzxoMj4NCis8YSBuYW1lPSJzdGF0dXMiPlN0YXR1cyBvZiB0aGlzIGRvY3VtZW50PC9hPg0KKzwvaDI+DQorDQorPHA+VGhpcyBkb2N1bWVudCBoYXMgYmVlbiByZXZpZXdlZCBieSBXM0MgTWVtYmVycyBhbmQgb3RoZXIgaW50ZXJlc3RlZA0KK3BhcnRpZXMgYW5kIGhhcyBiZWVuIGVuZG9yc2VkIGJ5IHRoZSBEaXJlY3RvciBhcyBhIFczQyA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL1Byb2Nlc3MvI1JlY3NXM0MiPlJlY29tbWVuZGF0aW9uPC9hPi4gSXQNCitpcyBhIHN0YWJsZSBkb2N1bWVudCBhbmQgbWF5IGJlIHVzZWQgYXMgcmVmZXJlbmNlIG1hdGVyaWFsIG9yIGNpdGVkIGFzDQorYSBub3JtYXRpdmUgcmVmZXJlbmNlIGZyb20gb3RoZXIgZG9jdW1lbnRzLiBXM0MncyByb2xlIGluIG1ha2luZyB0aGUNCitSZWNvbW1lbmRhdGlvbiBpcyB0byBkcmF3IGF0dGVudGlvbiB0byB0aGUgc3BlY2lmaWNhdGlvbiBhbmQgdG8NCitwcm9tb3RlIGl0cyB3aWRlc3ByZWFkIGRlcGxveW1lbnQuIFRoaXMgZW5oYW5jZXMgdGhlIGZ1bmN0aW9uYWxpdHkgYW5kDQoraW50ZXJvcGVyYWJpbGl0eSBvZiB0aGUgV2ViLjwvcD4NCisNCis8cD5UaGUgbGlzdCBvZiBrbm93biBlcnJvcnMgaW4gdGhpcyBzcGVjaWZpY2F0aW9ucyBpcyBhdmFpbGFibGUgYXQNCis8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzA2L1JFQy14bWwtc3R5bGVzaGVldC0xOTk5MDYyOS9lcnJhdGEiPmh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkveG1sLXN0eWxlc2hlZXQtMTk5OTA2MjkvZXJyYXRhPC9hPi48L3A+DQorDQorPHA+Q29tbWVudHMgb24gdGhpcyBzcGVjaWZpY2F0aW9uIG1heSBiZSBzZW50IHRvICZsdDs8YSBocmVmPSJtYWlsdG86d3d3LXhtbC1zdHlsZXNoZWV0LWNvbW1lbnRzQHczLm9yZyI+d3d3LXhtbC1zdHlsZXNoZWV0LWNvbW1lbnRzQHczLm9yZzwvYT4mZ3Q7LiBUaGUgYXJjaGl2ZSBvZiBwdWJsaWMNCitjb21tZW50cyBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQXJjaGl2ZXMvUHVibGljL3d3dy14bWwtc3R5bGVzaGVldC1jb21tZW50cyI+aHR0cDovL3czLm9yZy9BcmNoaXZlcy9QdWJsaWMvd3d3LXhtbC1zdHlsZXNoZWV0LWNvbW1lbnRzPC9hPi48L3A+DQorDQorPHA+QSBsaXN0IG9mIGN1cnJlbnQgVzNDIFJlY29tbWVuZGF0aW9ucyBhbmQgb3RoZXIgdGVjaG5pY2FsIGRvY3VtZW50cw0KK2NhbiBiZSBmb3VuZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUiI+aHR0cDovL3d3dy53My5vcmcvVFI8L2E+LjwvcD4NCisNCis8cD5UaGUgV29ya2luZyBHcm91cCBleHBlY3RzIGFkZGl0aW9uYWwgbWVjaGFuaXNtcyBmb3IgbGlua2luZyBzdHlsZQ0KK3NoZWV0cyB0byBYTUwgZG9jdW1lbnQgdG8gYmUgZGVmaW5lZCBpbiBhIGZ1dHVyZSBzcGVjaWZpY2F0aW9uLjwvcD4NCisNCis8cD5UaGUgdXNlIG9mIFhNTCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiB0aGlzIHNwZWNpZmljYXRpb24gc2hvdWxkDQorbm90IGJlIHRha2VuIGFzIGEgcHJlY2VkZW50LiAgVGhlIFczQyBkb2VzIG5vdCBhbnRpY2lwYXRlIHJlY29tbWVuZGluZw0KK3RoZSB1c2Ugb2YgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gYW55IGZ1dHVyZSBzcGVjaWZpY2F0aW9uLiAgVGhlDQorPGEgaHJlZj0iI3JhdGlvbmFsZSI+UmF0aW9uYWxlPC9hPiBleHBsYWlucyB3aHkgdGhleSB3ZXJlIHVzZWQgaW4NCit0aGlzIHNwZWNpZmljYXRpb24uPC9wPg0KKw0KKzxwPlRoaXMgZG9jdW1lbnQgd2FzIHByb2R1Y2VkIGFzIHBhcnQgb2YgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1hNTC9BY3Rpdml0eSI+VzNDIFhNTCBBY3Rpdml0eTwvYT4uPC9wPg0KKw0KKw0KKzxoMj4NCis8YSBuYW1lPSJjb250ZW50cyI+VGFibGUgb2YgY29udGVudHM8L2E+DQorPC9oMj4xIDxhIGhyZWY9IiNUaGUgeG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiI+VGhlIHhtbC1zdHlsZXNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb248L2E+DQorPGJyPg0KKzxoMz5BcHBlbmRpY2VzPC9oMz5BIDxhIGhyZWY9IiNSZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9hPg0KKzxicj5CIDxhIGhyZWY9IiNyYXRpb25hbGUiPlJhdGlvbmFsZTwvYT4NCis8YnI+DQorPGhyPg0KKw0KKzxoMj4NCis8YSBuYW1lPSJUaGUgeG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiI+PC9hPjEgVGhlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBwcm9jZXNzaW5nIGluc3RydWN0aW9uPC9oMj4NCisNCis8cD5TdHlsZSBTaGVldHMgY2FuIGJlIGFzc29jaWF0ZWQgd2l0aCBhbiBYTUw8YSBocmVmPSIjWE1MIj5bWE1MMTBdPC9hPg0KK2RvY3VtZW50IGJ5IHVzaW5nIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB3aG9zZSB0YXJnZXQgaXMNCis8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4uICBUaGlzIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gZm9sbG93cyB0aGUNCitiZWhhdmlvdXIgb2YgdGhlIEhUTUwgNC4wIDxjb2RlPiZsdDtMSU5LDQorUkVMPSJzdHlsZXNoZWV0IiZndDs8L2NvZGU+PGEgaHJlZj0iI0hUTUwiPltIVE1MNDBdPC9hPi48L3A+DQorDQorPHA+VGhlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGlzIHBhcnNlZCBpbg0KK3RoZSBzYW1lIHdheSBhcyBhIHN0YXJ0LXRhZywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgZW50aXRpZXMgb3RoZXINCit0aGFuIHByZWRlZmluZWQgZW50aXRpZXMgbXVzdCBub3QgYmUgcmVmZXJlbmNlZC48L3A+DQorDQorPHA+VGhlIGZvbGxvd2luZyBncmFtbWFyIGlzIGdpdmVuIHVzaW5nIHRoZSBzYW1lIG5vdGF0aW9uIGFzIHRoZQ0KK2dyYW1tYXIgaW4gdGhlIFhNTCBSZWNvbW1lbmRhdGlvbjxhIGhyZWY9IiNYTUwiPltYTUwxMF08L2E+LiAgU3ltYm9scyBpbiB0aGUNCitncmFtbWFyIHRoYXQgYXJlIG5vdCBkZWZpbmVkIGhlcmUgYXJlIGRlZmluZWQgaW4gdGhlIFhNTA0KK1JlY29tbWVuZGF0aW9uLjwvcD4NCisNCis8aDU+eG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjwvaDU+DQorPHRhYmxlIGNsYXNzPSJzY3JhcCI+DQorPHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+DQorPGEgbmFtZT0iTlQtU3R5bGVTaGVldFBJIj48L2E+WzFdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+U3R5bGVTaGVldFBJPC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+JyZsdDs/eG1sLXN0eWxlc2hlZXQnICg8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1Qc2V1ZG9BdHQiPlBzZXVkb0F0dDwvYT4pKiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULVMiPlM8L2E+PyAnPyZndDsnPC90ZD4NCis8dGQ+DQorPC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+DQorPGEgbmFtZT0iTlQtUHNldWRvQXR0Ij48L2E+WzJdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+UHNldWRvQXR0PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+DQorPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1OYW1lIj5OYW1lPC9hPiA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULVMiPlM8L2E+PyAnPScgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1TIj5TPC9hPj8gPGEgaHJlZj0iI05ULVBzZXVkb0F0dFZhbHVlIj5Qc2V1ZG9BdHRWYWx1ZTwvYT4NCis8L3RkPg0KKzx0ZD4NCis8L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD4NCis8YSBuYW1lPSJOVC1Qc2V1ZG9BdHRWYWx1ZSI+PC9hPlszXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPlBzZXVkb0F0dFZhbHVlPC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+KCciJyAoW14iJmx0OyZhbXA7XSB8IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtQ2hhclJlZiI+Q2hhclJlZjwvYT4gfCA8YSBocmVmPSIjTlQtUHJlZGVmRW50aXR5UmVmIj5QcmVkZWZFbnRpdHlSZWY8L2E+KSogJyInPC90ZD4NCis8dGQ+DQorPC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+DQorPC90ZD4NCis8dGQ+DQorPC90ZD4NCis8dGQ+DQorPC90ZD4NCis8dGQ+fCAiJyIgKFteJyZsdDsmYW1wO10gfCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULUNoYXJSZWYiPkNoYXJSZWY8L2E+IHwgPGEgaHJlZj0iI05ULVByZWRlZkVudGl0eVJlZiI+UHJlZGVmRW50aXR5UmVmPC9hPikqICInIik8L3RkPg0KKzx0ZD4NCis8L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD4NCis8L3RkPg0KKzx0ZD4NCis8L3RkPg0KKzx0ZD4NCis8L3RkPg0KKzx0ZD4tICg8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULUNoYXIiPkNoYXI8L2E+KiAnPyZndDsnIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtQ2hhciI+Q2hhcjwvYT4qKTwvdGQ+DQorPHRkPg0KKzwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPg0KKzxhIG5hbWU9Ik5ULVByZWRlZkVudGl0eVJlZiI+PC9hPls0XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPlByZWRlZkVudGl0eVJlZjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPicmYW1wO2FtcDsnIHwgJyZhbXA7bHQ7JyB8ICcmYW1wO2d0OycgfCAnJmFtcDtxdW90OycgfCAnJmFtcDthcG9zOyc8L3RkPg0KKzx0ZD4NCis8L3RkPg0KKzwvdHI+DQorPC90Ym9keT4NCis8L3RhYmxlPg0KKw0KKzxwPkluIDxhIGhyZWY9IiNOVC1Qc2V1ZG9BdHRWYWx1ZSI+UHNldWRvQXR0VmFsdWU8L2E+LCBhIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtQ2hhclJlZiI+Q2hhclJlZjwvYT4gb3IgYSA8YSBocmVmPSIjTlQtUHJlZGVmRW50aXR5UmVmIj5QcmVkZWZFbnRpdHlSZWY8L2E+IGlzIGludGVycHJldGVkIGluIHRoZQ0KK3NhbWUgbWFubmVyIGFzIGluIGEgbm9ybWFsIFhNTCBhdHRyaWJ1dGUgdmFsdWUuICBUaGUgYWN0dWFsIHZhbHVlIG9mDQordGhlIHBzZXVkby1hdHRyaWJ1dGUgaXMgdGhlIHZhbHVlIGFmdGVyIGVhY2ggcmVmZXJlbmNlIGlzIHJlcGxhY2VkIGJ5DQordGhlIGNoYXJhY3RlciBpdCByZWZlcmVuY2VzLiAgVGhpcyByZXBsYWNlbWVudCBpcyBub3QgcGVyZm9ybWVkDQorYXV0b21hdGljYWxseSBieSBhbiBYTUwgcHJvY2Vzc29yLjwvcD4NCisNCis8cD5UaGUgPGNvZGU+eG1sLXN0eWxlc2hlZXQ8L2NvZGU+IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaXMgYWxsb3dlZA0KK29ubHkgaW4gdGhlIHByb2xvZyBvZiBhbiBYTUwgZG9jdW1lbnQuIFRoZSBzeW50YXggb2YgWE1MIGNvbnN0cmFpbnMNCit3aGVyZSBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcmUgYWxsb3dlZCBpbiB0aGUgcHJvbG9nOyB0aGUNCis8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpcyBhbGxvd2VkIGFueXdoZXJlDQoraW4gdGhlIHByb2xvZyB0aGF0IG1lZXRzIHRoZXNlIGNvbnN0cmFpbnRzLjwvcD4NCisNCis8YmxvY2txdW90ZT4NCis8Yj5OT1RFOiA8L2I+SWYgdGhlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBwcm9jZXNzaW5nIGluc3RydWN0aW9uDQorb2NjdXJzIGluIHRoZSBleHRlcm5hbCBEVEQgc3Vic2V0IG9yIGluIGEgcGFyYW1ldGVyIGVudGl0eSwgaXQgaXMNCitwb3NzaWJsZSB0aGF0IGl0IG1heSBub3QgYmUgcHJvY2Vzc2VkIGJ5IGEgbm9uLXZhbGlkYXRpbmcgWE1MDQorcHJvY2Vzc29yIChzZWUgPGEgaHJlZj0iI1hNTCI+W1hNTDEwXTwvYT4pLjwvYmxvY2txdW90ZT4NCisNCis8cD5UaGUgZm9sbG93aW5nIHBzZXVkbyBhdHRyaWJ1dGVzIGFyZSBkZWZpbmVkPC9wPg0KKw0KKzxwcmU+aHJlZiBDREFUQSAjUkVRVUlSRUQNCit0eXBlIENEQVRBICNSRVFVSVJFRA0KK3RpdGxlIENEQVRBICNJTVBMSUVEDQorbWVkaWEgQ0RBVEEgI0lNUExJRUQNCitjaGFyc2V0IENEQVRBICNJTVBMSUVEDQorYWx0ZXJuYXRlICh5ZXN8bm8pICJubyI8L3ByZT4NCisNCis8cD5UaGUgc2VtYW50aWNzIG9mIHRoZSBwc2V1ZG8tYXR0cmlidXRlcyBhcmUgZXhhY3RseSBhcyB3aXRoDQorPGNvZGU+Jmx0O0xJTksgUkVMPSJzdHlsZXNoZWV0IiZndDs8L2NvZGU+IGluIEhUTUwgNC4wLCB3aXRoIHRoZQ0KK2V4Y2VwdGlvbiBvZiB0aGUgPGNvZGU+YWx0ZXJuYXRlPC9jb2RlPiBwc2V1ZG8tYXR0cmlidXRlLiAgSWYNCis8Y29kZT5hbHRlcm5hdGU9InllcyI8L2NvZGU+IGlzIHNwZWNpZmllZCwgdGhlbiB0aGUgcHJvY2Vzc2luZw0KK2luc3RydWN0aW9uIGhhcyB0aGUgc2VtYW50aWNzIG9mIDxjb2RlPiZsdDtMSU5LIFJFTD0iYWx0ZXJuYXRlDQorc3R5bGVzaGVldCImZ3Q7PC9jb2RlPiBpbnN0ZWFkIG9mIDxjb2RlPiZsdDtMSU5LDQorUkVMPSJzdHlsZXNoZWV0IiZndDs8L2NvZGU+LjwvcD4NCisNCis8YmxvY2txdW90ZT4NCis8Yj5OT1RFOiA8L2I+U2luY2UgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5ocmVmPC9jb2RlPiBhdHRyaWJ1dGUgaXMgYSBVUkkNCityZWZlcmVuY2UsIGl0IG1heSBiZSBhIHJlbGF0aXZlIFVSSSBhbmQgaXQgbWF5IGNvbnRhaW4gYSBmcmFnbWVudA0KK2lkZW50aWZpZXIuIEluIHBhcnRpY3VsYXIgdGhlIFVSSSByZWZlcmVuY2UgbWF5IGNvbnRhaW4gb25seSBhDQorZnJhZ21lbnQgaWRlbnRpZmllci4gIFN1Y2ggYSBVUkkgcmVmZXJlbmNlIGlzIGEgcmVmZXJlbmNlIHRvIGEgcGFydCBvZg0KK3RoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSA8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4gcHJvY2Vzc2luZw0KK2luc3RydWN0aW9uIChzZWUgPGEgaHJlZj0iI1JGQzIzOTYiPltSRkMyMzk2XTwvYT4pLiBUaGUgY29uc2VxdWVuY2UgaXMgdGhhdCB0aGUNCis8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBhbGxvd3Mgc3R5bGUgc2hlZXRzDQordG8gYmUgZW1iZWRkZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXMgdGhlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPg0KK3Byb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24uPC9ibG9ja3F1b3RlPg0KKw0KKzxwPkluIHNvbWUgY2FzZXMsIHN0eWxlIHNoZWV0cyBtYXkgYmUgbGlua2VkIHdpdGggYW4gWE1MIGRvY3VtZW50IGJ5DQorbWVhbnMgZXh0ZXJuYWwgdG8gdGhlIGRvY3VtZW50LiBGb3IgZXhhbXBsZSwgZWFybGllciB2ZXJzaW9ucyBvZiBIVFRQDQorPGEgaHJlZj0iI1JGQzIwNjgiPltSRkMyMDY4XTwvYT4gKHNlY3Rpb24gMTkuNi4yLjQpIGFsbG93ZWQgc3R5bGUgc2hlZXRzIHRvIGJlDQorYXNzb2NpYXRlZCB3aXRoIFhNTCBkb2N1bWVudHMgYnkgbWVhbnMgb2YgdGhlIDxjb2RlPkxpbms8L2NvZGU+DQoraGVhZGVyLiAgQW55IGxpbmtzIHRvIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBzcGVjaWZpZWQgZXh0ZXJuYWxseSB0byB0aGUNCitkb2N1bWVudCBhcmUgY29uc2lkZXJlZCB0byBvY2N1ciBiZWZvcmUgdGhlIGxpbmtzIHNwZWNpZmllZCBieSB0aGUNCis8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBzYW1lDQorYXMgaW4gSFRNTCA0LjAgKHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwL3ByZXNlbnQvc3R5bGVzLmh0bWwjaC0xNC42Ij5zZWN0aW9uDQorMTQuNjwvYT4pLjwvcD4NCisNCis8cD5IZXJlIGFyZSBzb21lIGV4YW1wbGVzIGZyb20gSFRNTCA0LjAgd2l0aCB0aGUgY29ycmVzcG9uZGluZw0KK3Byb2Nlc3NpbmcgaW5zdHJ1Y3Rpb246PC9wPg0KKw0KKzxwcmU+Jmx0O0xJTksgaHJlZj0ibXlzdHlsZS5jc3MiIHJlbD0ic3R5bGUgc2hlZXQiIHR5cGU9InRleHQvY3NzIiZndDsNCismbHQ7P3htbC1zdHlsZXNoZWV0IGhyZWY9Im15c3R5bGUuY3NzIiB0eXBlPSJ0ZXh0L2NzcyI/Jmd0Ow0KKw0KKyZsdDtMSU5LIGhyZWY9Im15c3R5bGUuY3NzIiB0aXRsZT0iQ29tcGFjdCIgcmVsPSJzdHlsZXNoZWV0Ig0KK3R5cGU9InRleHQvY3NzIiZndDsNCismbHQ7P3htbC1zdHlsZXNoZWV0IGhyZWY9Im15c3R5bGUuY3NzIiB0aXRsZT0iQ29tcGFjdCIgdHlwZT0idGV4dC9jc3MiPyZndDsNCisNCismbHQ7TElOSyBocmVmPSJteXN0eWxlLmNzcyIgdGl0bGU9Ik1lZGl1bSIgcmVsPSJhbHRlcm5hdGUgc3R5bGVzaGVldCINCit0eXBlPSJ0ZXh0L2NzcyImZ3Q7DQorJmx0Oz94bWwtc3R5bGVzaGVldCBhbHRlcm5hdGU9InllcyIgaHJlZj0ibXlzdHlsZS5jc3MiIHRpdGxlPSJNZWRpdW0iDQordHlwZT0idGV4dC9jc3MiPyZndDs8L3ByZT4NCisNCis8cD5NdWx0aXBsZSA8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgYXJlDQorYWxzbyBhbGxvd2VkIHdpdGggZXhhY3RseSB0aGUgc2FtZSBzZW1hbnRpY3MgYXMgd2l0aCA8Y29kZT5MSU5LDQorUkVMPSJzdHlsZXNoZWV0IjwvY29kZT4uIEZvciBleGFtcGxlLDwvcD4NCisNCis8cHJlPiZsdDtMSU5LIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiIHRpdGxlPSJjb21wYWN0IiBocmVmPSJzbWFsbC1iYXNlLmNzcyINCit0eXBlPSJ0ZXh0L2NzcyImZ3Q7DQorJmx0O0xJTksgcmVsPSJhbHRlcm5hdGUgc3R5bGVzaGVldCIgdGl0bGU9ImNvbXBhY3QiIGhyZWY9InNtYWxsLWV4dHJhcy5jc3MiDQordHlwZT0idGV4dC9jc3MiJmd0Ow0KKyZsdDtMSU5LIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiIHRpdGxlPSJiaWcgcHJpbnQiIGhyZWY9ImJpZ3ByaW50LmNzcyINCit0eXBlPSJ0ZXh0L2NzcyImZ3Q7DQorJmx0O0xJTksgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJjb21tb24uY3NzIiB0eXBlPSJ0ZXh0L2NzcyImZ3Q7PC9wcmU+DQorDQorPHA+d291bGQgYmUgZXF1aXZhbGVudCB0bzo8L3A+DQorDQorPHByZT4mbHQ7P3htbC1zdHlsZXNoZWV0IGFsdGVybmF0ZT0ieWVzIiB0aXRsZT0iY29tcGFjdCIgaHJlZj0ic21hbGwtYmFzZS5jc3MiDQordHlwZT0idGV4dC9jc3MiPyZndDsNCismbHQ7P3htbC1zdHlsZXNoZWV0IGFsdGVybmF0ZT0ieWVzIiB0aXRsZT0iY29tcGFjdCIgaHJlZj0ic21hbGwtZXh0cmFzLmNzcyINCit0eXBlPSJ0ZXh0L2NzcyI/Jmd0Ow0KKyZsdDs/eG1sLXN0eWxlc2hlZXQgYWx0ZXJuYXRlPSJ5ZXMiIHRpdGxlPSJiaWcgcHJpbnQiIGhyZWY9ImJpZ3ByaW50LmNzcyINCit0eXBlPSJ0ZXh0L2NzcyI/Jmd0Ow0KKyZsdDs/eG1sLXN0eWxlc2hlZXQgaHJlZj0iY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiPyZndDs8L3ByZT4NCisNCisNCisNCis8aHIgdGl0bGU9IlNlcGFyYXRvciBmcm9tIGZvb3RlciI+DQorDQorPGgyPg0KKzxhIG5hbWU9IlJlZmVyZW5jZXMiPjwvYT5BIFJlZmVyZW5jZXM8L2gyPg0KKw0KKzxkbD4NCisNCis8ZHQ+DQorPGEgbmFtZT0iSFRNTCI+SFRNTDQwPC9hPg0KKzwvZHQ+DQorPGRkPldvcmxkIFdpZGUgV2ViDQorQ29uc29ydGl1bS4gPGk+SFRNTCA0LjAgU3BlY2lmaWNhdGlvbi48L2k+IFczQyBSZWNvbW1lbmRhdGlvbi4gU2VlDQorPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MCI+aHR0cDovL3d3dy53My5vcmcvVFIvUkVDLWh0bWw0MDwvYT4NCis8L2RkPg0KKw0KKzxkdD4NCis8YSBuYW1lPSJSRkMyMDY4Ij5SRkMyMDY4PC9hPg0KKzwvZHQ+DQorPGRkPlIuIEZpZWxkaW5nLCBKLiBHZXR0eXMsIEouIE1vZ3VsLA0KK0guIEZyeXN0eWsgTmllbHNlbiwgYW5kIFQuIEJlcm5lcnMtTGVlLiAgPGk+SHlwZXJ0ZXh0IFRyYW5zZmVyDQorUHJvdG9jb2wgLS0gSFRUUC8xLjEuPC9pPi4gSUVURiBSRkMgMjA2OC4gU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNjgudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDY4LnR4dDwvYT4uPC9kZD4NCisNCis8ZHQ+DQorPGEgbmFtZT0iUkZDMjM5NiI+UkZDMjM5NjwvYT4NCis8L2R0Pg0KKzxkZD5ULiBCZXJuZXJzLUxlZSwgUi4gRmllbGRpbmcsIGFuZA0KK0wuIE1hc2ludGVyLiAgPGk+VW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAoVVJJKTogR2VuZXJpYw0KK1N5bnRheDwvaT4uIElFVEYgUkZDIDIzOTYuIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dCI+aHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjM5Ni50eHQ8L2E+LjwvZGQ+DQorDQorPGR0Pg0KKzxhIG5hbWU9IlhNTCI+WE1MMTA8L2E+DQorPC9kdD4NCis8ZGQ+V29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bS4gPGk+RXh0ZW5zaWJsZQ0KK01hcmt1cCBMYW5ndWFnZSAoWE1MKSAxLjAuPC9pPiBXM0MgUmVjb21tZW5kYXRpb24uIFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAiPmh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMDwvYT4NCis8L2RkPg0KKw0KKzwvZGw+DQorDQorDQorDQorDQorPGgyPg0KKzxhIG5hbWU9InJhdGlvbmFsZSI+PC9hPkIgUmF0aW9uYWxlPC9oMj4NCisNCis8cD5UaGVyZSB3YXMgYW4gdXJnZW50IHJlcXVpcmVtZW50IGZvciBhIHNwZWNpZmljYXRpb24gZm9yIHN0eWxlIHNoZWV0DQorbGlua2luZyB0aGF0IGNvdWxkIGJlIGNvbXBsZXRlZCBpbiB0aW1lIGZvciB0aGUgbmV4dCByZWxlYXNlIGZyb20NCittYWpvciBicm93c2VyIHZlbmRvcnMuICBPbmx5IGJ5IGNob29zaW5nIGEgc2ltcGxlIG1lY2hhbmlzbSBjbG9zZWx5DQorYmFzZWQgb24gYSBwcm92ZW4gZXhpc3RpbmcgbWVjaGFuaXNtIGNvdWxkIHRoZSBzcGVjaWZpY2F0aW9uIGJlDQorY29tcGxldGVkIGluIHRpbWUgdG8gbWVldCB0aGlzIHJlcXVpcmVtZW50LjwvcD4NCisNCis8cD5Vc2Ugb2YgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF2b2lkcyBwb2xsdXRpbmcgdGhlIG1haW4gZG9jdW1lbnQNCitzdHJ1Y3R1cmUgd2l0aCBhcHBsaWNhdGlvbiBzcGVjaWZpYyBwcm9jZXNzaW5nIGluZm9ybWF0aW9uLjwvcD4NCisNCis8cD5UaGUgbWVjaGFuaXNtIGNob3NlbiBmb3IgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGlzIG5vdCBhDQorY29uc3RyYWludCBvbiB0aGUgYWRkaXRpb25hbCBtZWNoYW5pc21zIHBsYW5uZWQgZm9yIGZ1dHVyZSB2ZXJzaW9ucy4NCitUaGVyZSBpcyBubyBleHBlY3RhdGlvbiB0aGF0IHRoZXNlIHdpbGwgdXNlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zOw0KK2luZGVlZCB0aGV5IG1heSBub3QgaW5jbHVkZSB0aGUgbGlua2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgc291cmNlDQorZG9jdW1lbnQuPC9wPg0KKw0KKw0KKw0KKw0KKzwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMvYzE0TlNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL2RpZ2VzdElucHV0cy9jMTROU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjcxNTlmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMvYzE0TlNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSw0IEBACis8P3htbC1zdHlsZXNoZWV0IGhyZWY9ImRvYy54c2wiDQorICAgdHlwZT0idGV4dC94c2wiICAgPz4NCis8ZG9jPkhlbGxvLCB3b3JsZCE8L2RvYz4NCis8P3BpLXdpdGhvdXQtZGF0YT8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMvYzE0TlNpZ25hdHVyZS5zZWNvbmRSZWZlcmVuY2UudHh0IGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMvYzE0TlNpZ25hdHVyZS5zZWNvbmRSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjBjNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL2RpZ2VzdElucHV0cy9jMTROU2lnbmF0dXJlLnNlY29uZFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSw2IEBACis8P3htbC1zdHlsZXNoZWV0IGhyZWY9ImRvYy54c2wiDQorICAgdHlwZT0idGV4dC94c2wiICAgPz4NCis8ZG9jPkhlbGxvLCB3b3JsZCE8IS0tIENvbW1lbnQgMSAtLT48L2RvYz4NCis8P3BpLXdpdGhvdXQtZGF0YT8+DQorPCEtLSBDb21tZW50IDIgLS0+DQorPCEtLSBDb21tZW50IDMgLS0+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMvZW52ZWxvcGVkU2lnbmF0dXJlU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvZGlnZXN0SW5wdXRzL2VudmVsb3BlZFNpZ25hdHVyZVNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JkZTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvZGlnZXN0SW5wdXRzL2VudmVsb3BlZFNpZ25hdHVyZVNpZ25hdHVyZS5maXJzdFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSw1IEBACis8RW52ZWxvcGUgeG1sbnM9Imh0dHA6Ly9pYWlrLmF0I0VudmVsb3BlIj4NCisgIDxEYXRhSXRlbT4NCisgICAgU29tZSBEYXRhIGZyb20gSUFJSw0KKyAgPC9EYXRhSXRlbT4NCis8L0VudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvZGlnZXN0SW5wdXRzL3hQYXRoU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvZGlnZXN0SW5wdXRzL3hQYXRoU2lnbmF0dXJlLmZpcnN0UmVmZXJlbmNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjYwZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMveFBhdGhTaWduYXR1cmUuZmlyc3RSZWZlcmVuY2UudHh0CkBAIC0wLDAgKzEgQEAKKzxkc2lnOk9iamVjdCB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0ib2JqZWN0SWQiPkEgdGV4dCBmcm9tIElBSUs8L2RzaWc6T2JqZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvZGlnZXN0SW5wdXRzL3hQYXRoU2lnbmF0dXJlLnNlY29uZFJlZmVyZW5jZS50eHQgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL2RpZ2VzdElucHV0cy94UGF0aFNpZ25hdHVyZS5zZWNvbmRSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1OTI1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL2RpZ2VzdElucHV0cy94UGF0aFNpZ25hdHVyZS5zZWNvbmRSZWZlcmVuY2UudHh0CkBAIC0wLDAgKzEgQEAKKzxkc2lnOk9iamVjdCB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0ib2JqZWN0SWQiPjwhLS1BIGNvbW1lbnQgZnJvbSBJQUlLLS0+QSB0ZXh0IGZyb20gSUFJSzwvZHNpZzpPYmplY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMveFBhdGhTaWduYXR1cmUudGhpcmRSZWZlcmVuY2UudHh0IGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9kaWdlc3RJbnB1dHMveFBhdGhTaWduYXR1cmUudGhpcmRSZWZlcmVuY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjBkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL2RpZ2VzdElucHV0cy94UGF0aFNpZ25hdHVyZS50aGlyZFJlZmVyZW5jZS50eHQKQEAgLTAsMCArMSBAQAorPGRzaWc6T2JqZWN0IHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIElkPSJvYmplY3RJZCI+QSB0ZXh0IGZyb20gSUFJSzwvZHNpZzpPYmplY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zYW1wbGVzL3NhbXBsZUJhc2U2NEVuY29kZWREYXRhLnR4dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvc2FtcGxlcy9zYW1wbGVCYXNlNjRFbmNvZGVkRGF0YS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmYTA3MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvc2FtcGxlcy9zYW1wbGVCYXNlNjRFbmNvZGVkRGF0YS50eHQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zYW1wbGVzL3NhbXBsZVhNTERhdGEueG1sIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zYW1wbGVzL3NhbXBsZVhNTERhdGEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTI2ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL3NhbXBsZXMvc2FtcGxlWE1MRGF0YS54bWwKQEAgLTAsMCArMSwxMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+CisKKzw/eG1sLXN0eWxlc2hlZXQgICBocmVmPSJkb2MueHNsIgorICAgdHlwZT0idGV4dC94c2wiICAgPz4KKworPGRvYz5IZWxsbywgd29ybGQhPCEtLSBDb21tZW50IDEgLS0+PC9kb2M+CisKKzw/cGktd2l0aG91dC1kYXRhICAgICA/PgorCis8IS0tIENvbW1lbnQgMiAtLT4KKworPCEtLSBDb21tZW50IDMgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL3NpZ25hdHVyZXMvYmFzZTY0RGVjb2RlU2lnbmF0dXJlLnhtbCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvc2lnbmF0dXJlcy9iYXNlNjREZWNvZGVTaWduYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2U5ODkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL3NpZ25hdHVyZXMvYmFzZTY0RGVjb2RlU2lnbmF0dXJlLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZHNpZzpTaWduYXR1cmUgeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzaWc6U2lnbmVkSW5mbz48ZHNpZzpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiLz48ZHNpZzpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz48ZHNpZzpSZWZlcmVuY2UgVVJJPSIuLi9zYW1wbGVzL3NhbXBsZUJhc2U2NEVuY29kZWREYXRhLnR4dCI+PGRzaWc6VHJhbnNmb3Jtcz48ZHNpZzpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjYmFzZTY0Ii8+PC9kc2lnOlRyYW5zZm9ybXM+PGRzaWc6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHNpZzpEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9kc2lnOkRpZ2VzdFZhbHVlPjwvZHNpZzpSZWZlcmVuY2U+PC9kc2lnOlNpZ25lZEluZm8+PGRzaWc6U2lnbmF0dXJlVmFsdWU+Q0ZEZlZrMjJpYXdnbERkckVJeWdtV2hwUHJqMER5V254TGhQQlNnSFhwNmkzMW9WYmljSEFPdlRodjdUeVZLZAorZUU2SzJiNUFLT0VyQndWbmNuZ01CbXB3dEpJb0tPZ1VoZ05lNERza2ZlU2RrNDRPSmtUNjNoMEVKeEpoVUhxegorTnRCZTdRcm15bnBiRm5PZWRERFp3TUE5L0k4UlUwRXEvamlrejlucU5kVT08L2RzaWc6U2lnbmF0dXJlVmFsdWU+PGRzaWc6S2V5SW5mbz48ZHNpZzpLZXlWYWx1ZT48ZHNpZzpSU0FLZXlWYWx1ZT48ZHNpZzpNb2R1bHVzPnNEYTV5elV2NElKbUJZNjBHWkNua1FTQWhwRzd0Z3hlcGk2c2ozRGxDenhqVHRPNU1OcmpJOXNLM1doaW1wTmkKK05EbWFnek5FanhQMyt4MWh1eEwxOUdvSXhaZ3I1TzdFL0YySUluU0FTVlpUUXN2V1psTmF1aFJzMEtaQXN6SVMKK0ZjaHZyaWhJTExvVWY0dHphT1NlNmpnTUVxNklrTzBkV1ZwY0ZwQWpYVGM9PC9kc2lnOk1vZHVsdXM+PGRzaWc6RXhwb25lbnQ+QXc9PTwvZHNpZzpFeHBvbmVudD48L2RzaWc6UlNBS2V5VmFsdWU+PC9kc2lnOktleVZhbHVlPjwvZHNpZzpLZXlJbmZvPjwvZHNpZzpTaWduYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL2MxNG5TaWduYXR1cmUueG1sIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL2MxNG5TaWduYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMGMwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL3NpZ25hdHVyZXMvYzE0blNpZ25hdHVyZS54bWwKQEAgLTAsMCArMSw2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPGRzaWc6U2lnbmF0dXJlIHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxkc2lnOlNpZ25lZEluZm8+PGRzaWc6Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1Ii8+PGRzaWc6U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIi8+PGRzaWc6UmVmZXJlbmNlIFVSST0iLi4vc2FtcGxlcy9zYW1wbGVYTUxEYXRhLnhtbCI+PGRzaWc6VHJhbnNmb3Jtcz48ZHNpZzpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIvPjwvZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+UjhTL1FmR2d6U21mSWcwcXBRdGhkakpRR3VrPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjxkc2lnOlJlZmVyZW5jZSBVUkk9Ii4uL3NhbXBsZXMvc2FtcGxlWE1MRGF0YS54bWwiPjxkc2lnOlRyYW5zZm9ybXM+PGRzaWc6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzIi8+PC9kc2lnOlRyYW5zZm9ybXM+PGRzaWc6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz48ZHNpZzpEaWdlc3RWYWx1ZT5JR0UrK1IzSndnWjE3aHhmVDNWb0dtdk5CalU9PC9kc2lnOkRpZ2VzdFZhbHVlPjwvZHNpZzpSZWZlcmVuY2U+PC9kc2lnOlNpZ25lZEluZm8+PGRzaWc6U2lnbmF0dXJlVmFsdWU+Y21uMjhSa0F4TjU1ODd2K0VQb2Yyb2tLaVVrSml2aDB3S05ISzlGdWhiQSt4VUJXc3VjVUZYck5DcnVnNTdzNAoreFFGc1F0WGpWS1BuK0xHZWhuaHZ4WnFkME1FSzBHTG5kUmsyZEtvZ2J0WC90YzU1QnN5VDFqUkRHcGVJeHFOUgorT253VGxlV2xwOXRNZW5MUFBzYTN2TXJ6WFhVcXVwMkEvSjcvbVphTm5VWT08L2RzaWc6U2lnbmF0dXJlVmFsdWU+PGRzaWc6S2V5SW5mbz48ZHNpZzpLZXlWYWx1ZT48ZHNpZzpSU0FLZXlWYWx1ZT48ZHNpZzpNb2R1bHVzPnNEYTV5elV2NElKbUJZNjBHWkNua1FTQWhwRzd0Z3hlcGk2c2ozRGxDenhqVHRPNU1OcmpJOXNLM1doaW1wTmkKK05EbWFnek5FanhQMyt4MWh1eEwxOUdvSXhaZ3I1TzdFL0YySUluU0FTVlpUUXN2V1psTmF1aFJzMEtaQXN6SVMKK0ZjaHZyaWhJTExvVWY0dHphT1NlNmpnTUVxNklrTzBkV1ZwY0ZwQWpYVGM9PC9kc2lnOk1vZHVsdXM+PGRzaWc6RXhwb25lbnQ+QXc9PTwvZHNpZzpFeHBvbmVudD48L2RzaWc6UlNBS2V5VmFsdWU+PC9kc2lnOktleVZhbHVlPjwvZHNpZzpLZXlJbmZvPjwvZHNpZzpTaWduYXR1cmU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL2VudmVsb3BlZFNpZ25hdHVyZVNpZ25hdHVyZS54bWwgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL3NpZ25hdHVyZXMvZW52ZWxvcGVkU2lnbmF0dXJlU2lnbmF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTI0YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL2VudmVsb3BlZFNpZ25hdHVyZVNpZ25hdHVyZS54bWwKQEAgLTAsMCArMSwxMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxFbnZlbG9wZSB4bWxucz0iaHR0cDovL2lhaWsuYXQjRW52ZWxvcGUiPgorICA8ZHNpZzpTaWduYXR1cmUgeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzaWc6U2lnbmVkSW5mbz48ZHNpZzpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiLz48ZHNpZzpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz48ZHNpZzpSZWZlcmVuY2UgVVJJPSIiPjxkc2lnOlRyYW5zZm9ybXM+PGRzaWc6VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiLz48L2RzaWc6VHJhbnNmb3Jtcz48ZHNpZzpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkc2lnOkRpZ2VzdFZhbHVlPmNXRlZvZ3NUSlVybW9DYkdyRm9QMm1FK0Y1VT08L2RzaWc6RGlnZXN0VmFsdWU+PC9kc2lnOlJlZmVyZW5jZT48L2RzaWc6U2lnbmVkSW5mbz48ZHNpZzpTaWduYXR1cmVWYWx1ZT5sODJxaWx2VWhrc3R6Rkc4dGpUWS9EQWxXbWhNVFB6NmZobmFJTTZxZXRIOS9xYWdqdHJjZUV3R25jOFE3RzIwCitsYXhQZyt0alhhOXFTSEI5d1VtT2d1NWF4TjNvTnNuY1p4dWtDaTdwbW11amZsTXNYZkpLbDdqVFh3ZVl5S1U1Cis1dEpnZUpNM01uam00UWlBRTFYOUZ0bmU0VUtGRmc0MzQ4UlVXbmxaV0JFPTwvZHNpZzpTaWduYXR1cmVWYWx1ZT48ZHNpZzpLZXlJbmZvPjxkc2lnOktleVZhbHVlPjxkc2lnOlJTQUtleVZhbHVlPjxkc2lnOk1vZHVsdXM+c0RhNXl6VXY0SUptQlk2MEdaQ25rUVNBaHBHN3RneGVwaTZzajNEbEN6eGpUdE81TU5yakk5c0szV2hpbXBOaQorTkRtYWd6TkVqeFAzK3gxaHV4TDE5R29JeFpncjVPN0UvRjJJSW5TQVNWWlRRc3ZXWmxOYXVoUnMwS1pBc3pJUworRmNodnJpaElMTG9VZjR0emFPU2U2amdNRXE2SWtPMGRXVnBjRnBBalhUYz08L2RzaWc6TW9kdWx1cz48ZHNpZzpFeHBvbmVudD5Bdz09PC9kc2lnOkV4cG9uZW50PjwvZHNpZzpSU0FLZXlWYWx1ZT48L2RzaWc6S2V5VmFsdWU+PC9kc2lnOktleUluZm8+PC9kc2lnOlNpZ25hdHVyZT48RGF0YUl0ZW0+CisgICAgU29tZSBEYXRhIGZyb20gSUFJSworICA8L0RhdGFJdGVtPgorPC9FbnZlbG9wZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL3NpZ25hdHVyZXMveFBhdGhTaWduYXR1cmUueG1sIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL3hQYXRoU2lnbmF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2MyOGI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL3hQYXRoU2lnbmF0dXJlLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8ZHNpZzpTaWduYXR1cmUgeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PGRzaWc6U2lnbmVkSW5mbz48ZHNpZzpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiLz48ZHNpZzpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiLz48ZHNpZzpSZWZlcmVuY2UgVVJJPSIjb2JqZWN0SWQiPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+WGc3aHVVYUh2R2poazExVDZjQmE1aktpQ0FNPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjxkc2lnOlJlZmVyZW5jZSBVUkk9IiN4cG9pbnRlcihpZCgmYXBvcztvYmplY3RJZCZhcG9zOykpIj48ZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1I1dpdGhDb21tZW50cyIvPjwvZHNpZzpUcmFuc2Zvcm1zPjxkc2lnOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+PGRzaWc6RGlnZXN0VmFsdWU+YTFZa1FESC9YR2RjY09haXl4T3JQNkFRQmVNPTwvZHNpZzpEaWdlc3RWYWx1ZT48L2RzaWc6UmVmZXJlbmNlPjxkc2lnOlJlZmVyZW5jZSBVUkk9IiI+PGRzaWc6VHJhbnNmb3Jtcz48ZHNpZzpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNiI+PGRzaWc6WFBhdGggeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+YW5jZXN0b3Itb3Itc2VsZjo6ZHNpZzpPYmplY3Q8L2RzaWc6WFBhdGg+PC9kc2lnOlRyYW5zZm9ybT48L2RzaWc6VHJhbnNmb3Jtcz48ZHNpZzpEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPjxkc2lnOkRpZ2VzdFZhbHVlPlhnN2h1VWFIdkdqaGsxMVQ2Y0JhNWpLaUNBTT08L2RzaWc6RGlnZXN0VmFsdWU+PC9kc2lnOlJlZmVyZW5jZT48L2RzaWc6U2lnbmVkSW5mbz48ZHNpZzpTaWduYXR1cmVWYWx1ZT5kUk05YXhWUVlQTWQwdmZ6a2JzdGFHOHRhTlR0SkE5c0Y5emUzL3hXNkFlVzlLQ2d1SWpIcG1HMmtBdURKaGVaCitSWFJPOWV0K3doV3pyWDhkYUhjaFV1NlJEYmtrTDV0T0JjTW55S0ppUEQwM05SeHV0N0FXdGtGS0xoaHh6UmRzCisrRUE3WDB1TmY1OVVJYW5MbE1pR2gzK1JPemN0d3lPMHo4dmJLcWpHeFlVPTwvZHNpZzpTaWduYXR1cmVWYWx1ZT48ZHNpZzpLZXlJbmZvPjxkc2lnOktleVZhbHVlPjxkc2lnOlJTQUtleVZhbHVlPjxkc2lnOk1vZHVsdXM+c0RhNXl6VXY0SUptQlk2MEdaQ25rUVNBaHBHN3RneGVwaTZzajNEbEN6eGpUdE81TU5yakk5c0szV2hpbXBOaQorTkRtYWd6TkVqeFAzK3gxaHV4TDE5R29JeFpncjVPN0UvRjJJSW5TQVNWWlRRc3ZXWmxOYXVoUnMwS1pBc3pJUworRmNodnJpaElMTG9VZjR0emFPU2U2amdNRXE2SWtPMGRXVnBjRnBBalhUYz08L2RzaWc6TW9kdWx1cz48ZHNpZzpFeHBvbmVudD5Bdz09PC9kc2lnOkV4cG9uZW50PjwvZHNpZzpSU0FLZXlWYWx1ZT48L2RzaWc6S2V5VmFsdWU+PC9kc2lnOktleUluZm8+PGRzaWc6T2JqZWN0IElkPSJvYmplY3RJZCI+PCEtLUEgY29tbWVudCBmcm9tIElBSUstLT5BIHRleHQgZnJvbSBJQUlLPC9kc2lnOk9iamVjdD48L2RzaWc6U2lnbmF0dXJlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvc2lnbmF0dXJlcy94UGF0aFNpZ25hdHVyZS54bWwuMC5pbnB1dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvc2lnbmF0dXJlcy94UGF0aFNpZ25hdHVyZS54bWwuMC5pbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjYwZGY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL3hQYXRoU2lnbmF0dXJlLnhtbC4wLmlucHV0CkBAIC0wLDAgKzEgQEAKKzxkc2lnOk9iamVjdCB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0ib2JqZWN0SWQiPkEgdGV4dCBmcm9tIElBSUs8L2RzaWc6T2JqZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvc2lnbmF0dXJlcy94UGF0aFNpZ25hdHVyZS54bWwuMS5pbnB1dCBiL3NhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsL3RyYW5zZm9ybXMvc2lnbmF0dXJlcy94UGF0aFNpZ25hdHVyZS54bWwuMS5pbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTkyNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL3hQYXRoU2lnbmF0dXJlLnhtbC4xLmlucHV0CkBAIC0wLDAgKzEgQEAKKzxkc2lnOk9iamVjdCB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0ib2JqZWN0SWQiPjwhLS1BIGNvbW1lbnQgZnJvbSBJQUlLLS0+QSB0ZXh0IGZyb20gSUFJSzwvZHNpZzpPYmplY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL3hQYXRoU2lnbmF0dXJlLnhtbC4yLmlucHV0IGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL3hQYXRoU2lnbmF0dXJlLnhtbC4yLmlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NjBkZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL3NpZ25hdHVyZXMveFBhdGhTaWduYXR1cmUueG1sLjIuaW5wdXQKQEAgLTAsMCArMSBAQAorPGRzaWc6T2JqZWN0IHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIElkPSJvYmplY3RJZCI+QSB0ZXh0IGZyb20gSUFJSzwvZHNpZzpPYmplY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL3hQYXRoU2lnbmF0dXJlLnhtbC4zLmlucHV0IGIvc2FtcGxlcy9kYXRhL2F0L2lhaWsvaXhzaWwvdHJhbnNmb3Jtcy9zaWduYXR1cmVzL3hQYXRoU2lnbmF0dXJlLnhtbC4zLmlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZGUwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvYXQvaWFpay9peHNpbC90cmFuc2Zvcm1zL3NpZ25hdHVyZXMveFBhdGhTaWduYXR1cmUueG1sLjMuaW5wdXQKQEAgLTAsMCArMSBAQAorPGRzaWc6T2JqZWN0IHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPkEgdGV4dCBmcm9tIElBSUs8L2RzaWc6T2JqZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9jb20vcG90aG9sZS94bWxkc2lnL3htbC1zdHlsZXNoZWV0LnR4dCBiL3NhbXBsZXMvZGF0YS9jb20vcG90aG9sZS94bWxkc2lnL3htbC1zdHlsZXNoZWV0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWZhMDcxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2NvbS9wb3Rob2xlL3htbGRzaWcveG1sLXN0eWxlc2hlZXQudHh0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL1JlYWRtZS50eHQgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9SZWFkbWUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDZiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9SZWFkbWUudHh0CkBAIC0wLDAgKzEsMzcgQEAKK0V4YW1wbGUgU2lnbmF0dXJlc1sxXQorCitbMV0gaHR0cDovL3d3dy53My5vcmcvU2lnbmF0dXJlL0RyYWZ0cy94bWxkc2lnLWNvcmUvT3ZlcnZpZXcuaHRtbAorCitUaGlzIGlzIGFuIGV4ZXJjaXNlIG92ZXIgc29tZSBrZXkgaW5mb3JtYXRpb24gdHlwZXMsIGludGVyb3AKK29mIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBjZXJ0YWluIHN0YW5kYXJkaXNhdGlvbiBwcm9jZXNzZXMuCisKKy4gc2lnbmF0dXJlLWtleW5hbWUueG1sCisuIHNpZ25hdHVyZS1yZXRyaWV2YWxtZXRob2QtcmF3eDUwOWNydC54bWwKKy4gc2lnbmF0dXJlLXg1MDktY3J0LWNybC54bWwKKy4gc2lnbmF0dXJlLXg1MDktY3J0LnhtbAorLiBzaWduYXR1cmUteDUwOS1pcy54bWwKKy4gc2lnbmF0dXJlLXg1MDktc2tpLnhtbAorLiBzaWduYXR1cmUteDUwOS1zbi54bWwKKy4gY2VydHMvKi5jcnQKKworVG8gcmVzb2x2ZSB0aGUga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgS2V5TmFtZSBpbiBgc2lnbmF0dXJlLWtleW5hbWUueG1sJworeW91IG11c3QgcGVyZm9ybSBhIGN1bm5pbmcgdHJhbnNmb3JtYXRpb24gZnJvbSB0aGUgbmFtZSBgWHh4JyB0byB0aGUKK2NlcnRpZmljYXRlIHRoYXQgcmVzaWRlcyBpbiB0aGUgZGlyZWN0b3J5IGBjZXJ0cy8nIHRoYXQgaGFzIGEgc3ViamVjdCBuYW1lCitjb250YWluaW5nIHRoZSBjb21tb24gbmFtZSBgWHh4Jy4gVGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gdGhpcyBrZXkgbmFtZSB0bwordGhlIGZpbGVuYW1lIHVuZGVyIHdoaWNoIHRoZSBjZXJ0aWZpY2F0ZSBpcyBzdG9yZWQgYGNlcnRzL3h4eC5jcnQnIGlzIGEKK3RyYWRlIHNlY3JldCBlbmNyeXB0aW9uIHByb2Nlc3MsIHRoZSBjaXJjdW12ZW50aW9uIG9mIHdoaWNoIG1heSBleHBvc2UKK3lvdSB0byBjaXZpbCBhbmQgY3JpbWluYWwgcHJvc2VjdXRpb24gdW5kZXIgdGhlIERNQ0EgYW5kIG90aGVyIGFwcGxpY2FibGUKK2xhd3MuCisKK1RvIHJlc29sdmUgdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIFg1MDlEYXRhIGluIGBzaWduYXR1cmUteDUwOS1pcy54bWwnLAorYHNpZ25hdHVyZS14NTA5LXNraS54bWwnIGFuZCBgc2lnbmF0dXJlLXg1MDktc24ueG1sJyB5b3UgbmVlZCB0byByZXNvbHZlCit0aGUgaWRlbnRpZmllZCBjZXJ0aWZpY2F0ZSBmcm9tIHRob3NlIGluIHRoZSBgY2VydHMnIGRpcmVjdG9yeS4KKworSW4gYHNpZ25hdHVyZS14NTA5LWNydC1jcmwueG1sJyBhbiBYLjUwOSBDUkwgaXMgcHJlc2VudCB3aGljaCBoYXMgcmV2b2tlZAordGhlIFguNTA5IGNlcnRpZmljYXRlIHVzZWQgZm9yIHNpZ25pbmcuIFNvIHZlcmlmaWNhdGlvbiBzaG91bGQgYmUKK3F1YWxpZmllZC4KKworTWVybGluIEh1Z2hlcyA8bWVybGluQGJhbHRpbW9yZS5pZT4KK0JhbHRpbW9yZSBUZWNobm9sb2dpZXMsIEx0ZC4KKworVHVlc2RheSwgTWF5IDE1LCAyMDAxCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9iYWRiLmNydCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL2NlcnRzL2JhZGIuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MWRmMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9iYWRiLmNydApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9iYWxvci5jcnQgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9iYWxvci5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjY2NkOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL2NlcnRzL2JhbG9yLmNydApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9icmVzLmNydCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL2NlcnRzL2JyZXMuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODY4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9icmVzLmNydApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9sdWdoLmNydCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL2NlcnRzL2x1Z2guY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTU1ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9sdWdoLmNydApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9tYWNoYS5jcnQgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9tYWNoYS5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1NzA2MQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL2NlcnRzL21hY2hhLmNydApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9tb3JpZ3UuY3J0IGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vY2VydHMvbW9yaWd1LmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmIyNzU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vY2VydHMvbW9yaWd1LmNydApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9uZW1haW4uY3J0IGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vY2VydHMvbmVtYWluLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzYwNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vY2VydHMvbmVtYWluLmNydApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9ub2NlcnRpZmlhY3RlLmNydCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL2NlcnRzL25vY2VydGlmaWFjdGUuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDZiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9jZXJ0cy9ub2NlcnRpZmlhY3RlLmNydApAQCAtMCwwICsxLDM3IEBACitFeGFtcGxlIFNpZ25hdHVyZXNbMV0KKworWzFdIGh0dHA6Ly93d3cudzMub3JnL1NpZ25hdHVyZS9EcmFmdHMveG1sZHNpZy1jb3JlL092ZXJ2aWV3Lmh0bWwKKworVGhpcyBpcyBhbiBleGVyY2lzZSBvdmVyIHNvbWUga2V5IGluZm9ybWF0aW9uIHR5cGVzLCBpbnRlcm9wCitvZiB3aGljaCBpcyByZXF1aXJlZCBmb3IgY2VydGFpbiBzdGFuZGFyZGlzYXRpb24gcHJvY2Vzc2VzLgorCisuIHNpZ25hdHVyZS1rZXluYW1lLnhtbAorLiBzaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLXJhd3g1MDljcnQueG1sCisuIHNpZ25hdHVyZS14NTA5LWNydC1jcmwueG1sCisuIHNpZ25hdHVyZS14NTA5LWNydC54bWwKKy4gc2lnbmF0dXJlLXg1MDktaXMueG1sCisuIHNpZ25hdHVyZS14NTA5LXNraS54bWwKKy4gc2lnbmF0dXJlLXg1MDktc24ueG1sCisuIGNlcnRzLyouY3J0CisKK1RvIHJlc29sdmUgdGhlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIEtleU5hbWUgaW4gYHNpZ25hdHVyZS1rZXluYW1lLnhtbCcKK3lvdSBtdXN0IHBlcmZvcm0gYSBjdW5uaW5nIHRyYW5zZm9ybWF0aW9uIGZyb20gdGhlIG5hbWUgYFh4eCcgdG8gdGhlCitjZXJ0aWZpY2F0ZSB0aGF0IHJlc2lkZXMgaW4gdGhlIGRpcmVjdG9yeSBgY2VydHMvJyB0aGF0IGhhcyBhIHN1YmplY3QgbmFtZQorY29udGFpbmluZyB0aGUgY29tbW9uIG5hbWUgYFh4eCcuIFRoZSB0cmFuc2Zvcm1hdGlvbiBmcm9tIHRoaXMga2V5IG5hbWUgdG8KK3RoZSBmaWxlbmFtZSB1bmRlciB3aGljaCB0aGUgY2VydGlmaWNhdGUgaXMgc3RvcmVkIGBjZXJ0cy94eHguY3J0JyBpcyBhCit0cmFkZSBzZWNyZXQgZW5jcnlwdGlvbiBwcm9jZXNzLCB0aGUgY2lyY3VtdmVudGlvbiBvZiB3aGljaCBtYXkgZXhwb3NlCit5b3UgdG8gY2l2aWwgYW5kIGNyaW1pbmFsIHByb3NlY3V0aW9uIHVuZGVyIHRoZSBETUNBIGFuZCBvdGhlciBhcHBsaWNhYmxlCitsYXdzLgorCitUbyByZXNvbHZlIHRoZSBrZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBYNTA5RGF0YSBpbiBgc2lnbmF0dXJlLXg1MDktaXMueG1sJywKK2BzaWduYXR1cmUteDUwOS1za2kueG1sJyBhbmQgYHNpZ25hdHVyZS14NTA5LXNuLnhtbCcgeW91IG5lZWQgdG8gcmVzb2x2ZQordGhlIGlkZW50aWZpZWQgY2VydGlmaWNhdGUgZnJvbSB0aG9zZSBpbiB0aGUgYGNlcnRzJyBkaXJlY3RvcnkuCisKK0luIGBzaWduYXR1cmUteDUwOS1jcnQtY3JsLnhtbCcgYW4gWC41MDkgQ1JMIGlzIHByZXNlbnQgd2hpY2ggaGFzIHJldm9rZWQKK3RoZSBYLjUwOSBjZXJ0aWZpY2F0ZSB1c2VkIGZvciBzaWduaW5nLiBTbyB2ZXJpZmljYXRpb24gc2hvdWxkIGJlCitxdWFsaWZpZWQuCisKK01lcmxpbiBIdWdoZXMgPG1lcmxpbkBiYWx0aW1vcmUuaWU+CitCYWx0aW1vcmUgVGVjaG5vbG9naWVzLCBMdGQuCisKK1R1ZXNkYXksIE1heSAxNSwgMjAwMQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vc2lnbmF0dXJlLWtleW5hbWUueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vc2lnbmF0dXJlLWtleW5hbWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Zjc3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUta2V5bmFtZS54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KKyAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9TaWduZWRJbmZvPgorICA8U2lnbmF0dXJlVmFsdWU+CisgICAgS1RlMUg1SGpwOGh3YWhORm9VcUhEdVBKTk5xaFMxVTNCQkJINS9nQnlJdE5Jd1YxOG5NaUxxNEt1bnpGbk9xRAorICAgIHh6VHVPMC9UK3dzb1lDMXhPRXVDRHh5SXVqTkNhSmZMaCtyQ2k1VEh1bG5jOEtTSEhFb1BRKzdmQTFWam1PMzEKKyAgICAyaXcxaUVOT2k3bS8vd3pLbElIdXhaQ0o1bnZvbFQyMVBWNm5TRTRESGxBPQorICA8L1NpZ25hdHVyZVZhbHVlPgorICA8S2V5SW5mbz4KKyAgICA8S2V5TmFtZT5MdWdoPC9LZXlOYW1lPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL3NpZ25hdHVyZS1yZXRyaWV2YWxtZXRob2QtcmF3eDUwOWNydC54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLXJhd3g1MDljcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2MxNzAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLXJhd3g1MDljcnQueG1sCkBAIC0wLDAgKzEsMTkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEZud3NTQ1dUNlJFVy84UW5PanYwQksrcjNMeS80YUIrK3BOblpwOXBuejhmNytqMzNlS1NqMXNveVFMcTV6bU4KKyAgICBGd3llZVFobmxUYlIxa2Z2ZTAxNHViOXVIVkM5QTFjZm1HWnhRRjFEQytlbkh0K0FBUEphYTI3OC9vY2dwTWI1CisgICAgR2libDR3N2UzSEFkQm4vUkpDckZKSDc3d1kyb1U1T2IweklRdEVDVk5Kaz0KKyAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgPEtleUluZm8+CisgICAgPFJldHJpZXZhbE1ldGhvZCBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcmF3WDUwOUNlcnRpZmljYXRlIiBVUkk9ImNlcnRzL2JhbG9yLmNydCIgLz4KKyAgPC9LZXlJbmZvPgorPC9TaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUteDUwOS1jcnQtY3JsLnhtbCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL3NpZ25hdHVyZS14NTA5LWNydC1jcmwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODc3NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUteDUwOS1jcnQtY3JsLnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDxTaWduZWRJbmZvPgorICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+CisgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBEck5WcUtPaWxQc3dFd0NpbFozRWtqRnlRb2Y1QkpBYkFkaTJJOHFadUpBc0w3ZDE4MG5XZS94UEFVUkhDNklSCisgICAgdDJ4SmtOZ0N4cmdkcHk5Ly8yVXphZUU2NVVSaTJUSGdiUFcxZmhycDZkVmVKeWhpcTlZZkowT2ZuN29lQURrdAorICAgIGtkM2paaXBVVUc3VUdRMG96M2JNYVo2T2FHWUxreWduVVhXaDVFSHBnNEE9CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxYNTA5RGF0YT4KKyAgICAgIDxYNTA5Q2VydGlmaWNhdGU+CisgICAgICAgIE1JSUN3VENDQWlxZ0F3SUJBZ0lHQU9aNzVhQ1pNQTBHQ1NxR1NJYjNEUUVCQlFVQU1HNHhDekFKQmdOVkJBWVQKKyAgICAgICAgQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eEpUQWpCZ05WQkFvVEhFSmhiSFJwYlc5eVpTQlVaV05vYm05cworICAgICAgICBiMmRwWlhNc0lFeDBaQzR4RVRBUEJnTlZCQXNUQ0ZndlUyVmpkWEpsTVJRd0VnWURWUVFERXd0WUwxTmxZM1Z5CisgICAgICAgIFpTQkRRVEFlRncwd01UQTFNVFV4TURBMU1qUmFGdzB3TWpBMU1UVXhNREEwTXpkYU1HY3hDekFKQmdOVkJBWVQKKyAgICAgICAgQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eEpUQWpCZ05WQkFvVEhFSmhiSFJwYlc5eVpTQlVaV05vYm05cworICAgICAgICBiMmRwWlhNc0lFeDBaQzR4RVRBUEJnTlZCQXNUQ0ZndlUyVmpkWEpsTVEwd0N3WURWUVFERXdSQ2NtVnpNSUdmCisgICAgICAgIE1BMEdDU3FHU0liM0RRRUJBUVVBQTRHTkFEQ0JpUUtCZ1FEQVF0UkVxY1BKa2VHWGNDT1JzL1N3Y0hMaDl5U3cKKyAgICAgICAgdFFOVFV2VFFtNTRoQkxiVExoSlEyME5KZjQ2WjRZU05vYUk3SVQ0eDhmaXYrSlpMTnJRYzJJU0daQmliTVZaNAorICAgICAgICA0WnZTV1lsczdkOVF1clJsdHZRMm9DcURoVU1TWGNHWTNISm1lRXpJVElmZGg2Ykl1U1Ewc0RBWE55Z1ZoR3IvCisgICAgICAgIHZWYVVPeXhyMUFvdXRRSURBUUFCbzNFd2J6QU9CZ05WSFE4QkFmOEVCQU1DQjRBd0VRWURWUjBPQkFvRUNJejIKKyAgICAgICAgcTFXNmMyS1RNRFVHQTFVZEVnUXVNQ3lHS21oMGRIQTZMeTkzZDNjdVltRnNkR2x0YjNKbExtTnZiUzl3Y205aworICAgICAgICBkV04wY3k5NGMyVmpkWEpsTHpBVEJnTlZIU01FRERBS2dBaUY3QjhLajM4YTBUQU5CZ2txaGtpRzl3MEJBUVVGCisgICAgICAgIEFBT0JnUUF6RmhueGppNStVZEo2dGJmUktUZmhRRzBKV3JXaVFSeTBOM2xyQVhRbnBRQkZqT2p0UlBSaVI1U1QKKyAgICAgICAgdlJRYlJOckdsamVnSXBvRkZLMTJVajlCeFA2eCt1WlVxektEZkZxV0VOMHM5WTlZUWRrbCtETjlqWlp3Z0s2TgorICAgICAgICBLWUdxaDQzSElvUEtHYjFVUTkzdFRHVytGNHlnTnhIbHV2TzFPdnRrdThhUEJuNGlkUT09CisgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICA8L1g1MDlEYXRhPgorICAgIDxYNTA5RGF0YT4KKyAgICAgIDxYNTA5Q1JMPgorICAgICAgICBNSUlCZGpDQjRBSUJBVEFOQmdrcWhraUc5dzBCQVFVRkFEQnVNUXN3Q1FZRFZRUUdFd0pKUlRFUE1BMEdBMVVFCisgICAgICAgIENCTUdSSFZpYkdsdU1TVXdJd1lEVlFRS0V4eENZV3gwYVcxdmNtVWdWR1ZqYUc1dmJHOW5hV1Z6TENCTWRHUXUKKyAgICAgICAgTVJFd0R3WURWUVFMRXdoWUwxTmxZM1Z5WlRFVU1CSUdBMVVFQXhNTFdDOVRaV04xY21VZ1EwRVhEVEF4TURVeAorICAgICAgICBOVEV3TkRVd01Gb1hEVEF4TURreU1ERXdORFV3TUZvd0dUQVhBZ1lBNW52bG9Ka1hEVEF4TURVeE5URXdORFV3CisgICAgICAgIE1GcWdJekFoTUFvR0ExVWRGQVFEQWdFQU1CTUdBMVVkSXdRTU1BcUFDSVhzSHdxUGZ4clJNQTBHQ1NxR1NJYjMKKyAgICAgICAgRFFFQkJRVUFBNEdCQURWUGl5SjRRK0tyM0IvR0dtaC9LYlZ0U1B2NXgxemZmR3hwMVh3VjVjVk9ta3NWcktOeAorICAgICAgICByQ3c4NkswWkx4Vmd5MXJJcWw4K2kxYjl1M096dW82VmhVMGVsL05GMlR0bzJqQXl5MGorUFBLMlh2MS9BVFF4CisgICAgICAgIEoyUEsrVHk5dmttKzdqanVyZmVKVnZBQzhEK1dGQkFoL0pXSXptTVhBOGNNQmZURkJSUGhaUWFvCisgICAgICA8L1g1MDlDUkw+CisgICAgPC9YNTA5RGF0YT4KKyAgPC9LZXlJbmZvPgorPC9TaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUteDUwOS1jcnQueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vc2lnbmF0dXJlLXg1MDktY3J0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODExODIwCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vc2lnbmF0dXJlLXg1MDktY3J0LnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDxTaWduZWRJbmZvPgorICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+CisgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBaclJPeEljT1NCdnQ1ejJrckVoUUdTVklvNG9Bd1RKd0dBb0ZpV3VjdnZFdFk5azBMMlI1UlZIQm5IQ3prNUdUCisgICAga0hHYVQ4U1VxdG5EZWlINlcvMkZOZmNpaVYvdzFweFVSdk5jeVc4Y1lDbjFCNVhGNjh2SUxYVWFwdFdmMERLdworICAgIER2Q0ZTK3VMaDBBQ3VFVWZwZTFEeDFmd0I4NWxwSzJpUWNweDlkUGFDNE09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxYNTA5RGF0YT4KKyAgICAgIDxYNTA5Q2VydGlmaWNhdGU+CisgICAgICAgIE1JSUN3ekNDQWl5Z0F3SUJBZ0lHQU9aNzVRaEhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1HNHhDekFKQmdOVkJBWVQKKyAgICAgICAgQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eEpUQWpCZ05WQkFvVEhFSmhiSFJwYlc5eVpTQlVaV05vYm05cworICAgICAgICBiMmRwWlhNc0lFeDBaQzR4RVRBUEJnTlZCQXNUQ0ZndlUyVmpkWEpsTVJRd0VnWURWUVFERXd0WUwxTmxZM1Z5CisgICAgICAgIFpTQkRRVEFlRncwd01UQTFNVFV4TURBME5EVmFGdzB3TWpBMU1UVXhNREEwTXpkYU1Ha3hDekFKQmdOVkJBWVQKKyAgICAgICAgQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eEpUQWpCZ05WQkFvVEhFSmhiSFJwYlc5eVpTQlVaV05vYm05cworICAgICAgICBiMmRwWlhNc0lFeDBaQzR4RVRBUEJnTlZCQXNUQ0ZndlUyVmpkWEpsTVE4d0RRWURWUVFERXdaTmIzSnBaM1V3CisgICAgICAgIGdaOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFMVDRGSmt4dStiQjVsT3dZYStpckliN3NKVTcKKyAgICAgICAgOXNSUWJZWW5mdzM1RDdOUWtpZytMdmkyTFhYb0E2QUJ1bGwyYkYrZ3Urc2dSemV6ek9zNlZzVEw4ejU3VEl6MgorICAgICAgICA0OEhhTUluRmpPaXFTQU5telFLbFh2MVBqWFN4U3lIUmkvM3hjOGdNZm1DeGVTUENaNVZwVWlRb0o1WnBXY0R6CisgICAgICAgIC9MS3ZiMGw5WDBZQnpNWmxBZ01CQUFHamNUQnZNQTRHQTFVZER3RUIvd1FFQXdJSGdEQVJCZ05WSFE0RUNnUUkKKyAgICAgICAgaGJpczM1bEljdTh3TlFZRFZSMFNCQzR3TElZcWFIUjBjRG92TDNkM2R5NWlZV3gwYVcxdmNtVXVZMjl0TDNCeQorICAgICAgICBiMlIxWTNSekwzaHpaV04xY21Vdk1CTUdBMVVkSXdRTU1BcUFDSVhzSHdxUGZ4clJNQTBHQ1NxR1NJYjNEUUVCCisgICAgICAgIEJRVUFBNEdCQUdTQmRQb3U1Q1dBaXlTNS9mNDZtMDBtSUlxTzN4bDZaWE9jL0RSYmxGNGdXbmVzZDJGNXYvczYKKyAgICAgICAgbEFicUs4K3dKTTZHeHZwT2tTcDZPMXE2aFpSeXpGODZRUGxYQ2ZoS0FYa2d6SFh0YjZQZlQybTl0MGlhd25qeQorICAgICAgICBQK295WW9mbkZVNUZGVk9DdWpTcm1GeDNGQ1UrV2c2UlQzdjFqUm9NM1lmTVlaWUV6ZlRUCisgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL3NpZ25hdHVyZS14NTA5LWlzLnhtbCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL3NpZ25hdHVyZS14NTA5LWlzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTU4MTFlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vc2lnbmF0dXJlLXg1MDktaXMueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIHBqbHQ0VVF4STk1NFRJaWNzY3RUeFJrNHFDNHRGL2gyWTBrbWl2WHZ5VVU4RVBvYUNIOGJJcmNGV3o3STdDM1AKKyAgICA3TlppMzQxaXRqU1dBOWNGblNCS2JvQlB2S3hQTU1tWVNoc1ZNRkJEeUIyamlGMVQzUWM0Qy9FMEJKcFIvTnRuCisgICAgdUJVTkJQTnhDMFRVanVTN2ZJWWt1M05wVlZiSXYxT1AwT3FXTmkwS0ROMD0KKyAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgPEtleUluZm8+CisgICAgPFg1MDlEYXRhPgorICAgICAgPFg1MDlJc3N1ZXJTZXJpYWw+CisgICAgICAgIDxYNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgICBDTj1YL1NlY3VyZSBDQSxPVT1YL1NlY3VyZSxPPUJhbHRpbW9yZSBUZWNobm9sb2dpZXNcLCBMdGQuLFNUPUR1YmxpbixDPUlFCisgICAgICAgIDwvWDUwOUlzc3Vlck5hbWU+CisgICAgICAgIDxYNTA5U2VyaWFsTnVtYmVyPjk4OTkyMTA5ODkxMjwvWDUwOVNlcmlhbE51bWJlcj4KKyAgICAgIDwvWDUwOUlzc3VlclNlcmlhbD4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWVpZ2h0ZWVuL3NpZ25hdHVyZS14NTA5LXNraS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUteDUwOS1za2kueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjFmNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUteDUwOS1za2kueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3JzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIG9kUURzMGRNY2tqbzNoclFWWmZ4NzNTQkRBUjc1YkthYS92b2VmYkIyZit1S3ZMTVFERjFDZUI4d0E3dm1sRFYKKyAgICBvSkplMy8xOHZ2YXdTaldnSW93Ti9LUjdFWndrY3Z0dzlobmIxUVlFZGRYK0N1ZWVDZmRFdnA1NTNuSVB0aWJnCisgICAgeis3N3dBYlZxMVZDT0VzcHgzZ245RFpjTEplR0hrYWVlVFFOcGxZa244ND0KKyAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgPEtleUluZm8+CisgICAgPFg1MDlEYXRhPgorICAgICAgPFg1MDlTS0k+CisgICAgICAgIGlJZyt6RWxDUFowPQorICAgICAgPC9YNTA5U0tJPgorICAgIDwvWDUwOURhdGE+CisgIDwvS2V5SW5mbz4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vc2lnbmF0dXJlLXg1MDktc24ueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vc2lnbmF0dXJlLXg1MDktc24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1laWdodGVlbi9zaWduYXR1cmUteDUwOS1zbi54bWwKQEAgLTAsMCArMSwyMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KKyAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9TaWduZWRJbmZvPgorICA8U2lnbmF0dXJlVmFsdWU+CisgICAgTDVFR3dtbFJtaUtIdTBTdU1FaEV3QXpGSzN1TldpZHFncGMrWkp3czhweUQvdVRaS2RTOTNHTVhseU11cDREagorICAgICtFOCtBRk5qOHpKMkp0UVVCQ2t5VE9TNlhqTXZTVTRRNC90bG02c3JqUk90SXZxcG53ZlVGMHpFdzVZc3dtbEYKKyAgICBUcFpZOTJFVVFFaUFFckR0OUxMOVpPeTNmVEFieXhzMFdDelFFR29PREU4PQorICA8L1NpZ25hdHVyZVZhbHVlPgorICA8S2V5SW5mbz4KKyAgICA8WDUwOURhdGE+CisgICAgICA8WDUwOVN1YmplY3ROYW1lPgorICAgICAgICBDTj1CYWRiLE9VPVgvU2VjdXJlLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKKyAgICAgIDwvWDUwOVN1YmplY3ROYW1lPgorICAgIDwvWDUwOURhdGE+CisgIDwvS2V5SW5mbz4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZW52ZWxvcGVkLWRzYS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1maWZ0ZWVuL3NpZ25hdHVyZS1lbnZlbG9wZWQtZHNhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWM2M2M4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZW52ZWxvcGVkLWRzYS54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxFbnZlbG9wZSB4bWxucz0idXJuOmVudmVsb3BlIj4KKyAgPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgICAgPFNpZ25lZEluZm8+CisgICAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgLz4KKyAgICAgIDxSZWZlcmVuY2UgVVJJPSIiPgorICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiIC8+CisgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICA8RGlnZXN0VmFsdWU+SzhNL2xQYktudU1Ec08wVXp1ajc1bFF0elFJPTwvRGlnZXN0VmFsdWU+CisgICAgICA8L1JlZmVyZW5jZT4KKyAgICA8L1NpZ25lZEluZm8+CisgICAgPFNpZ25hdHVyZVZhbHVlPgorICAgICAgRHBFeWxoUW9pVUtCb0tXbVlmYWpYTzdMWnhpRFlnVnRVdENOeVRnd1pnb0Noem9yQTJuaGtRPT0KKyAgICA8L1NpZ25hdHVyZVZhbHVlPgorICAgIDxLZXlJbmZvPgorICAgICAgPEtleVZhbHVlPgorICAgICAgICA8RFNBS2V5VmFsdWU+CisgICAgICAgICAgPFA+CisgICAgICAgICAgICByRnRvOHVQUU02eTM0RkxQbURoNDBCTEoxclZyQzhWZVJxdXVoUFo2allORmtRdXd4bnUvd0N2SUFNaHVrUEJMCisgICAgICAgICAgICBGRVQ4YkpmL2IyZWYrb3F4WmFqRWIrODh6bFpveUc4Zy93TWZEQkhUeHorQ25vd0xhaG5DQ1RZQnA1a3Q3RzhxCisgICAgICAgICAgICBVb2JKdXZqeWx3ajFzdDdWOUxzdTAzaVhNWHRiaXJpVWpGYTVnVVJhc044PQorICAgICAgICAgIDwvUD4KKyAgICAgICAgICA8UT4KKyAgICAgICAgICAgIGtFakFGcENlNGxjVU9kd3BocHpmK3RCYVVkcz0KKyAgICAgICAgICA8L1E+CisgICAgICAgICAgPEc+CisgICAgICAgICAgICBvZTE0UjJPdHlLeCtzKzYwTzVCUk5NT1lwSWcyVFUvZjE1TjNic0RFcktPV3RLWGVOSzlGUzdkV1N0cmVEeG8yCisgICAgICAgICAgICBTU2dPb25xQWQ0RnVKLzR1dmE3R2dOTDRVTElxWTdFK21XNWl3SjduL1dURUxoOThtRW9jc0xYa05oMjRIY0g0CisgICAgICAgICAgICBCWmZTQ1RydXV6bUN5amRWMUtTcVgvRXV4MDRIZkNXWW1keE4zU1EvcXF3PQorICAgICAgICAgIDwvRz4KKyAgICAgICAgICA8WT4KKyAgICAgICAgICAgIHBBNU5uWnZjZDU3NFdSWHVPQTdaZkMvN0xxdDRjQjBNUkxXdEh1YnRKb1ZPYW85aWI1cnk0clRrMHI2ZGRuT3YKKyAgICAgICAgICAgIEFJR0trdHV0ekszeW12S2xlUzNET3J3WlFnSisvQkRXRFc4a085UjY2bzZyZGppU29iQmkvMGMyVjErZGtxT2cKKyAgICAgICAgICAgIGpGbUt6Mzk1bXZDT1pHaEM3ZnFBVmhIYXQyRWpHUE1mZ1NaeUFCYTcrMWs9CisgICAgICAgICAgPC9ZPgorICAgICAgICA8L0RTQUtleVZhbHVlPgorICAgICAgPC9LZXlWYWx1ZT4KKyAgICAgIDxYNTA5RGF0YT4KKyAgICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgICBNSUlEYlRDQ0F5eWdBd0lCQWdJR0FPQ2RyS3hrTUFrR0J5cUdTTTQ0QkFNd2V6RUxNQWtHQTFVRUJoTUNTVVV4CisgICAgICAgICAgRHpBTkJnTlZCQWdUQmtSMVlteHBiakVsTUNNR0ExVUVDaE1jUW1Gc2RHbHRiM0psSUZSbFkyaHViMnh2WjJsbAorICAgICAgICAgIGN5d2dUSFJrTGpFUk1BOEdBMVVFQ3hNSVdDOVRaV04xY21VeElUQWZCZ05WQkFNVEdGZ3ZVMlZqZFhKbElERXcKKyAgICAgICAgICBNalF0WW1sMElFUlRRU0JEUVRBZUZ3MHdNREEzTWpjeE56RXpNek5hRncwd01UQTNNamN4TnpFek1qWmFNSHd4CisgICAgICAgICAgQ3pBSkJnTlZCQVlUQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eEpUQWpCZ05WQkFvVEhFSmhiSFJwYlc5eQorICAgICAgICAgIFpTQlVaV05vYm05c2IyZHBaWE1zSUV4MFpDNHhFVEFQQmdOVkJBc1RDRmd2VTJWamRYSmxNU0l3SUFZRFZRUUQKKyAgICAgICAgICBFeGxZTDFObFkzVnlaU0F4TURJMExXSnBkQ0JFVTBFZ1kzSjBNSUlCdURDQ0FTd0dCeXFHU000NEJBRXdnZ0VmCisgICAgICAgICAgQW9HQkFLeGJhUExqMERPc3QrQlN6NWc0ZU5BU3lkYTFhd3ZGWGthcnJvVDJlbzJEUlpFTHNNWjd2OEFyeUFESQorICAgICAgICAgIGJwRHdTeFJFL0d5WC8yOW5uL3FLc1dXb3hHL3ZQTTVXYU1odklQOERId3dSMDhjL2dwNk1DMm9ad2drMkFhZVoKKyAgICAgICAgICBMZXh2S2xLR3licjQ4cGNJOWJMZTFmUzdMdE40bHpGN1c0cTRsSXhXdVlGRVdyRGZBaFVBa0VqQUZwQ2U0bGNVCisgICAgICAgICAgT2R3cGhwemYrdEJhVWRzQ2dZRUFvZTE0UjJPdHlLeCtzKzYwTzVCUk5NT1lwSWcyVFUvZjE1TjNic0RFcktPVworICAgICAgICAgIHRLWGVOSzlGUzdkV1N0cmVEeG8yU1NnT29ucUFkNEZ1Si80dXZhN0dnTkw0VUxJcVk3RSttVzVpd0o3bi9XVEUKKyAgICAgICAgICBMaDk4bUVvY3NMWGtOaDI0SGNINEJaZlNDVHJ1dXptQ3lqZFYxS1NxWC9FdXgwNEhmQ1dZbWR4TjNTUS9xcXdECisgICAgICAgICAgZ1lVQUFvR0JBS1FPVFoyYjNIZWUrRmtWN2pnTzJYd3YreTZyZUhBZERFUzFyUjdtN1NhRlRtcVBZbSthOHVLMAorICAgICAgICAgIDVOSytuWFp6cndDQmlwTGJyY3l0OHByeXBYa3R3enE4R1VJQ2Z2d1ExZzF2SkR2VWV1cU9xM1k0a3FHd1l2OUgKKyAgICAgICAgICBObGRmblpLam9JeFppczkvZVpyd2ptUm9RdTM2Z0ZZUjJyZGhJeGp6SDRFbWNnQVd1L3Rab3pzd09UQVBCZ05WCisgICAgICAgICAgSFE4QkFmOEVCUU1EQUlBQU1CRUdBMVVkRGdRS0JBaUE0SU1MNGRuZEVEQVRCZ05WSFNNRUREQUtnQWlIb01uWQorICAgICAgICAgIG5EeFpVREFKQmdjcWhrak9PQVFEQXpBQU1DMENGUUNFWGExRTJ1ZUo4V01YNW5QMWxDY0JXaHhDMndJVUdVQ0IKKyAgICAgICAgICBiNk02T2ozTlFBSmJuWnNkWTYzckthMD0KKyAgICAgICAgPC9YNTA5Q2VydGlmaWNhdGU+CisgICAgICA8L1g1MDlEYXRhPgorICAgIDwvS2V5SW5mbz4KKyAgPC9TaWduYXR1cmU+Cis8L0VudmVsb3BlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZW52ZWxvcGluZy1iNjQtZHNhLnhtbCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vc2lnbmF0dXJlLWVudmVsb3BpbmctYjY0LWRzYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTliZjk0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vc2lnbmF0dXJlLWVudmVsb3BpbmctYjY0LWRzYS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9IiNvYmplY3QiPgorICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjYmFzZTY0IiAvPgorICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPk42cGp4M09ZMlZSSE1tTGhvQVY4SG1NdTJuYz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBXK2xyUEpjZlQwVXlqL0FYeXU5WDJYTHNUdkJvNlJzOEdOWlVOVVQ0Lyt3eDNIWXV2L0JvdlE9PQorICA8L1NpZ25hdHVyZVZhbHVlPgorICA8S2V5SW5mbz4KKyAgICA8S2V5VmFsdWU+CisgICAgICA8RFNBS2V5VmFsdWU+CisgICAgICAgIDxQPgorICAgICAgICAgIHJGdG84dVBRTTZ5MzRGTFBtRGg0MEJMSjFyVnJDOFZlUnF1dWhQWjZqWU5Ga1F1d3hudS93Q3ZJQU1odWtQQkwKKyAgICAgICAgICBGRVQ4YkpmL2IyZWYrb3F4WmFqRWIrODh6bFpveUc4Zy93TWZEQkhUeHorQ25vd0xhaG5DQ1RZQnA1a3Q3RzhxCisgICAgICAgICAgVW9iSnV2anlsd2oxc3Q3VjlMc3UwM2lYTVh0YmlyaVVqRmE1Z1VSYXNOOD0KKyAgICAgICAgPC9QPgorICAgICAgICA8UT4KKyAgICAgICAgICBrRWpBRnBDZTRsY1VPZHdwaHB6Zit0QmFVZHM9CisgICAgICAgIDwvUT4KKyAgICAgICAgPEc+CisgICAgICAgICAgb2UxNFIyT3R5S3grcys2ME81QlJOTU9ZcElnMlRVL2YxNU4zYnNERXJLT1d0S1hlTks5RlM3ZFdTdHJlRHhvMgorICAgICAgICAgIFNTZ09vbnFBZDRGdUovNHV2YTdHZ05MNFVMSXFZN0UrbVc1aXdKN24vV1RFTGg5OG1Fb2NzTFhrTmgyNEhjSDQKKyAgICAgICAgICBCWmZTQ1RydXV6bUN5amRWMUtTcVgvRXV4MDRIZkNXWW1keE4zU1EvcXF3PQorICAgICAgICA8L0c+CisgICAgICAgIDxZPgorICAgICAgICAgIHBBNU5uWnZjZDU3NFdSWHVPQTdaZkMvN0xxdDRjQjBNUkxXdEh1YnRKb1ZPYW85aWI1cnk0clRrMHI2ZGRuT3YKKyAgICAgICAgICBBSUdLa3R1dHpLM3ltdktsZVMzRE9yd1pRZ0orL0JEV0RXOGtPOVI2Nm82cmRqaVNvYkJpLzBjMlYxK2RrcU9nCisgICAgICAgICAgakZtS3ozOTVtdkNPWkdoQzdmcUFWaEhhdDJFakdQTWZnU1p5QUJhNysxaz0KKyAgICAgICAgPC9ZPgorICAgICAgPC9EU0FLZXlWYWx1ZT4KKyAgICA8L0tleVZhbHVlPgorICAgIDxYNTA5RGF0YT4KKyAgICAgIDxYNTA5Q2VydGlmaWNhdGU+CisgICAgICAgIE1JSURiVENDQXl5Z0F3SUJBZ0lHQU9DZHJLeGtNQWtHQnlxR1NNNDRCQU13ZXpFTE1Ba0dBMVVFQmhNQ1NVVXgKKyAgICAgICAgRHpBTkJnTlZCQWdUQmtSMVlteHBiakVsTUNNR0ExVUVDaE1jUW1Gc2RHbHRiM0psSUZSbFkyaHViMnh2WjJsbAorICAgICAgICBjeXdnVEhSa0xqRVJNQThHQTFVRUN4TUlXQzlUWldOMWNtVXhJVEFmQmdOVkJBTVRHRmd2VTJWamRYSmxJREV3CisgICAgICAgIE1qUXRZbWwwSUVSVFFTQkRRVEFlRncwd01EQTNNamN4TnpFek16TmFGdzB3TVRBM01qY3hOekV6TWpaYU1Id3gKKyAgICAgICAgQ3pBSkJnTlZCQVlUQWtsRk1ROHdEUVlEVlFRSUV3WkVkV0pzYVc0eEpUQWpCZ05WQkFvVEhFSmhiSFJwYlc5eQorICAgICAgICBaU0JVWldOb2JtOXNiMmRwWlhNc0lFeDBaQzR4RVRBUEJnTlZCQXNUQ0ZndlUyVmpkWEpsTVNJd0lBWURWUVFECisgICAgICAgIEV4bFlMMU5sWTNWeVpTQXhNREkwTFdKcGRDQkVVMEVnWTNKME1JSUJ1RENDQVN3R0J5cUdTTTQ0QkFFd2dnRWYKKyAgICAgICAgQW9HQkFLeGJhUExqMERPc3QrQlN6NWc0ZU5BU3lkYTFhd3ZGWGthcnJvVDJlbzJEUlpFTHNNWjd2OEFyeUFESQorICAgICAgICBicER3U3hSRS9HeVgvMjlubi9xS3NXV294Ry92UE01V2FNaHZJUDhESHd3UjA4Yy9ncDZNQzJvWndnazJBYWVaCisgICAgICAgIExleHZLbEtHeWJyNDhwY0k5YkxlMWZTN0x0TjRsekY3VzRxNGxJeFd1WUZFV3JEZkFoVUFrRWpBRnBDZTRsY1UKKyAgICAgICAgT2R3cGhwemYrdEJhVWRzQ2dZRUFvZTE0UjJPdHlLeCtzKzYwTzVCUk5NT1lwSWcyVFUvZjE1TjNic0RFcktPVworICAgICAgICB0S1hlTks5RlM3ZFdTdHJlRHhvMlNTZ09vbnFBZDRGdUovNHV2YTdHZ05MNFVMSXFZN0UrbVc1aXdKN24vV1RFCisgICAgICAgIExoOThtRW9jc0xYa05oMjRIY0g0QlpmU0NUcnV1em1DeWpkVjFLU3FYL0V1eDA0SGZDV1ltZHhOM1NRL3Fxd0QKKyAgICAgICAgZ1lVQUFvR0JBS1FPVFoyYjNIZWUrRmtWN2pnTzJYd3YreTZyZUhBZERFUzFyUjdtN1NhRlRtcVBZbSthOHVLMAorICAgICAgICA1TksrblhaenJ3Q0JpcExicmN5dDhwcnlwWGt0d3pxOEdVSUNmdndRMWcxdkpEdlVldXFPcTNZNGtxR3dZdjlICisgICAgICAgIE5sZGZuWktqb0l4WmlzOS9lWnJ3am1Sb1F1MzZnRllSMnJkaEl4anpINEVtY2dBV3UvdFpvenN3T1RBUEJnTlYKKyAgICAgICAgSFE4QkFmOEVCUU1EQUlBQU1CRUdBMVVkRGdRS0JBaUE0SU1MNGRuZEVEQVRCZ05WSFNNRUREQUtnQWlIb01uWQorICAgICAgICBuRHhaVURBSkJnY3Foa2pPT0FRREF6QUFNQzBDRlFDRVhhMUUydWVKOFdNWDVuUDFsQ2NCV2h4QzJ3SVVHVUNCCisgICAgICAgIGI2TTZPajNOUUFKYm5ac2RZNjNyS2EwPQorICAgICAgPC9YNTA5Q2VydGlmaWNhdGU+CisgICAgPC9YNTA5RGF0YT4KKyAgPC9LZXlJbmZvPgorICA8T2JqZWN0IElkPSJvYmplY3QiPmMyOXRaU0IwWlhoMDwvT2JqZWN0PgorPC9TaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1maWZ0ZWVuL3NpZ25hdHVyZS1lbnZlbG9waW5nLWRzYS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1maWZ0ZWVuL3NpZ25hdHVyZS1lbnZlbG9waW5nLWRzYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIzY2MwYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vc2lnbmF0dXJlLWVudmVsb3BpbmctZHNhLnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDxTaWduZWRJbmZvPgorICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+CisgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iI29iamVjdCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+Ny9YVHNIYUJTT25KL2pYRDV2MHpMNlZLWXNrPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIFNWc0ZJV3VBUmtBYUQ5SFpYaE5BU0hTaHgzOFVaaURTM0lzSWIyRFMxZUJVZEQ0VjcwRTZNQT09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxEU0FLZXlWYWx1ZT4KKyAgICAgICAgPFA+CisgICAgICAgICAgckZ0bzh1UFFNNnkzNEZMUG1EaDQwQkxKMXJWckM4VmVScXV1aFBaNmpZTkZrUXV3eG51L3dDdklBTWh1a1BCTAorICAgICAgICAgIEZFVDhiSmYvYjJlZitvcXhaYWpFYis4OHpsWm95RzhnL3dNZkRCSFR4eitDbm93TGFobkNDVFlCcDVrdDdHOHEKKyAgICAgICAgICBVb2JKdXZqeWx3ajFzdDdWOUxzdTAzaVhNWHRiaXJpVWpGYTVnVVJhc044PQorICAgICAgICA8L1A+CisgICAgICAgIDxRPgorICAgICAgICAgIGtFakFGcENlNGxjVU9kd3BocHpmK3RCYVVkcz0KKyAgICAgICAgPC9RPgorICAgICAgICA8Rz4KKyAgICAgICAgICBvZTE0UjJPdHlLeCtzKzYwTzVCUk5NT1lwSWcyVFUvZjE1TjNic0RFcktPV3RLWGVOSzlGUzdkV1N0cmVEeG8yCisgICAgICAgICAgU1NnT29ucUFkNEZ1Si80dXZhN0dnTkw0VUxJcVk3RSttVzVpd0o3bi9XVEVMaDk4bUVvY3NMWGtOaDI0SGNINAorICAgICAgICAgIEJaZlNDVHJ1dXptQ3lqZFYxS1NxWC9FdXgwNEhmQ1dZbWR4TjNTUS9xcXc9CisgICAgICAgIDwvRz4KKyAgICAgICAgPFk+CisgICAgICAgICAgcEE1Tm5admNkNTc0V1JYdU9BN1pmQy83THF0NGNCME1STFd0SHVidEpvVk9hbzlpYjVyeTRyVGswcjZkZG5PdgorICAgICAgICAgIEFJR0trdHV0ekszeW12S2xlUzNET3J3WlFnSisvQkRXRFc4a085UjY2bzZyZGppU29iQmkvMGMyVjErZGtxT2cKKyAgICAgICAgICBqRm1LejM5NW12Q09aR2hDN2ZxQVZoSGF0MkVqR1BNZmdTWnlBQmE3KzFrPQorICAgICAgICA8L1k+CisgICAgICA8L0RTQUtleVZhbHVlPgorICAgIDwvS2V5VmFsdWU+CisgICAgPFg1MDlEYXRhPgorICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgTUlJRGJUQ0NBeXlnQXdJQkFnSUdBT0Nkckt4a01Ba0dCeXFHU000NEJBTXdlekVMTUFrR0ExVUVCaE1DU1VVeAorICAgICAgICBEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWxNQ01HQTFVRUNoTWNRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsCisgICAgICAgIGN5d2dUSFJrTGpFUk1BOEdBMVVFQ3hNSVdDOVRaV04xY21VeElUQWZCZ05WQkFNVEdGZ3ZVMlZqZFhKbElERXcKKyAgICAgICAgTWpRdFltbDBJRVJUUVNCRFFUQWVGdzB3TURBM01qY3hOekV6TXpOYUZ3MHdNVEEzTWpjeE56RXpNalphTUh3eAorICAgICAgICBDekFKQmdOVkJBWVRBa2xGTVE4d0RRWURWUVFJRXdaRWRXSnNhVzR4SlRBakJnTlZCQW9USEVKaGJIUnBiVzl5CisgICAgICAgIFpTQlVaV05vYm05c2IyZHBaWE1zSUV4MFpDNHhFVEFQQmdOVkJBc1RDRmd2VTJWamRYSmxNU0l3SUFZRFZRUUQKKyAgICAgICAgRXhsWUwxTmxZM1Z5WlNBeE1ESTBMV0pwZENCRVUwRWdZM0owTUlJQnVEQ0NBU3dHQnlxR1NNNDRCQUV3Z2dFZgorICAgICAgICBBb0dCQUt4YmFQTGowRE9zdCtCU3o1ZzRlTkFTeWRhMWF3dkZYa2Fycm9UMmVvMkRSWkVMc01aN3Y4QXJ5QURJCisgICAgICAgIGJwRHdTeFJFL0d5WC8yOW5uL3FLc1dXb3hHL3ZQTTVXYU1odklQOERId3dSMDhjL2dwNk1DMm9ad2drMkFhZVoKKyAgICAgICAgTGV4dktsS0d5YnI0OHBjSTliTGUxZlM3THRONGx6RjdXNHE0bEl4V3VZRkVXckRmQWhVQWtFakFGcENlNGxjVQorICAgICAgICBPZHdwaHB6Zit0QmFVZHNDZ1lFQW9lMTRSMk90eUt4K3MrNjBPNUJSTk1PWXBJZzJUVS9mMTVOM2JzREVyS09XCisgICAgICAgIHRLWGVOSzlGUzdkV1N0cmVEeG8yU1NnT29ucUFkNEZ1Si80dXZhN0dnTkw0VUxJcVk3RSttVzVpd0o3bi9XVEUKKyAgICAgICAgTGg5OG1Fb2NzTFhrTmgyNEhjSDRCWmZTQ1RydXV6bUN5amRWMUtTcVgvRXV4MDRIZkNXWW1keE4zU1EvcXF3RAorICAgICAgICBnWVVBQW9HQkFLUU9UWjJiM0hlZStGa1Y3amdPMlh3dit5NnJlSEFkREVTMXJSN203U2FGVG1xUFltK2E4dUswCisgICAgICAgIDVOSytuWFp6cndDQmlwTGJyY3l0OHByeXBYa3R3enE4R1VJQ2Z2d1ExZzF2SkR2VWV1cU9xM1k0a3FHd1l2OUgKKyAgICAgICAgTmxkZm5aS2pvSXhaaXM5L2VacndqbVJvUXUzNmdGWVIycmRoSXhqekg0RW1jZ0FXdS90Wm96c3dPVEFQQmdOVgorICAgICAgICBIUThCQWY4RUJRTURBSUFBTUJFR0ExVWREZ1FLQkFpQTRJTUw0ZG5kRURBVEJnTlZIU01FRERBS2dBaUhvTW5ZCisgICAgICAgIG5EeFpVREFKQmdjcWhrak9PQVFEQXpBQU1DMENGUUNFWGExRTJ1ZUo4V01YNW5QMWxDY0JXaHhDMndJVUdVQ0IKKyAgICAgICAgYjZNNk9qM05RQUpiblpzZFk2M3JLYTA9CisgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+CisgIDxPYmplY3QgSWQ9Im9iamVjdCI+c29tZSB0ZXh0PC9PYmplY3Q+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vc2lnbmF0dXJlLWVudmVsb3BpbmctaG1hYy1zaGExLTQwLnhtbCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vc2lnbmF0dXJlLWVudmVsb3BpbmctaG1hYy1zaGExLTQwLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTA0ZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZW52ZWxvcGluZy1obWFjLXNoYTEtNDAueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2htYWMtc2hhMSI+CisgICAgICA8SE1BQ091dHB1dExlbmd0aD40MDwvSE1BQ091dHB1dExlbmd0aD4KKyAgICA8L1NpZ25hdHVyZU1ldGhvZD4KKyAgICA8UmVmZXJlbmNlIFVSST0iI29iamVjdCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+Ny9YVHNIYUJTT25KL2pYRDV2MHpMNlZLWXNrPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEhIaXF2Q1U9CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxPYmplY3QgSWQ9Im9iamVjdCI+c29tZSB0ZXh0PC9PYmplY3Q+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vc2lnbmF0dXJlLWVudmVsb3BpbmctaG1hYy1zaGExLnhtbCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vc2lnbmF0dXJlLWVudmVsb3BpbmctaG1hYy1zaGExLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM4MzQzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZW52ZWxvcGluZy1obWFjLXNoYTEueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2htYWMtc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iI29iamVjdCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+Ny9YVHNIYUJTT25KL2pYRDV2MHpMNlZLWXNrPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEpFbFB0dElUNEFtN1ErTU5vTXl2K1dEZkFadz0KKyAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgPE9iamVjdCBJZD0ib2JqZWN0Ij5zb21lIHRleHQ8L09iamVjdD4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZW52ZWxvcGluZy1yc2EueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZW52ZWxvcGluZy1yc2EueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MzE5MmMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1maWZ0ZWVuL3NpZ25hdHVyZS1lbnZlbG9waW5nLXJzYS54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9IiNvYmplY3QiPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPjcvWFRzSGFCU09uSi9qWEQ1djB6TDZWS1lzaz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBUVHgyb3BNNk9jTWk2emxhc1dFaFA5OTJkaTQ4MktoVG84MHBnaGVGeVNaY3B2b3JCNDdpOEZrZ0RqZnRkeGJuCisgICAgMnhsclpoMHJwMHYyZFZWeFd0TEZqVXB2Ti9aK2ZrRy9BWGlUM2tBaHpSQnFtWVlZWnhJdUN0UU01N3lvQnJJaAorICAgIC9uU3kzSFdzNXdEcXJvRkF4OXE1MnFNTWJLTmJud0hHNlkvSzFaaVZuTmc9CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxSU0FLZXlWYWx1ZT4KKyAgICAgICAgPE1vZHVsdXM+CisgICAgICAgICAgcWU1VlltTnhqZVVTUURFSTVsa0hORFh4ZlhwWGo5NU5pN3RjUTlESERTZ1VKMW0yZE53S3VibERWUVpEbW1sZgorICAgICAgICAgIEhKMm4vdXMrRVpUWk5VU1Q0R3F1YmxoZ3pjQ0N2WXE5ZGJVOG9xaUV6MGt0VElXQ1B5MzZVdlFjYVJ3dWZwaVYKKyAgICAgICAgICBSRmFURE5QcWpraldQck0yY25wZnlvSTd5ZGJWQ0JSZkk5eklTUWlSME1rPQorICAgICAgICA8L01vZHVsdXM+CisgICAgICAgIDxFeHBvbmVudD4KKyAgICAgICAgICBBUUFCCisgICAgICAgIDwvRXhwb25lbnQ+CisgICAgICA8L1JTQUtleVZhbHVlPgorICAgIDwvS2V5VmFsdWU+CisgIDwvS2V5SW5mbz4KKyAgPE9iamVjdCBJZD0ib2JqZWN0Ij5zb21lIHRleHQ8L09iamVjdD4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZXh0ZXJuYWwtYjY0LWRzYS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1maWZ0ZWVuL3NpZ25hdHVyZS1leHRlcm5hbC1iNjQtZHNhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTc2NWMyCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZmlmdGVlbi9zaWduYXR1cmUtZXh0ZXJuYWwtYjY0LWRzYS54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly94bWxkc2lnLnBvdGhvbGUuY29tL3htbC1zdHlsZXNoZWV0LnR4dCI+CisgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQiIC8+CisgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIGdVMGJsUWNYSkZIUjVNaFVJYjJDbHE3YmNUK05meE9HNXlMRlVkM1k4NVFOZlRhUjV2dSs2UT09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxEU0FLZXlWYWx1ZT4KKyAgICAgICAgPFA+CisgICAgICAgICAgckZ0bzh1UFFNNnkzNEZMUG1EaDQwQkxKMXJWckM4VmVScXV1aFBaNmpZTkZrUXV3eG51L3dDdklBTWh1a1BCTAorICAgICAgICAgIEZFVDhiSmYvYjJlZitvcXhaYWpFYis4OHpsWm95RzhnL3dNZkRCSFR4eitDbm93TGFobkNDVFlCcDVrdDdHOHEKKyAgICAgICAgICBVb2JKdXZqeWx3ajFzdDdWOUxzdTAzaVhNWHRiaXJpVWpGYTVnVVJhc044PQorICAgICAgICA8L1A+CisgICAgICAgIDxRPgorICAgICAgICAgIGtFakFGcENlNGxjVU9kd3BocHpmK3RCYVVkcz0KKyAgICAgICAgPC9RPgorICAgICAgICA8Rz4KKyAgICAgICAgICBvZTE0UjJPdHlLeCtzKzYwTzVCUk5NT1lwSWcyVFUvZjE1TjNic0RFcktPV3RLWGVOSzlGUzdkV1N0cmVEeG8yCisgICAgICAgICAgU1NnT29ucUFkNEZ1Si80dXZhN0dnTkw0VUxJcVk3RSttVzVpd0o3bi9XVEVMaDk4bUVvY3NMWGtOaDI0SGNINAorICAgICAgICAgIEJaZlNDVHJ1dXptQ3lqZFYxS1NxWC9FdXgwNEhmQ1dZbWR4TjNTUS9xcXc9CisgICAgICAgIDwvRz4KKyAgICAgICAgPFk+CisgICAgICAgICAgcEE1Tm5admNkNTc0V1JYdU9BN1pmQy83THF0NGNCME1STFd0SHVidEpvVk9hbzlpYjVyeTRyVGswcjZkZG5PdgorICAgICAgICAgIEFJR0trdHV0ekszeW12S2xlUzNET3J3WlFnSisvQkRXRFc4a085UjY2bzZyZGppU29iQmkvMGMyVjErZGtxT2cKKyAgICAgICAgICBqRm1LejM5NW12Q09aR2hDN2ZxQVZoSGF0MkVqR1BNZmdTWnlBQmE3KzFrPQorICAgICAgICA8L1k+CisgICAgICA8L0RTQUtleVZhbHVlPgorICAgIDwvS2V5VmFsdWU+CisgICAgPFg1MDlEYXRhPgorICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgTUlJRGJUQ0NBeXlnQXdJQkFnSUdBT0Nkckt4a01Ba0dCeXFHU000NEJBTXdlekVMTUFrR0ExVUVCaE1DU1VVeAorICAgICAgICBEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWxNQ01HQTFVRUNoTWNRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsCisgICAgICAgIGN5d2dUSFJrTGpFUk1BOEdBMVVFQ3hNSVdDOVRaV04xY21VeElUQWZCZ05WQkFNVEdGZ3ZVMlZqZFhKbElERXcKKyAgICAgICAgTWpRdFltbDBJRVJUUVNCRFFUQWVGdzB3TURBM01qY3hOekV6TXpOYUZ3MHdNVEEzTWpjeE56RXpNalphTUh3eAorICAgICAgICBDekFKQmdOVkJBWVRBa2xGTVE4d0RRWURWUVFJRXdaRWRXSnNhVzR4SlRBakJnTlZCQW9USEVKaGJIUnBiVzl5CisgICAgICAgIFpTQlVaV05vYm05c2IyZHBaWE1zSUV4MFpDNHhFVEFQQmdOVkJBc1RDRmd2VTJWamRYSmxNU0l3SUFZRFZRUUQKKyAgICAgICAgRXhsWUwxTmxZM1Z5WlNBeE1ESTBMV0pwZENCRVUwRWdZM0owTUlJQnVEQ0NBU3dHQnlxR1NNNDRCQUV3Z2dFZgorICAgICAgICBBb0dCQUt4YmFQTGowRE9zdCtCU3o1ZzRlTkFTeWRhMWF3dkZYa2Fycm9UMmVvMkRSWkVMc01aN3Y4QXJ5QURJCisgICAgICAgIGJwRHdTeFJFL0d5WC8yOW5uL3FLc1dXb3hHL3ZQTTVXYU1odklQOERId3dSMDhjL2dwNk1DMm9ad2drMkFhZVoKKyAgICAgICAgTGV4dktsS0d5YnI0OHBjSTliTGUxZlM3THRONGx6RjdXNHE0bEl4V3VZRkVXckRmQWhVQWtFakFGcENlNGxjVQorICAgICAgICBPZHdwaHB6Zit0QmFVZHNDZ1lFQW9lMTRSMk90eUt4K3MrNjBPNUJSTk1PWXBJZzJUVS9mMTVOM2JzREVyS09XCisgICAgICAgIHRLWGVOSzlGUzdkV1N0cmVEeG8yU1NnT29ucUFkNEZ1Si80dXZhN0dnTkw0VUxJcVk3RSttVzVpd0o3bi9XVEUKKyAgICAgICAgTGg5OG1Fb2NzTFhrTmgyNEhjSDRCWmZTQ1RydXV6bUN5amRWMUtTcVgvRXV4MDRIZkNXWW1keE4zU1EvcXF3RAorICAgICAgICBnWVVBQW9HQkFLUU9UWjJiM0hlZStGa1Y3amdPMlh3dit5NnJlSEFkREVTMXJSN203U2FGVG1xUFltK2E4dUswCisgICAgICAgIDVOSytuWFp6cndDQmlwTGJyY3l0OHByeXBYa3R3enE4R1VJQ2Z2d1ExZzF2SkR2VWV1cU9xM1k0a3FHd1l2OUgKKyAgICAgICAgTmxkZm5aS2pvSXhaaXM5L2VacndqbVJvUXUzNmdGWVIycmRoSXhqekg0RW1jZ0FXdS90Wm96c3dPVEFQQmdOVgorICAgICAgICBIUThCQWY4RUJRTURBSUFBTUJFR0ExVWREZ1FLQkFpQTRJTUw0ZG5kRURBVEJnTlZIU01FRERBS2dBaUhvTW5ZCisgICAgICAgIG5EeFpVREFKQmdjcWhrak9PQVFEQXpBQU1DMENGUUNFWGExRTJ1ZUo4V01YNW5QMWxDY0JXaHhDMndJVUdVQ0IKKyAgICAgICAgYjZNNk9qM05RQUpiblpzZFk2M3JLYTA9CisgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vc2lnbmF0dXJlLWV4dGVybmFsLWRzYS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1maWZ0ZWVuL3NpZ25hdHVyZS1leHRlcm5hbC1kc2EueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZjg2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1maWZ0ZWVuL3NpZ25hdHVyZS1leHRlcm5hbC1kc2EueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEZqOU93U3hwSnBwRG5paG9oZHV4RVVxdTkvcDZUUjlQcGdOR2FwYWlCSEdjWTJRVURCYU9Fdz09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxEU0FLZXlWYWx1ZT4KKyAgICAgICAgPFA+CisgICAgICAgICAgckZ0bzh1UFFNNnkzNEZMUG1EaDQwQkxKMXJWckM4VmVScXV1aFBaNmpZTkZrUXV3eG51L3dDdklBTWh1a1BCTAorICAgICAgICAgIEZFVDhiSmYvYjJlZitvcXhaYWpFYis4OHpsWm95RzhnL3dNZkRCSFR4eitDbm93TGFobkNDVFlCcDVrdDdHOHEKKyAgICAgICAgICBVb2JKdXZqeWx3ajFzdDdWOUxzdTAzaVhNWHRiaXJpVWpGYTVnVVJhc044PQorICAgICAgICA8L1A+CisgICAgICAgIDxRPgorICAgICAgICAgIGtFakFGcENlNGxjVU9kd3BocHpmK3RCYVVkcz0KKyAgICAgICAgPC9RPgorICAgICAgICA8Rz4KKyAgICAgICAgICBvZTE0UjJPdHlLeCtzKzYwTzVCUk5NT1lwSWcyVFUvZjE1TjNic0RFcktPV3RLWGVOSzlGUzdkV1N0cmVEeG8yCisgICAgICAgICAgU1NnT29ucUFkNEZ1Si80dXZhN0dnTkw0VUxJcVk3RSttVzVpd0o3bi9XVEVMaDk4bUVvY3NMWGtOaDI0SGNINAorICAgICAgICAgIEJaZlNDVHJ1dXptQ3lqZFYxS1NxWC9FdXgwNEhmQ1dZbWR4TjNTUS9xcXc9CisgICAgICAgIDwvRz4KKyAgICAgICAgPFk+CisgICAgICAgICAgcEE1Tm5admNkNTc0V1JYdU9BN1pmQy83THF0NGNCME1STFd0SHVidEpvVk9hbzlpYjVyeTRyVGswcjZkZG5PdgorICAgICAgICAgIEFJR0trdHV0ekszeW12S2xlUzNET3J3WlFnSisvQkRXRFc4a085UjY2bzZyZGppU29iQmkvMGMyVjErZGtxT2cKKyAgICAgICAgICBqRm1LejM5NW12Q09aR2hDN2ZxQVZoSGF0MkVqR1BNZmdTWnlBQmE3KzFrPQorICAgICAgICA8L1k+CisgICAgICA8L0RTQUtleVZhbHVlPgorICAgIDwvS2V5VmFsdWU+CisgICAgPFg1MDlEYXRhPgorICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgTUlJRGJUQ0NBeXlnQXdJQkFnSUdBT0Nkckt4a01Ba0dCeXFHU000NEJBTXdlekVMTUFrR0ExVUVCaE1DU1VVeAorICAgICAgICBEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWxNQ01HQTFVRUNoTWNRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsCisgICAgICAgIGN5d2dUSFJrTGpFUk1BOEdBMVVFQ3hNSVdDOVRaV04xY21VeElUQWZCZ05WQkFNVEdGZ3ZVMlZqZFhKbElERXcKKyAgICAgICAgTWpRdFltbDBJRVJUUVNCRFFUQWVGdzB3TURBM01qY3hOekV6TXpOYUZ3MHdNVEEzTWpjeE56RXpNalphTUh3eAorICAgICAgICBDekFKQmdOVkJBWVRBa2xGTVE4d0RRWURWUVFJRXdaRWRXSnNhVzR4SlRBakJnTlZCQW9USEVKaGJIUnBiVzl5CisgICAgICAgIFpTQlVaV05vYm05c2IyZHBaWE1zSUV4MFpDNHhFVEFQQmdOVkJBc1RDRmd2VTJWamRYSmxNU0l3SUFZRFZRUUQKKyAgICAgICAgRXhsWUwxTmxZM1Z5WlNBeE1ESTBMV0pwZENCRVUwRWdZM0owTUlJQnVEQ0NBU3dHQnlxR1NNNDRCQUV3Z2dFZgorICAgICAgICBBb0dCQUt4YmFQTGowRE9zdCtCU3o1ZzRlTkFTeWRhMWF3dkZYa2Fycm9UMmVvMkRSWkVMc01aN3Y4QXJ5QURJCisgICAgICAgIGJwRHdTeFJFL0d5WC8yOW5uL3FLc1dXb3hHL3ZQTTVXYU1odklQOERId3dSMDhjL2dwNk1DMm9ad2drMkFhZVoKKyAgICAgICAgTGV4dktsS0d5YnI0OHBjSTliTGUxZlM3THRONGx6RjdXNHE0bEl4V3VZRkVXckRmQWhVQWtFakFGcENlNGxjVQorICAgICAgICBPZHdwaHB6Zit0QmFVZHNDZ1lFQW9lMTRSMk90eUt4K3MrNjBPNUJSTk1PWXBJZzJUVS9mMTVOM2JzREVyS09XCisgICAgICAgIHRLWGVOSzlGUzdkV1N0cmVEeG8yU1NnT29ucUFkNEZ1Si80dXZhN0dnTkw0VUxJcVk3RSttVzVpd0o3bi9XVEUKKyAgICAgICAgTGg5OG1Fb2NzTFhrTmgyNEhjSDRCWmZTQ1RydXV6bUN5amRWMUtTcVgvRXV4MDRIZkNXWW1keE4zU1EvcXF3RAorICAgICAgICBnWVVBQW9HQkFLUU9UWjJiM0hlZStGa1Y3amdPMlh3dit5NnJlSEFkREVTMXJSN203U2FGVG1xUFltK2E4dUswCisgICAgICAgIDVOSytuWFp6cndDQmlwTGJyY3l0OHByeXBYa3R3enE4R1VJQ2Z2d1ExZzF2SkR2VWV1cU9xM1k0a3FHd1l2OUgKKyAgICAgICAgTmxkZm5aS2pvSXhaaXM5L2VacndqbVJvUXUzNmdGWVIycmRoSXhqekg0RW1jZ0FXdS90Wm96c3dPVEFQQmdOVgorICAgICAgICBIUThCQWY4RUJRTURBSUFBTUJFR0ExVWREZ1FLQkFpQTRJTUw0ZG5kRURBVEJnTlZIU01FRERBS2dBaUhvTW5ZCisgICAgICAgIG5EeFpVREFKQmdjcWhrak9PQVFEQXpBQU1DMENGUUNFWGExRTJ1ZUo4V01YNW5QMWxDY0JXaHhDMndJVUdVQ0IKKyAgICAgICAgYjZNNk9qM05RQUpiblpzZFk2M3JLYTA9CisgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXNpeHRlZW4vYmFkLXNpZ25hdHVyZS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1zaXh0ZWVuL2JhZC1zaWduYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyN2FiNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1zaXh0ZWVuL2JhZC1zaWduYXR1cmUueG1sCkBAIC0wLDAgKzEsMjQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCFET0NUWVBFIEVudmVsb3BlIFsKKyAgPCFFTlRJVFkgZHNpZyAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDwhRU5USVRZIGMxNG4gImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1Ij4KKyAgPCFFTlRJVFkgeHBhdGggImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhwYXRoLTE5OTkxMTE2Ij4KKyAgPCFFTlRJVFkgeHNsdCAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHNsdC0xOTk5MTExNiI+CisgIDwhQVRUTElTVCBOb3RhcmllcyBJZCBJRCAjSU1QTElFRD4KK10+Cis8IS0tIFByZWFtYmxlIC0tPgorPEVudmVsb3BlIHhtbG5zOmZvbz0iaHR0cDovL3d3dy51c3BzLmdvdi9mb28iIHhtbG5zPSJodHRwOi8vd3d3LnVzcHMuZ292LyI+CisgIDxEZWFyU2lyPmZvbzwvRGVhclNpcj4KKyAgPEJvZHk+YmFyPC9Cb2R5PgorICA8WW91cnNTaW5jZXJlbHk+CisgICAgPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIgSWQ9InNpZ25hdHVyZSI+CisgICAgICA8U2lnbmVkSW5mbz4KKyAgICAgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICAgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgLz4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly94bWxkc2lnLnBvdGhvbGUuY29tL3htbC1zdHlsZXNoZWV0LnR4dCI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIgLz4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIgVVJJPSIjb2JqZWN0LTEiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhwYXRoLTE5OTkxMTE2Ij4KKyAgICAgICAgICAgICAgPFhQYXRoPgorICAgICAgICAgICAgICAgIHNlbGY6OnRleHQoKQorICAgICAgICAgICAgICA8L1hQYXRoPgorICAgICAgICAgICAgPC9UcmFuc2Zvcm0+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+enlqcDhHSk9YNjk5OTBLa3F3OGlvUFhHRXhrPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiIFVSST0iIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNiI+CisgICAgICAgICAgICAgIDxYUGF0aCB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgICAgICAgICAgICAgICBhbmNlc3Rvci1vci1zZWxmOjpkc2lnOlNpZ25lZEluZm8KKyAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgIGNvdW50KGFuY2VzdG9yLW9yLXNlbGY6OmRzaWc6UmVmZXJlbmNlIHwKKyAgICAgICAgICAgICAgICAgICAgICBoZXJlKCkvYW5jZXN0b3I6OmRzaWc6UmVmZXJlbmNlWzFdKSAmZ3Q7CisgICAgICAgICAgICAgICAgY291bnQoYW5jZXN0b3Itb3Itc2VsZjo6ZHNpZzpSZWZlcmVuY2UpCisgICAgICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgICAgIGNvdW50KGFuY2VzdG9yLW9yLXNlbGY6Om5vZGUoKSB8CisgICAgICAgICAgICAgICAgICAgICAgaWQoJ25vdGFyaWVzJykpID0KKyAgICAgICAgICAgICAgICBjb3VudChhbmNlc3Rvci1vci1zZWxmOjpub2RlKCkpCisgICAgICAgICAgICAgIDwvWFBhdGg+CisgICAgICAgICAgICA8L1RyYW5zZm9ybT4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5Ea1JOSEt1UWdEaVR5OVhBQU1HYnl5ZGczQkk9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIgVVJJPSIjb2JqZWN0LTIiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+enlqcDhHSk9YNjk5OTBLa3F3OGlvUFhHRXhrPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNNYW5pZmVzdCIgVVJJPSIjbWFuaWZlc3QtMSI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5YOWRNUEwwS2VEWlhoOUdFM3ZMY090UHNZakk9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1NpZ25hdHVyZVByb3BlcnRpZXMiIFVSST0iI3NpZ25hdHVyZS1wcm9wZXJ0aWVzLTEiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+N3RITFpyQzBrcU9oUENpWXUvV3VzZ0c0dEJvPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIgLz4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT56YlZaeTN5Y2c3Q3lGY1B6TnMwQzZiQTNxaW89PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1I1dpdGhDb21tZW50cyIgLz4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT56YlZaeTN5Y2c3Q3lGY1B6TnMwQzZiQTNxaW89PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjeHBvaW50ZXIoLykiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPnpiVlp5M3ljZzdDeUZjUHpOczBDNmJBM3Fpbz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiN4cG9pbnRlcigvKSI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiIC8+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPmFyMC83RVF5UmZVWm1yUFBjVFFGZFZDdDJQWT08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0IiBVUkk9IiNvYmplY3QtMyI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT4wYVc0TDBHb0Z6WVVvNGd5WlNmb3laQmhwdWM9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIgVVJJPSIjb2JqZWN0LTMiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1I1dpdGhDb21tZW50cyIgLz4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT4wYVc0TDBHb0Z6WVVvNGd5WlNmb3laQmhwdWM9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIgVVJJPSIjeHBvaW50ZXIoaWQoJ29iamVjdC0zJykpIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPjBhVzRMMEdvRnpZVW80Z3laU2ZveVpCaHB1Yz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0IiBVUkk9IiN4cG9pbnRlcihpZCgnb2JqZWN0LTMnKSkiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1I1dpdGhDb21tZW50cyIgLz4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT4xcHVZV2IzNlo1VElEbUVJVmQvSkxSM2lEOFk9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1JlZmVyZW5jZSIgVVJJPSIjcmVmZXJlbmNlLTIiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+TU10WExDc3dpRUR1cktNZ2cycit2QlBsazhRPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIElkPSJyZWZlcmVuY2UtMSIgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1JlZmVyZW5jZSIgVVJJPSIjbWFuaWZlc3QtcmVmZXJlbmNlLTEiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+N2VJL1A4bXBwZ2txWHFXMCthdDJVR2owNnFzPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIElkPSJyZWZlcmVuY2UtMiIgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1JlZmVyZW5jZSIgVVJJPSIjcmVmZXJlbmNlLTEiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+bC9icUlvdWs2R3M4ZUVqRzBUYWQwTUpKZ1d3PTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgPC9TaWduZWRJbmZvPgorICAgICAgPFNpZ25hdHVyZVZhbHVlPgorICAgICAgICBTaU1iOXN1NTZzcG1NbE5qcldXS2RrZ2oxaERodmVhV0N4NUJ3cGo1QXVKNlQzWnk2OE5KL0E9PQorICAgICAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgICAgIDxLZXlJbmZvPgorICAgICAgICA8UmV0cmlldmFsTWV0aG9kIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNYNTA5RGF0YSIgVVJJPSIjb2JqZWN0LTQiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhwYXRoLTE5OTkxMTE2Ij4KKyAgICAgICAgICAgICAgPFhQYXRoIHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICAgICAgICAgICAgICAgIGFuY2VzdG9yLW9yLXNlbGY6OmRzaWc6WDUwOURhdGEKKyAgICAgICAgICAgICAgPC9YUGF0aD4KKyAgICAgICAgICAgIDwvVHJhbnNmb3JtPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgPC9SZXRyaWV2YWxNZXRob2Q+CisgICAgICA8L0tleUluZm8+CisgICAgICA8T2JqZWN0IElkPSJvYmplY3QtMSIgTWltZVR5cGU9InRleHQvcGxhaW4iPkkgYW0gdGhlIGJhZCB0ZXh0LjwvT2JqZWN0PgorICAgICAgPE9iamVjdCBFbmNvZGluZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIgSWQ9Im9iamVjdC0yIiBNaW1lVHlwZT0idGV4dC9wbGFpbiI+YUJBRFNJR048L09iamVjdD4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC0zIj4KKyAgICAgICAgPE5vbkNvbW1lbnRhbmR1cyB4bWxucz0iIj48IS0tIEJBRCBDb21tZW50YW5kdW0gLS0+PC9Ob25Db21tZW50YW5kdXM+CisgICAgICA8L09iamVjdD4KKyAgICAgIDxPYmplY3Q+CisgICAgICAgIDxNYW5pZmVzdCBJZD0ibWFuaWZlc3QtMSI+CisgICAgICAgICAgPFJlZmVyZW5jZSBJZD0ibWFuaWZlc3QtcmVmZXJlbmNlLTEiIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1JlZmVyZW5jZSIgVVJJPSIjcmVmZXJlbmNlLTEiPgorICAgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgICAgPERpZ2VzdFZhbHVlPmwvYnFJb3VrNkdzOGVFakcwVGFkME1KSmdXdz08L0RpZ2VzdFZhbHVlPgorICAgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjbm90YXJpZXMiPgorICAgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14c2x0LTE5OTkxMTE2Ij4KKyAgICAgICAgICAgICAgICA8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvc3RyaWN0IiBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iZm9vIiB2ZXJzaW9uPSIxLjAiPgorICAgICAgICAgICAgICAgICAgPHhzbDpvdXRwdXQgZW5jb2Rpbmc9IlVURi04IiBpbmRlbnQ9Im5vIiBtZXRob2Q9InhtbCIgLz4KKyAgICAgICAgICAgICAgICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgICAgICAgICAgICAgICAgICA8aHRtbD4KKyAgICAgICAgICAgICAgICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Ob3RhcmllczwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgICAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iTm90YXJpZXMvTm90YXJ5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgIDwvYm9keT4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sPgorICAgICAgICAgICAgICAgICAgPC94c2w6dGVtcGxhdGU+CisgICAgICAgICAgICAgICAgPC94c2w6c3R5bGVzaGVldD4KKyAgICAgICAgICAgICAgPC9UcmFuc2Zvcm0+CisgICAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICAgIDxEaWdlc3RWYWx1ZT5jN3dxNVhLb3M2UnFOVkp5Rnk3L2ZsNitzQXM9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPC9NYW5pZmVzdD4KKyAgICAgIDwvT2JqZWN0PgorICAgICAgPE9iamVjdD4KKyAgICAgICAgPFNpZ25hdHVyZVByb3BlcnRpZXMgSWQ9InNpZ25hdHVyZS1wcm9wZXJ0aWVzLTEiPgorICAgICAgICAgIDxTaWduYXR1cmVQcm9wZXJ0eSBUYXJnZXQ9IiNzaWduYXR1cmUiPgorICAgICAgICAgICAgPFNpZ25lckFkZHJlc3MgeG1sbnM9InVybjpkZW1vIj48SVA+MTkyLjE2OC4yMS4xMzg8L0lQPjwvU2lnbmVyQWRkcmVzcz4KKyAgICAgICAgICA8L1NpZ25hdHVyZVByb3BlcnR5PgorICAgICAgICA8L1NpZ25hdHVyZVByb3BlcnRpZXM+CisgICAgICA8L09iamVjdD4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC00Ij4KKyAgICAgICAgPFg1MDlEYXRhPgorICAgICAgICAgIDxYNTA5U3ViamVjdE5hbWU+CisgICAgICAgICAgICBDTj1NZXJsaW4gSHVnaGVzLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKKyAgICAgICAgICA8L1g1MDlTdWJqZWN0TmFtZT4KKyAgICAgICAgICA8WDUwOUlzc3VlclNlcmlhbD4KKyAgICAgICAgICAgIDxYNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgICAgICAgQ049VGVzdCBEU0EgQ0EsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQorICAgICAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgICAgIDxYNTA5U2VyaWFsTnVtYmVyPjk3MDg0OTkzNjwvWDUwOVNlcmlhbE51bWJlcj4KKyAgICAgICAgICA8L1g1MDlJc3N1ZXJTZXJpYWw+CisgICAgICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgICAgIE1JSUROekNDQXZXZ0F3SUJBZ0lFT2QzK2tEQUpCZ2NxaGtqT09BUURNRnN4Q3pBSkJnTlZCQVlUQWtsRk1ROHcKKyAgICAgICAgICAgIERRWURWUVFJRXdaRWRXSnNhVzR4SlRBakJnTlZCQW9USEVKaGJIUnBiVzl5WlNCVVpXTm9ibTlzYjJkcFpYTXMKKyAgICAgICAgICAgIElFeDBaQzR4RkRBU0JnTlZCQU1UQzFSbGMzUWdSRk5CSUVOQk1CNFhEVEF3TVRBd05qRTJNekl4TlZvWERUQXgKKyAgICAgICAgICAgIE1UQXdOakUyTXpJeE5Gb3dYVEVMTUFrR0ExVUVCaE1DU1VVeER6QU5CZ05WQkFnVEJrUjFZbXhwYmpFbE1DTUcKKyAgICAgICAgICAgIEExVUVDaE1jUW1Gc2RHbHRiM0psSUZSbFkyaHViMnh2WjJsbGN5d2dUSFJrTGpFV01CUUdBMVVFQXhNTlRXVnkKKyAgICAgICAgICAgIGJHbHVJRWgxWjJobGN6Q0NBYll3Z2dFckJnY3Foa2pPT0FRQk1JSUJIZ0tCZ1FEYUpqZkRUcmF3TUhmOE1pVXQKKyAgICAgICAgICAgIFk1NGIzN2hTbVlOblIzS3BHVDEwdVUxRHFwcGNqdTA2dU4waUdicWY5NDdEamtCQzI1aEtucXlrSzMxeEJ3MEUKKyAgICAgICAgICAgIENQYllxL0tDOThrZ2hkZjJ4SkN1NkI4YXFKOTVLOWpkVmZsSjNXUDdQUXhKbitmbU0yM3p5NkhZTFhWSUNwZnEKKyAgICAgICAgICAgIGV0ZE5qL1ZIQ1NoWkUzYmRKaUU2Vm9iU0ZRSVZBUFFlY3FTMlBhVERwcmNRbmt3eDRNSFRSWGhyQW9HQU11R0EKKyAgICAgICAgICAgIGxxZUIxYXgrdnlPMitPc3ViamhsN3BIeEx1NDdSSUgrL001MkRqRVNBOUtNU3J3enNZeDh5TlIyV29vQnlyRTAKKyAgICAgICAgICAgIHQ2ZnUwVm5jSzdVSzhvbE80dDd3cHYyejRBRlFQUlZDS0Z3bzBxZ241YUtJa0lDR01sclJ5ODFhdmIyN3dHY1cKKyAgICAgICAgICAgIG90aHgzaVBQTXRGWHRvRHFLMEpJdGFJOVI4emMxbXNGaE0xR0tNWURnWVFBQW9HQWN0QThZR3hydG5nZy96S1YKKyAgICAgICAgICAgIHZxRU9lZm53bVZpRnp0Y25QQllQbEpzdmg2eUtJNGlEbTY4Zm5wNE1pM1JySjZiWkF5Z0ZyVUlRTHhMalYrT0oKKyAgICAgICAgICAgIHRnSkFFdG8weEFzK01laHVxMURrU0ZFcFAzb0R6Q1RPc3JPaVMxRHdRZTRvSWI3elZrLzlsN2FQdEpNSFcwTFYKKyAgICAgICAgICAgIGxNZHdaTkZOTkpvcU1jVDJaZkNQcmZ2WXZRMmpSekJGTUI0R0ExVWRFUVFYTUJXQkUyMWxjbXhwYmtCaVlXeDAKKyAgICAgICAgICAgIGFXMXZjbVV1YVdVd0RnWURWUjBQQVFIL0JBUURBZ2VBTUJNR0ExVWRJd1FNTUFxQUNFSlpRRzBLd1JiUE1Ba0cKKyAgICAgICAgICAgIEJ5cUdTTTQ0QkFNRE1RQXdMZ0lWQUs0c2tXRUZZZ3JnZ2FKQTh2WUF3U2pnMTIrS0FoVUF3SFRvN3dkNHRFTncKKyAgICAgICAgICAgIDlMQUtQa2xRLzc0ZkgxOD0KKyAgICAgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgPC9YNTA5RGF0YT4KKyAgICAgIDwvT2JqZWN0PgorICAgIDwvU2lnbmF0dXJlPgorICA8L1lvdXJzU2luY2VyZWx5PgorICA8UG9zdFNjcmlwdD5iYXI8L1Bvc3RTY3JpcHQ+CisgIDxOb3RhcmllcyB4bWxucz0iIiBJZD0ibm90YXJpZXMiPgorICAgIDxOb3RhcnkgbmFtZT0iR3JlYXQsIEEuIFQuIiAvPgorICAgIDxOb3RhcnkgbmFtZT0iSHVuLCBBLiBULiIgLz4KKyAgPC9Ob3Rhcmllcz4KKyAgPCEtLSBDb21tZW50YXJ5IC0tPgorPC9FbnZlbG9wZT4KKzwhLS0gUG9zdGFtYmxlIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctc2l4dGVlbi9zaWduYXR1cmUueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctc2l4dGVlbi9zaWduYXR1cmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZjI3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy1zaXh0ZWVuL3NpZ25hdHVyZS54bWwKQEAgLTAsMCArMSwyNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgRW52ZWxvcGUgWworICA8IUVOVElUWSBkc2lnICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPCFFTlRJVFkgYzE0biAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiPgorICA8IUVOVElUWSB4cGF0aCAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHBhdGgtMTk5OTExMTYiPgorICA8IUVOVElUWSB4c2x0ICJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14c2x0LTE5OTkxMTE2Ij4KKyAgPCFBVFRMSVNUIE5vdGFyaWVzIElkIElEICNJTVBMSUVEPgorXT4KKzwhLS0gUHJlYW1ibGUgLS0+Cis8RW52ZWxvcGUgeG1sbnM6Zm9vPSJodHRwOi8vd3d3LnVzcHMuZ292L2ZvbyIgeG1sbnM9Imh0dHA6Ly93d3cudXNwcy5nb3YvIj4KKyAgPERlYXJTaXI+Zm9vPC9EZWFyU2lyPgorICA8Qm9keT5iYXI8L0JvZHk+CisgIDxZb3Vyc1NpbmNlcmVseT4KKyAgICA8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIiBJZD0ic2lnbmF0dXJlIj4KKyAgICAgIDxTaWduZWRJbmZvPgorICAgICAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgICAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAvPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3htbGRzaWcucG90aG9sZS5jb20veG1sLXN0eWxlc2hlZXQudHh0Ij4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjYmFzZTY0IiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0IiBVUkk9IiNvYmplY3QtMSI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHBhdGgtMTk5OTExMTYiPgorICAgICAgICAgICAgICA8WFBhdGg+CisgICAgICAgICAgICAgICAgc2VsZjo6dGV4dCgpCisgICAgICAgICAgICAgIDwvWFBhdGg+CisgICAgICAgICAgICA8L1RyYW5zZm9ybT4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT56eWpwOEdKT1g2OTk5MEtrcXc4aW9QWEdFeGs9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIgVVJJPSIiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhwYXRoLTE5OTkxMTE2Ij4KKyAgICAgICAgICAgICAgPFhQYXRoIHhtbG5zOmRzaWc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICAgICAgICAgICAgICAgIGFuY2VzdG9yLW9yLXNlbGY6OmRzaWc6U2lnbmVkSW5mbworICAgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgY291bnQoYW5jZXN0b3Itb3Itc2VsZjo6ZHNpZzpSZWZlcmVuY2UgfAorICAgICAgICAgICAgICAgICAgICAgIGhlcmUoKS9hbmNlc3Rvcjo6ZHNpZzpSZWZlcmVuY2VbMV0pICZndDsKKyAgICAgICAgICAgICAgICBjb3VudChhbmNlc3Rvci1vci1zZWxmOjpkc2lnOlJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAgIG9yCisgICAgICAgICAgICAgICAgY291bnQoYW5jZXN0b3Itb3Itc2VsZjo6bm9kZSgpIHwKKyAgICAgICAgICAgICAgICAgICAgICBpZCgnbm90YXJpZXMnKSkgPQorICAgICAgICAgICAgICAgIGNvdW50KGFuY2VzdG9yLW9yLXNlbGY6Om5vZGUoKSkKKyAgICAgICAgICAgICAgPC9YUGF0aD4KKyAgICAgICAgICAgIDwvVHJhbnNmb3JtPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPkRrUk5IS3VRZ0RpVHk5WEFBTUdieXlkZzNCST08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0IiBVUkk9IiNvYmplY3QtMiI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIgLz4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT56eWpwOEdKT1g2OTk5MEtrcXc4aW9QWEdFeGs9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI01hbmlmZXN0IiBVUkk9IiNtYW5pZmVzdC0xIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPlg5ZE1QTDBLZURaWGg5R0UzdkxjT3RQc1lqST08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjU2lnbmF0dXJlUHJvcGVydGllcyIgVVJJPSIjc2lnbmF0dXJlLXByb3BlcnRpZXMtMSI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT43dEhMWnJDMGtxT2hQQ2lZdS9XdXNnRzR0Qm89PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPnpiVlp5M3ljZzdDeUZjUHpOczBDNmJBM3Fpbz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiIC8+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPnpiVlp5M3ljZzdDeUZjUHpOczBDNmJBM3Fpbz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiN4cG9pbnRlcigvKSI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+emJWWnkzeWNnN0N5RmNQek5zMEM2YkEzcWlvPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iI3hwb2ludGVyKC8pIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIgLz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+YXIwLzdFUXlSZlVabXJQUGNUUUZkVkN0MlBZPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiIFVSST0iI29iamVjdC0zIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPjBhVzRMMEdvRnpZVW80Z3laU2ZveVpCaHB1Yz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0IiBVUkk9IiNvYmplY3QtMyI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPjBhVzRMMEdvRnpZVW80Z3laU2ZveVpCaHB1Yz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0IiBVUkk9IiN4cG9pbnRlcihpZCgnb2JqZWN0LTMnKSkiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+MGFXNEwwR29GellVbzRneVpTZm95WkJocHVjPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiIFVSST0iI3hwb2ludGVyKGlkKCdvYmplY3QtMycpKSI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPjFwdVlXYjM2WjVUSURtRUlWZC9KTFIzaUQ4WT08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjUmVmZXJlbmNlIiBVUkk9IiNyZWZlcmVuY2UtMiI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5NTXRYTENzd2lFRHVyS01nZzJyK3ZCUGxrOFE9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgSWQ9InJlZmVyZW5jZS0xIiBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjUmVmZXJlbmNlIiBVUkk9IiNtYW5pZmVzdC1yZWZlcmVuY2UtMSI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT43ZUkvUDhtcHBna3FYcVcwK2F0MlVHajA2cXM9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgSWQ9InJlZmVyZW5jZS0yIiBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjUmVmZXJlbmNlIiBVUkk9IiNyZWZlcmVuY2UtMSI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5sL2JxSW91azZHczhlRWpHMFRhZDBNSkpnV3c9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICA8L1NpZ25lZEluZm8+CisgICAgICA8U2lnbmF0dXJlVmFsdWU+CisgICAgICAgIFNpTWI5c3U1NnNwbU1sTmpyV1dLZGtnajFoRGh2ZWFXQ3g1QndwajVBdUo2VDNaeTY4TkovQT09CisgICAgICA8L1NpZ25hdHVyZVZhbHVlPgorICAgICAgPEtleUluZm8+CisgICAgICAgIDxSZXRyaWV2YWxNZXRob2QgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1g1MDlEYXRhIiBVUkk9IiNvYmplY3QtNCI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHBhdGgtMTk5OTExMTYiPgorICAgICAgICAgICAgICA8WFBhdGggeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgICAgICAgICAgICAgICAgYW5jZXN0b3Itb3Itc2VsZjo6ZHNpZzpYNTA5RGF0YQorICAgICAgICAgICAgICA8L1hQYXRoPgorICAgICAgICAgICAgPC9UcmFuc2Zvcm0+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICA8L1JldHJpZXZhbE1ldGhvZD4KKyAgICAgIDwvS2V5SW5mbz4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC0xIiBNaW1lVHlwZT0idGV4dC9wbGFpbiI+SSBhbSB0aGUgdGV4dC48L09iamVjdD4KKyAgICAgIDxPYmplY3QgRW5jb2Rpbmc9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQiIElkPSJvYmplY3QtMiIgTWltZVR5cGU9InRleHQvcGxhaW4iPlNTQmhiU0IwYUdVZ2RHVjRkQzQ9PC9PYmplY3Q+CisgICAgICA8T2JqZWN0IElkPSJvYmplY3QtMyI+CisgICAgICAgIDxOb25Db21tZW50YW5kdXMgeG1sbnM9IiI+PCEtLSBDb21tZW50YW5kdW0gLS0+PC9Ob25Db21tZW50YW5kdXM+CisgICAgICA8L09iamVjdD4KKyAgICAgIDxPYmplY3Q+CisgICAgICAgIDxNYW5pZmVzdCBJZD0ibWFuaWZlc3QtMSI+CisgICAgICAgICAgPFJlZmVyZW5jZSBJZD0ibWFuaWZlc3QtcmVmZXJlbmNlLTEiIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1JlZmVyZW5jZSIgVVJJPSIjcmVmZXJlbmNlLTEiPgorICAgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgICAgPERpZ2VzdFZhbHVlPmwvYnFJb3VrNkdzOGVFakcwVGFkME1KSmdXdz08L0RpZ2VzdFZhbHVlPgorICAgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjbm90YXJpZXMiPgorICAgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14c2x0LTE5OTkxMTE2Ij4KKyAgICAgICAgICAgICAgICA8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvc3RyaWN0IiBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iZm9vIiB2ZXJzaW9uPSIxLjAiPgorICAgICAgICAgICAgICAgICAgPHhzbDpvdXRwdXQgZW5jb2Rpbmc9IlVURi04IiBpbmRlbnQ9Im5vIiBtZXRob2Q9InhtbCIgLz4KKyAgICAgICAgICAgICAgICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgICAgICAgICAgICAgICAgICA8aHRtbD4KKyAgICAgICAgICAgICAgICAgICAgICA8aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Ob3RhcmllczwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgPC9oZWFkPgorICAgICAgICAgICAgICAgICAgICAgIDxib2R5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iTm90YXJpZXMvTm90YXJ5Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJAbmFtZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICAgIDwvYm9keT4KKyAgICAgICAgICAgICAgICAgICAgPC9odG1sPgorICAgICAgICAgICAgICAgICAgPC94c2w6dGVtcGxhdGU+CisgICAgICAgICAgICAgICAgPC94c2w6c3R5bGVzaGVldD4KKyAgICAgICAgICAgICAgPC9UcmFuc2Zvcm0+CisgICAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICAgIDxEaWdlc3RWYWx1ZT5jN3dxNVhLb3M2UnFOVkp5Rnk3L2ZsNitzQXM9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPC9NYW5pZmVzdD4KKyAgICAgIDwvT2JqZWN0PgorICAgICAgPE9iamVjdD4KKyAgICAgICAgPFNpZ25hdHVyZVByb3BlcnRpZXMgSWQ9InNpZ25hdHVyZS1wcm9wZXJ0aWVzLTEiPgorICAgICAgICAgIDxTaWduYXR1cmVQcm9wZXJ0eSBUYXJnZXQ9IiNzaWduYXR1cmUiPgorICAgICAgICAgICAgPFNpZ25lckFkZHJlc3MgeG1sbnM9InVybjpkZW1vIj48SVA+MTkyLjE2OC4yMS4xMzg8L0lQPjwvU2lnbmVyQWRkcmVzcz4KKyAgICAgICAgICA8L1NpZ25hdHVyZVByb3BlcnR5PgorICAgICAgICA8L1NpZ25hdHVyZVByb3BlcnRpZXM+CisgICAgICA8L09iamVjdD4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC00Ij4KKyAgICAgICAgPFg1MDlEYXRhPgorICAgICAgICAgIDxYNTA5U3ViamVjdE5hbWU+CisgICAgICAgICAgICBDTj1NZXJsaW4gSHVnaGVzLE89QmFsdGltb3JlIFRlY2hub2xvZ2llc1wsIEx0ZC4sU1Q9RHVibGluLEM9SUUKKyAgICAgICAgICA8L1g1MDlTdWJqZWN0TmFtZT4KKyAgICAgICAgICA8WDUwOUlzc3VlclNlcmlhbD4KKyAgICAgICAgICAgIDxYNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgICAgICAgQ049VGVzdCBEU0EgQ0EsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzXCwgTHRkLixTVD1EdWJsaW4sQz1JRQorICAgICAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgICAgIDxYNTA5U2VyaWFsTnVtYmVyPjk3MDg0OTkzNjwvWDUwOVNlcmlhbE51bWJlcj4KKyAgICAgICAgICA8L1g1MDlJc3N1ZXJTZXJpYWw+CisgICAgICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgICAgIE1JSUROekNDQXZXZ0F3SUJBZ0lFT2QzK2tEQUpCZ2NxaGtqT09BUURNRnN4Q3pBSkJnTlZCQVlUQWtsRk1ROHcKKyAgICAgICAgICAgIERRWURWUVFJRXdaRWRXSnNhVzR4SlRBakJnTlZCQW9USEVKaGJIUnBiVzl5WlNCVVpXTm9ibTlzYjJkcFpYTXMKKyAgICAgICAgICAgIElFeDBaQzR4RkRBU0JnTlZCQU1UQzFSbGMzUWdSRk5CSUVOQk1CNFhEVEF3TVRBd05qRTJNekl4TlZvWERUQXgKKyAgICAgICAgICAgIE1UQXdOakUyTXpJeE5Gb3dYVEVMTUFrR0ExVUVCaE1DU1VVeER6QU5CZ05WQkFnVEJrUjFZbXhwYmpFbE1DTUcKKyAgICAgICAgICAgIEExVUVDaE1jUW1Gc2RHbHRiM0psSUZSbFkyaHViMnh2WjJsbGN5d2dUSFJrTGpFV01CUUdBMVVFQXhNTlRXVnkKKyAgICAgICAgICAgIGJHbHVJRWgxWjJobGN6Q0NBYll3Z2dFckJnY3Foa2pPT0FRQk1JSUJIZ0tCZ1FEYUpqZkRUcmF3TUhmOE1pVXQKKyAgICAgICAgICAgIFk1NGIzN2hTbVlOblIzS3BHVDEwdVUxRHFwcGNqdTA2dU4waUdicWY5NDdEamtCQzI1aEtucXlrSzMxeEJ3MEUKKyAgICAgICAgICAgIENQYllxL0tDOThrZ2hkZjJ4SkN1NkI4YXFKOTVLOWpkVmZsSjNXUDdQUXhKbitmbU0yM3p5NkhZTFhWSUNwZnEKKyAgICAgICAgICAgIGV0ZE5qL1ZIQ1NoWkUzYmRKaUU2Vm9iU0ZRSVZBUFFlY3FTMlBhVERwcmNRbmt3eDRNSFRSWGhyQW9HQU11R0EKKyAgICAgICAgICAgIGxxZUIxYXgrdnlPMitPc3ViamhsN3BIeEx1NDdSSUgrL001MkRqRVNBOUtNU3J3enNZeDh5TlIyV29vQnlyRTAKKyAgICAgICAgICAgIHQ2ZnUwVm5jSzdVSzhvbE80dDd3cHYyejRBRlFQUlZDS0Z3bzBxZ241YUtJa0lDR01sclJ5ODFhdmIyN3dHY1cKKyAgICAgICAgICAgIG90aHgzaVBQTXRGWHRvRHFLMEpJdGFJOVI4emMxbXNGaE0xR0tNWURnWVFBQW9HQWN0QThZR3hydG5nZy96S1YKKyAgICAgICAgICAgIHZxRU9lZm53bVZpRnp0Y25QQllQbEpzdmg2eUtJNGlEbTY4Zm5wNE1pM1JySjZiWkF5Z0ZyVUlRTHhMalYrT0oKKyAgICAgICAgICAgIHRnSkFFdG8weEFzK01laHVxMURrU0ZFcFAzb0R6Q1RPc3JPaVMxRHdRZTRvSWI3elZrLzlsN2FQdEpNSFcwTFYKKyAgICAgICAgICAgIGxNZHdaTkZOTkpvcU1jVDJaZkNQcmZ2WXZRMmpSekJGTUI0R0ExVWRFUVFYTUJXQkUyMWxjbXhwYmtCaVlXeDAKKyAgICAgICAgICAgIGFXMXZjbVV1YVdVd0RnWURWUjBQQVFIL0JBUURBZ2VBTUJNR0ExVWRJd1FNTUFxQUNFSlpRRzBLd1JiUE1Ba0cKKyAgICAgICAgICAgIEJ5cUdTTTQ0QkFNRE1RQXdMZ0lWQUs0c2tXRUZZZ3JnZ2FKQTh2WUF3U2pnMTIrS0FoVUF3SFRvN3dkNHRFTncKKyAgICAgICAgICAgIDlMQUtQa2xRLzc0ZkgxOD0KKyAgICAgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgPC9YNTA5RGF0YT4KKyAgICAgIDwvT2JqZWN0PgorICAgIDwvU2lnbmF0dXJlPgorICA8L1lvdXJzU2luY2VyZWx5PgorICA8UG9zdFNjcmlwdD5iYXI8L1Bvc3RTY3JpcHQ+CisgIDxOb3RhcmllcyB4bWxucz0iIiBJZD0ibm90YXJpZXMiPgorICAgIDxOb3RhcnkgbmFtZT0iR3JlYXQsIEEuIFQuIiAvPgorICAgIDxOb3RhcnkgbmFtZT0iSHVuLCBBLiBULiIgLz4KKyAgPC9Ob3Rhcmllcz4KKyAgPCEtLSBDb21tZW50YXJ5IC0tPgorPC9FbnZlbG9wZT4KKzwhLS0gUG9zdGFtYmxlIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL2JhZGIuY3J0IGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL2JhZGIuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGRlYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvY2VydHMvYmFkYi5jcnQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL2JhbG9yLmNydCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9iYWxvci5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA2ZDU5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9iYWxvci5jcnQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL2JyZXMuY3J0IGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL2JyZXMuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOTUzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvY2VydHMvYnJlcy5jcnQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL2NhLmNydCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9jYS5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA4NjFkMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9jYS5jcnQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL2NybCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9jcmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0ZTdlZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9jcmwKQEAgLTAsMCArMSwxMSBAQAorLS0tLS1CRUdJTiBDUkwtLS0tLQorTUlJQkpEQ0I1QUlCQVRBSkJnY3Foa2pPT0FRRE1IWXhDekFKQmdOVkJBWVRBa2xGTVE4d0RRWURWUVFJRXdaRQorZFdKc2FXNHhKREFpQmdOVkJBb1RHMEpoYkhScGJXOXlaU0JVWldOb2JtOXNiMmRwWlhNZ1RIUmtMakVSTUE4RworQTFVRUN4TUlXQzlUWldOMWNtVXhIVEFiQmdOVkJBTVRGRUZ1YjNSb1pYSWdWSEpoYm5OcFpXNTBJRU5CRncwdworTWpBME1EUXdNakUyTlRoYUZ3MHhNVEEwTURJd01qRTJOVGhhTUJrd0Z3SUdBT3o1SWQ1L0Z3MHdNakEwTURRdworTWpFMk5UaGFvQ013SVRBVEJnTlZIU01FRERBS2dBaUtIRll3V2pJU2ZUQUtCZ05WSFJRRUF3SUJBREFKQmdjcQoraGtqT09BUURBekFBTUMwQ0ZDRUltMzhmdkd6U0pIbXMyODRoVXM5ZE5COG5BaFVBakV0WnIwVEdnYzZzVlJWawora3JFZ2x0ZG83Snc9CistLS0tLUVORCBDUkwtLS0tLQorCisKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9sdWdoLmNydCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9sdWdoLmNydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTA5ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL2x1Z2guY3J0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9tYWNoYS5jcnQgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvY2VydHMvbWFjaGEuY3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NGRkYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvY2VydHMvbWFjaGEuY3J0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9tb3JpZ3UuY3J0IGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL21vcmlndS5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYwZDQxNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9tb3JpZ3UuY3J0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9tdWxsYW4uY3J0IGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL211bGxhbi5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3MjliYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9tdWxsYW4uY3J0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9uZW1haW4uY3J0IGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL25lbWFpbi5jcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRiNjJhZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy9uZW1haW4uY3J0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy94bWxkc2lnLmprcyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9jZXJ0cy94bWxkc2lnLmprcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzAyZmNlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL2NlcnRzL3htbGRzaWcuamtzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZW52ZWxvcGVkLWRzYS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWVudmVsb3BlZC1kc2EueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ZmYxZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWVudmVsb3BlZC1kc2EueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8RW52ZWxvcGUgeG1sbnM9Imh0dHA6Ly9leGFtcGxlLm9yZy9lbnZlbG9wZSI+CisgIDxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICAgIDxTaWduZWRJbmZvPgorICAgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+CisgICAgICA8UmVmZXJlbmNlIFVSST0iIj4KKyAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPgorICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgPERpZ2VzdFZhbHVlPmZkeTZTMk5McG5UNGZNZG9rVUhTSHNtcGN2bz08L0RpZ2VzdFZhbHVlPgorICAgICAgPC9SZWZlcmVuY2U+CisgICAgPC9TaWduZWRJbmZvPgorICAgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICAgIFo0cEJiK28rWE9LV01FN0NwTHlYdU5xeUlZZFhPY0d2dGhmVWYrWkRMTDVpbW1QeCszdEs4UT09CisgICAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgICA8S2V5SW5mbz4KKyAgICAgIDxLZXlWYWx1ZT4KKyAgICAgICAgPERTQUtleVZhbHVlPgorICAgICAgICAgIDxQPgorICAgICAgICAgICAgM2VPZUF2cW5FeUZwVyt1VFNncmRqN1lMamFUa3B5SGVjS0ZJb0x1OFFaTmtHVFFJMWNpSVRCSDBscWZJa2RDSAorICAgICAgICAgICAgU2k4ZmlVQzNEVHEzSjlGc0plZjRZVnRERjdKcFV2SFRPUXF0cTdaZ3g2S0M4V3hrejZyUUN4T3I3RjBBcE9ZaQorICAgICAgICAgICAgODl6TFJvZTRNa0RHZTZ1eDArV3R5T1RRb1ZJR05URERVRlhyVVFOYkxyRT0KKyAgICAgICAgICA8L1A+CisgICAgICAgICAgPFE+CisgICAgICAgICAgICBoRExjRkswR08vSHoxYXJ4T092c2dNL1ZMeVU9CisgICAgICAgICAgPC9RPgorICAgICAgICAgIDxHPgorICAgICAgICAgICAgbm54N2hiZFdvekdidG5GZ25iRm5vcGZSbDdYUmFjcGtQSlJHZjVQMklVZ1ZzcEVVU1VvTjZpMWZEQmZCZzQzegorICAgICAgICAgICAgS3Q3ZGxFYVFMN2I1K0pUWnQzTWhaTlBvc3hzZ3hWdVQ3VHMvZzVrN0VucGRZdjBhNWh3NUJ3MjlmamJHSGZnTQorICAgICAgICAgICAgOGQycmhkMlVpMHhIYmswRDQ1MW5oTHhWV3VsdmlPU1BoektLdlhyYnlTQT0KKyAgICAgICAgICA8L0c+CisgICAgICAgICAgPFk+CisgICAgICAgICAgICBjZllwaWhwQVFlZXBiTkZTNE1BYlFSaGRYcERpNXdMcnd4RTVoSXZvWXFvMUw4QlFWdThmWTFURkFQdG9hZTFpCisgICAgICAgICAgICBCZy9HSUp5UDNpTGZ5dUJKYUR2SkpMUDMwd0JIOWkvczVKMzY1NlBldnBPVmRUZmk3NzdGaTlHajZ5L2liMlZ2CisgICAgICAgICAgICArT1pmSmtrcDRMNTArcDVUVWhQbVFMSnRSRXNndGwrdG5JT3lKVCsrRzlVPQorICAgICAgICAgIDwvWT4KKyAgICAgICAgPC9EU0FLZXlWYWx1ZT4KKyAgICAgIDwvS2V5VmFsdWU+CisgICAgPC9LZXlJbmZvPgorICA8L1NpZ25hdHVyZT4KKzwvRW52ZWxvcGU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWVudmVsb3BpbmctYjY0LWRzYS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWVudmVsb3BpbmctYjY0LWRzYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5MjRiMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZW52ZWxvcGluZy1iNjQtZHNhLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDxTaWduZWRJbmZvPgorICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+CisgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iI29iamVjdCI+CisgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQiIC8+CisgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+TjZwangzT1kyVlJITW1MaG9BVjhIbU11Mm5jPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEtnQWVxOGUweVVOZkZ6K21GbFozUWd5UU5NY2lWK1ozQm9EUUR2UU5rZXI3cGF6RW5KbU9JQT09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxEU0FLZXlWYWx1ZT4KKyAgICAgICAgPFA+CisgICAgICAgICAgM2VPZUF2cW5FeUZwVyt1VFNncmRqN1lMamFUa3B5SGVjS0ZJb0x1OFFaTmtHVFFJMWNpSVRCSDBscWZJa2RDSAorICAgICAgICAgIFNpOGZpVUMzRFRxM0o5RnNKZWY0WVZ0REY3SnBVdkhUT1FxdHE3Wmd4NktDOFd4a3o2clFDeE9yN0YwQXBPWWkKKyAgICAgICAgICA4OXpMUm9lNE1rREdlNnV4MCtXdHlPVFFvVklHTlRERFVGWHJVUU5iTHJFPQorICAgICAgICA8L1A+CisgICAgICAgIDxRPgorICAgICAgICAgIGhETGNGSzBHTy9IejFhcnhPT3ZzZ00vVkx5VT0KKyAgICAgICAgPC9RPgorICAgICAgICA8Rz4KKyAgICAgICAgICBubng3aGJkV296R2J0bkZnbmJGbm9wZlJsN1hSYWNwa1BKUkdmNVAySVVnVnNwRVVTVW9ONmkxZkRCZkJnNDN6CisgICAgICAgICAgS3Q3ZGxFYVFMN2I1K0pUWnQzTWhaTlBvc3hzZ3hWdVQ3VHMvZzVrN0VucGRZdjBhNWh3NUJ3MjlmamJHSGZnTQorICAgICAgICAgIDhkMnJoZDJVaTB4SGJrMEQ0NTFuaEx4Vld1bHZpT1NQaHpLS3ZYcmJ5U0E9CisgICAgICAgIDwvRz4KKyAgICAgICAgPFk+CisgICAgICAgICAgY2ZZcGlocEFRZWVwYk5GUzRNQWJRUmhkWHBEaTV3THJ3eEU1aEl2b1lxbzFMOEJRVnU4ZlkxVEZBUHRvYWUxaQorICAgICAgICAgIEJnL0dJSnlQM2lMZnl1QkphRHZKSkxQMzB3Qkg5aS9zNUozNjU2UGV2cE9WZFRmaTc3N0ZpOUdqNnkvaWIyVnYKKyAgICAgICAgICArT1pmSmtrcDRMNTArcDVUVWhQbVFMSnRSRXNndGwrdG5JT3lKVCsrRzlVPQorICAgICAgICA8L1k+CisgICAgICA8L0RTQUtleVZhbHVlPgorICAgIDwvS2V5VmFsdWU+CisgIDwvS2V5SW5mbz4KKyAgPE9iamVjdCBJZD0ib2JqZWN0Ij5jMjl0WlNCMFpYaDA8L09iamVjdD4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9waW5nLWRzYS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWVudmVsb3BpbmctZHNhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODhhYzI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9waW5nLWRzYS54bWwKQEAgLTAsMCArMSwzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9IiNvYmplY3QiPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPjcvWFRzSGFCU09uSi9qWEQ1djB6TDZWS1lzaz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBQZkQ5MmxreEtnYzJPS3ZGNHAwYmE2Y0pqNmQxZXFJRHg1UTFodlZZVHZpb3RqZTIzU251bnc9PQorICA8L1NpZ25hdHVyZVZhbHVlPgorICA8S2V5SW5mbz4KKyAgICA8S2V5VmFsdWU+CisgICAgICA8RFNBS2V5VmFsdWU+CisgICAgICAgIDxQPgorICAgICAgICAgIDNlT2VBdnFuRXlGcFcrdVRTZ3JkajdZTGphVGtweUhlY0tGSW9MdThRWk5rR1RRSTFjaUlUQkgwbHFmSWtkQ0gKKyAgICAgICAgICBTaThmaVVDM0RUcTNKOUZzSmVmNFlWdERGN0pwVXZIVE9RcXRxN1pneDZLQzhXeGt6NnJRQ3hPcjdGMEFwT1lpCisgICAgICAgICAgODl6TFJvZTRNa0RHZTZ1eDArV3R5T1RRb1ZJR05URERVRlhyVVFOYkxyRT0KKyAgICAgICAgPC9QPgorICAgICAgICA8UT4KKyAgICAgICAgICBoRExjRkswR08vSHoxYXJ4T092c2dNL1ZMeVU9CisgICAgICAgIDwvUT4KKyAgICAgICAgPEc+CisgICAgICAgICAgbm54N2hiZFdvekdidG5GZ25iRm5vcGZSbDdYUmFjcGtQSlJHZjVQMklVZ1ZzcEVVU1VvTjZpMWZEQmZCZzQzegorICAgICAgICAgIEt0N2RsRWFRTDdiNStKVFp0M01oWk5Qb3N4c2d4VnVUN1RzL2c1azdFbnBkWXYwYTVodzVCdzI5ZmpiR0hmZ00KKyAgICAgICAgICA4ZDJyaGQyVWkweEhiazBENDUxbmhMeFZXdWx2aU9TUGh6S0t2WHJieVNBPQorICAgICAgICA8L0c+CisgICAgICAgIDxZPgorICAgICAgICAgIGNmWXBpaHBBUWVlcGJORlM0TUFiUVJoZFhwRGk1d0xyd3hFNWhJdm9ZcW8xTDhCUVZ1OGZZMVRGQVB0b2FlMWkKKyAgICAgICAgICBCZy9HSUp5UDNpTGZ5dUJKYUR2SkpMUDMwd0JIOWkvczVKMzY1NlBldnBPVmRUZmk3NzdGaTlHajZ5L2liMlZ2CisgICAgICAgICAgK09aZkpra3A0TDUwK3A1VFVoUG1RTEp0UkVzZ3RsK3RuSU95SlQrK0c5VT0KKyAgICAgICAgPC9ZPgorICAgICAgPC9EU0FLZXlWYWx1ZT4KKyAgICA8L0tleVZhbHVlPgorICA8L0tleUluZm8+CisgIDxPYmplY3QgSWQ9Im9iamVjdCI+c29tZSB0ZXh0PC9PYmplY3Q+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZW52ZWxvcGluZy1obWFjLXNoYTEtNDAueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9waW5nLWhtYWMtc2hhMS00MC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwNGQ3OQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZW52ZWxvcGluZy1obWFjLXNoYTEtNDAueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2htYWMtc2hhMSI+CisgICAgICA8SE1BQ091dHB1dExlbmd0aD40MDwvSE1BQ091dHB1dExlbmd0aD4KKyAgICA8L1NpZ25hdHVyZU1ldGhvZD4KKyAgICA8UmVmZXJlbmNlIFVSST0iI29iamVjdCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+Ny9YVHNIYUJTT25KL2pYRDV2MHpMNlZLWXNrPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEhIaXF2Q1U9CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxPYmplY3QgSWQ9Im9iamVjdCI+c29tZSB0ZXh0PC9PYmplY3Q+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZW52ZWxvcGluZy1obWFjLXNoYTEueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9waW5nLWhtYWMtc2hhMS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBjODM0MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZW52ZWxvcGluZy1obWFjLXNoYTEueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2htYWMtc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iI29iamVjdCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+Ny9YVHNIYUJTT25KL2pYRDV2MHpMNlZLWXNrPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEpFbFB0dElUNEFtN1ErTU5vTXl2K1dEZkFadz0KKyAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgPE9iamVjdCBJZD0ib2JqZWN0Ij5zb21lIHRleHQ8L09iamVjdD4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9waW5nLXJzYS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWVudmVsb3BpbmctcnNhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTgwZDgzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1lbnZlbG9waW5nLXJzYS54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9IiNvYmplY3QiPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPjcvWFRzSGFCU09uSi9qWEQ1djB6TDZWS1lzaz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBvdjNIT29QTjB3NzFOM0RkR05oTitkU3pRbTZOSkZVQjVxR0tScDlROTg2blZ6TWI4d0NJVnhDUXUreDN2TXRxCisgICAgcDQvUjNLRWNQdEVKU2FvUit0aEdxKytHUEloMm1aWHlXSnMzeEh5OVA0eG1vVFZ3bGk3L2w3czhlYkRTbW5iWgorICAgIDd4WlU0SXkxQlNNWlN4R0tuUkcrWi8wR0pJZlR6OGpoSDZ3Q2UzbDAzTDQ9CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxSU0FLZXlWYWx1ZT4KKyAgICAgICAgPE1vZHVsdXM+CisgICAgICAgICAgcTA3aHB4QTVER0ZmdkpGWnVlRmwvTEk4NVh4UXhydnFnVnVnTDI1VjA5MEE5TXJsTEJnNVBtQXN4RlRlK0c2YQorICAgICAgICAgIHh2V0pRd1lPVkhqL251aUNuTkxhOWE3dUF0UEZpVHRXK3Y1SDN3bExhWTN3czRhdFJCTk9RbFlrSUJwMzhzVGYKKyAgICAgICAgICBRQmtrNGk4UEVVMUdRMk0wQ0xJSnE0LzJBa2Z2MXd4elNROSs4b1drQXJjPQorICAgICAgICA8L01vZHVsdXM+CisgICAgICAgIDxFeHBvbmVudD4KKyAgICAgICAgICBBUUFCCisgICAgICAgIDwvRXhwb25lbnQ+CisgICAgICA8L1JTQUtleVZhbHVlPgorICAgIDwvS2V5VmFsdWU+CisgIDwvS2V5SW5mbz4KKyAgPE9iamVjdCBJZD0ib2JqZWN0Ij5zb21lIHRleHQ8L09iamVjdD4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1leHRlcm5hbC1iNjQtZHNhLnhtbCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZXh0ZXJuYWwtYjY0LWRzYS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiNTY2MwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtZXh0ZXJuYWwtYjY0LWRzYS54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1NpZ25hdHVyZS8yMDAyLzA0L3htbC1zdHlsZXNoZWV0LmI2NCI+CisgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQiIC8+CisgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEloT2xBak1GYVp0a0VqdTVSNWJpNTI4aDFIcERhNEEyMXN1ZFp5bmhKUlJMalp1UUlIWjNlUT09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxLZXlWYWx1ZT4KKyAgICAgIDxEU0FLZXlWYWx1ZT4KKyAgICAgICAgPFA+CisgICAgICAgICAgM2VPZUF2cW5FeUZwVyt1VFNncmRqN1lMamFUa3B5SGVjS0ZJb0x1OFFaTmtHVFFJMWNpSVRCSDBscWZJa2RDSAorICAgICAgICAgIFNpOGZpVUMzRFRxM0o5RnNKZWY0WVZ0REY3SnBVdkhUT1FxdHE3Wmd4NktDOFd4a3o2clFDeE9yN0YwQXBPWWkKKyAgICAgICAgICA4OXpMUm9lNE1rREdlNnV4MCtXdHlPVFFvVklHTlRERFVGWHJVUU5iTHJFPQorICAgICAgICA8L1A+CisgICAgICAgIDxRPgorICAgICAgICAgIGhETGNGSzBHTy9IejFhcnhPT3ZzZ00vVkx5VT0KKyAgICAgICAgPC9RPgorICAgICAgICA8Rz4KKyAgICAgICAgICBubng3aGJkV296R2J0bkZnbmJGbm9wZlJsN1hSYWNwa1BKUkdmNVAySVVnVnNwRVVTVW9ONmkxZkRCZkJnNDN6CisgICAgICAgICAgS3Q3ZGxFYVFMN2I1K0pUWnQzTWhaTlBvc3hzZ3hWdVQ3VHMvZzVrN0VucGRZdjBhNWh3NUJ3MjlmamJHSGZnTQorICAgICAgICAgIDhkMnJoZDJVaTB4SGJrMEQ0NTFuaEx4Vld1bHZpT1NQaHpLS3ZYcmJ5U0E9CisgICAgICAgIDwvRz4KKyAgICAgICAgPFk+CisgICAgICAgICAgY2ZZcGlocEFRZWVwYk5GUzRNQWJRUmhkWHBEaTV3THJ3eEU1aEl2b1lxbzFMOEJRVnU4ZlkxVEZBUHRvYWUxaQorICAgICAgICAgIEJnL0dJSnlQM2lMZnl1QkphRHZKSkxQMzB3Qkg5aS9zNUozNjU2UGV2cE9WZFRmaTc3N0ZpOUdqNnkvaWIyVnYKKyAgICAgICAgICArT1pmSmtrcDRMNTArcDVUVWhQbVFMSnRSRXNndGwrdG5JT3lKVCsrRzlVPQorICAgICAgICA8L1k+CisgICAgICA8L0RTQUtleVZhbHVlPgorICAgIDwvS2V5VmFsdWU+CisgIDwvS2V5SW5mbz4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1leHRlcm5hbC1kc2EueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1leHRlcm5hbC1kc2EueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDNlNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWV4dGVybmFsLWRzYS54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KKyAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9TaWduZWRJbmZvPgorICA8U2lnbmF0dXJlVmFsdWU+CisgICAgTGFMMS90L1hvZFl2REpEZ1NFYnE0N0dYOGx0bmx4M0ZGVVJkaTdvK1VGVmkrekxmMFd5V2FRPT0KKyAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgPEtleUluZm8+CisgICAgPEtleVZhbHVlPgorICAgICAgPERTQUtleVZhbHVlPgorICAgICAgICA8UD4KKyAgICAgICAgICAzZU9lQXZxbkV5RnBXK3VUU2dyZGo3WUxqYVRrcHlIZWNLRklvTHU4UVpOa0dUUUkxY2lJVEJIMGxxZklrZENICisgICAgICAgICAgU2k4ZmlVQzNEVHEzSjlGc0plZjRZVnRERjdKcFV2SFRPUXF0cTdaZ3g2S0M4V3hrejZyUUN4T3I3RjBBcE9ZaQorICAgICAgICAgIDg5ekxSb2U0TWtER2U2dXgwK1d0eU9UUW9WSUdOVEREVUZYclVRTmJMckU9CisgICAgICAgIDwvUD4KKyAgICAgICAgPFE+CisgICAgICAgICAgaERMY0ZLMEdPL0h6MWFyeE9PdnNnTS9WTHlVPQorICAgICAgICA8L1E+CisgICAgICAgIDxHPgorICAgICAgICAgIG5ueDdoYmRXb3pHYnRuRmduYkZub3BmUmw3WFJhY3BrUEpSR2Y1UDJJVWdWc3BFVVNVb042aTFmREJmQmc0M3oKKyAgICAgICAgICBLdDdkbEVhUUw3YjUrSlRadDNNaFpOUG9zeHNneFZ1VDdUcy9nNWs3RW5wZFl2MGE1aHc1QncyOWZqYkdIZmdNCisgICAgICAgICAgOGQycmhkMlVpMHhIYmswRDQ1MW5oTHhWV3VsdmlPU1BoektLdlhyYnlTQT0KKyAgICAgICAgPC9HPgorICAgICAgICA8WT4KKyAgICAgICAgICBjZllwaWhwQVFlZXBiTkZTNE1BYlFSaGRYcERpNXdMcnd4RTVoSXZvWXFvMUw4QlFWdThmWTFURkFQdG9hZTFpCisgICAgICAgICAgQmcvR0lKeVAzaUxmeXVCSmFEdkpKTFAzMHdCSDlpL3M1SjM2NTZQZXZwT1ZkVGZpNzc3Rmk5R2o2eS9pYjJWdgorICAgICAgICAgICtPWmZKa2twNEw1MCtwNVRVaFBtUUxKdFJFc2d0bCt0bklPeUpUKytHOVU9CisgICAgICAgIDwvWT4KKyAgICAgIDwvRFNBS2V5VmFsdWU+CisgICAgPC9LZXlWYWx1ZT4KKyAgPC9LZXlJbmZvPgorPC9TaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLWtleW5hbWUueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1rZXluYW1lLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M2MGEzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1rZXluYW1lLnhtbApAQCAtMCwwICsxLDE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDxTaWduZWRJbmZvPgorICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+CisgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBKa0ozR3BsRVUwaURicVN2N1pPWGh2djN6ZU0xS21QK0NMcGhob2MrTlBZcXBHWVFpVzZPNnc9PQorICA8L1NpZ25hdHVyZVZhbHVlPgorICA8S2V5SW5mbz4KKyAgICA8S2V5TmFtZT5MdWdoPC9LZXlOYW1lPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLXJhd3g1MDljcnQueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS1yZXRyaWV2YWxtZXRob2QtcmF3eDUwOWNydC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4NjFkOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLXJhd3g1MDljcnQueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIFNOQjVGSTE5M1JGWG9HMmo4WjliWFdnVzdCTVBJQ3FOb2I0SGpoMDhvb3U0dGtoR3h6NCtwZz09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxSZXRyaWV2YWxNZXRob2QgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3Jhd1g1MDlDZXJ0aWZpY2F0ZSIgVVJJPSJjZXJ0cy9iYWxvci5jcnQiIC8+CisgIDwvS2V5SW5mbz4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS14NTA5LWNydC1jcmwueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS14NTA5LWNydC1jcmwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMDE3OTcKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLXg1MDktY3J0LWNybC54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8U2lnbmVkSW5mbz4KKyAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+CisgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KKyAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KKyAgICA8L1JlZmVyZW5jZT4KKyAgPC9TaWduZWRJbmZvPgorICA8U2lnbmF0dXJlVmFsdWU+CisgICAgV0Y2RWFYNjZmOENkR0U2TmFmbXpkTHBiLzFPVllYNGtCTnNxZ0dJcUhSNUpaQXU0SHBiVlFRPT0KKyAgPC9TaWduYXR1cmVWYWx1ZT4KKyAgPEtleUluZm8+CisgICAgPFg1MDlEYXRhPgorICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgTUlJRFRqQ0NBdzZnQXdJQkFnSUdBT3o1SWQ1L01Ba0dCeXFHU000NEJBTXdkakVMTUFrR0ExVUVCaE1DU1VVeAorICAgICAgICBEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWtNQ0lHQTFVRUNoTWJRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsCisgICAgICAgIGN5Qk1kR1F1TVJFd0R3WURWUVFMRXdoWUwxTmxZM1Z5WlRFZE1Cc0dBMVVFQXhNVVFXNXZkR2hsY2lCVWNtRnUKKyAgICAgICAgYzJsbGJuUWdRMEV3SGhjTk1ESXdOREF6TURBd01ESTRXaGNOTVRJd05EQXlNakkxT1RRMldqQm1NUXN3Q1FZRAorICAgICAgICBWUVFHRXdKSlJURVBNQTBHQTFVRUNCTUdSSFZpYkdsdU1TUXdJZ1lEVlFRS0V4dENZV3gwYVcxdmNtVWdWR1ZqCisgICAgICAgIGFHNXZiRzluYVdWeklFeDBaQzR4RVRBUEJnTlZCQXNUQ0ZndlUyVmpkWEpsTVEwd0N3WURWUVFERXdSQ2NtVnoKKyAgICAgICAgTUlJQnRqQ0NBU3NHQnlxR1NNNDRCQUV3Z2dFZUFvR0JBSVNLc0VvbmpOR2dIcy91aCs5WUtnbndaOEJ0M1Q3dQorICAgICAgICB5UUJKVzlkeHBNRjBjUFVYejRkRmJTRlk0UXlXOGlnQ0xzd3BPYStlSEhFWXNXdkUwTnIxbGNLSFVQWHE3dTQxCisgICAgICAgIEpKd0hOcTFSQUZlWmlVNndhKzFGTDN2MS9UMXJBZ3plcFY3eFM0aWFmejR2eGRITWxmd2dLZm95S2ZxNkpVMXoKKyAgICAgICAgb1ZNL2FoSTV4V0REQWhVQW1FdjZlSUpyQjRLTjBmUFJBQlB4M05IWWNsa0NnWUFsaHVZWi9BelB0YTcrYkU1QworICAgICAgICBRYXNtU1Z6Yzh1TS9lK0xON0FCbEVYd1FSazZRZlpCY1g4VGJlUE5FOFpGbmc0VWZ0L1F6QU9VeEFMRVQ3a0tBCisgICAgICAgIGVrNEpleXRwemMwWFlDWXl1R0pBVG00RjlaWTFwQUo1eVFtVW13dkRZZGxhWko0bGRHek8vUjU3RXZuZ24vRzQKKyAgICAgICAgdHFqam9pMHN4M2pxN2N6dkR3ZEdIbmt5MEFPQmhBQUNnWUJndkRGeHcxVTZPdTJHNlAvKzM0N0pmazJ3UEIxLworICAgICAgICBhdHI0cDNKVVZMdVQwRXhaRzZucCtyS2lYbWNCYllLYkFoTVkzN3pWa3JvUjlid28rTmdhSkd1YlE0ZXg1WTFYCisgICAgICAgIE4yUTVnSUhOaE5mS3I4RzRMUFZxV0d4Zi9sRlBEWXhYM2V6cUJKUHBKQ0pUUkVYN3M2SHAvVlRWMlNwUWx5U3YKKyAgICAgICAgK0dSY0ZLSkZQbGhEOWFNNk1EZ3dEZ1lEVlIwUEFRSC9CQVFEQWdlQU1CRUdBMVVkRGdRS0JBaUMrNWd4ME1ITAorICAgICAgICBoVEFUQmdOVkhTTUVEREFLZ0FpS0hGWXdXaklTZlRBSkJnY3Foa2pPT0FRREF5OEFNQ3dDRkRUY001aTYxdXFxCisgICAgICAgIC9hdmVFUmhPSjZORy9MdWJBaFJFVkR0QWVOYlRFeXdYcjRPN0t2RUV2RkxVamc9PQorICAgICAgPC9YNTA5Q2VydGlmaWNhdGU+CisgICAgICA8WDUwOUNSTD4KKyAgICAgICAgTUlJQkpEQ0I1QUlCQVRBSkJnY3Foa2pPT0FRRE1IWXhDekFKQmdOVkJBWVRBa2xGTVE4d0RRWURWUVFJRXdaRQorICAgICAgICBkV0pzYVc0eEpEQWlCZ05WQkFvVEcwSmhiSFJwYlc5eVpTQlVaV05vYm05c2IyZHBaWE1nVEhSa0xqRVJNQThHCisgICAgICAgIEExVUVDeE1JV0M5VFpXTjFjbVV4SFRBYkJnTlZCQU1URkVGdWIzUm9aWElnVkhKaGJuTnBaVzUwSUVOQkZ3MHcKKyAgICAgICAgTWpBME1EUXdNakUyTlRoYUZ3MHhNVEEwTURJd01qRTJOVGhhTUJrd0Z3SUdBT3o1SWQ1L0Z3MHdNakEwTURRdworICAgICAgICBNakUyTlRoYW9DTXdJVEFUQmdOVkhTTUVEREFLZ0FpS0hGWXdXaklTZlRBS0JnTlZIUlFFQXdJQkFEQUpCZ2NxCisgICAgICAgIGhrak9PQVFEQXpBQU1DMENGQ0VJbTM4ZnZHelNKSG1zMjg0aFVzOWROQjhuQWhVQWpFdFpyMFRHZ2M2c1ZSVmsKKyAgICAgICAga3JFZ2x0ZG83Snc9CisgICAgICA8L1g1MDlDUkw+CisgICAgPC9YNTA5RGF0YT4KKyAgPC9LZXlJbmZvPgorPC9TaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLXg1MDktY3J0LnhtbCBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUteDUwOS1jcnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDhmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLXg1MDktY3J0LnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDxTaWduZWRJbmZvPgorICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+CisgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBHQ1FWbUJxKzFIN2U5SWp2S2ZlK2VnTE0xSmxwM0wxSkNHa2w5U2xKMGVhRGgyTUtZVVVuSEE9PQorICA8L1NpZ25hdHVyZVZhbHVlPgorICA8S2V5SW5mbz4KKyAgICA8WDUwOURhdGE+CisgICAgICA8WDUwOUNlcnRpZmljYXRlPgorICAgICAgICBNSUlEVURDQ0F4Q2dBd0lCQWdJR0FPejVJVkhUTUFrR0J5cUdTTTQ0QkFNd2RqRUxNQWtHQTFVRUJoTUNTVVV4CisgICAgICAgIER6QU5CZ05WQkFnVEJrUjFZbXhwYmpFa01DSUdBMVVFQ2hNYlFtRnNkR2x0YjNKbElGUmxZMmh1YjJ4dloybGwKKyAgICAgICAgY3lCTWRHUXVNUkV3RHdZRFZRUUxFd2hZTDFObFkzVnlaVEVkTUJzR0ExVUVBeE1VUVc1dmRHaGxjaUJVY21GdQorICAgICAgICBjMmxsYm5RZ1EwRXdIaGNOTURJd05EQXlNak0xT1RVeVdoY05NVEl3TkRBeU1qSTFPVFEyV2pCb01Rc3dDUVlECisgICAgICAgIFZRUUdFd0pKUlRFUE1BMEdBMVVFQ0JNR1JIVmliR2x1TVNRd0lnWURWUVFLRXh0Q1lXeDBhVzF2Y21VZ1ZHVmoKKyAgICAgICAgYUc1dmJHOW5hV1Z6SUV4MFpDNHhFVEFQQmdOVkJBc1RDRmd2VTJWamRYSmxNUTh3RFFZRFZRUURFd1pOYjNKcAorICAgICAgICBaM1V3Z2dHMk1JSUJLd1lIS29aSXpqZ0VBVENDQVI0Q2dZRUFoSXF3U2llTTBhQWV6KzZINzFncUNmQm53RzNkCisgICAgICAgIFB1N0pBRWxiMTNHa3dYUnc5UmZQaDBWdElWamhESmJ5S0FJdXpDazVyNTRjY1JpeGE4VFEydldWd29kUTllcnUKKyAgICAgICAgN2pVa25BYzJyVkVBVjVtSlRyQnI3VVV2ZS9YOVBXc0NETjZsWHZGTGlKcC9QaS9GMGN5Vi9DQXAraklwK3JvbAorICAgICAgICBUWE9oVXo5cUVqbkZZTU1DRlFDWVMvcDRnbXNIZ28zUjg5RUFFL0hjMGRoeVdRS0JnQ1dHNWhuOERNKzFydjVzCisgICAgICAgIFRrSkJxeVpKWE56eTR6OTc0czNzQUdVUmZCQkdUcEI5a0Z4ZnhOdDQ4MFR4a1dlRGhSKzM5RE1BNVRFQXNSUHUKKyAgICAgICAgUW9CNlRnbDdLMm5OelJkZ0pqSzRZa0JPYmdYMWxqV2tBbm5KQ1pTYkM4TmgyVnBrbmlWMGJNNzlIbnNTK2VDZgorICAgICAgICA4YmkycU9PaUxTekhlT3J0ek84UEIwWWVlVExRQTRHRUFBS0JnSDFOQko5QXo1VHdZNHRERTBkUFlWSEhBQnQrCisgICAgICAgIHlMc3BuVDNrOUc2WVdVTUZoWi8rM1J1cUVQam5LclBmVW9YVFRKR0lBQ2dQVTMvUGtxd3JQVkQwSk1kcE9jbloKKyAgICAgICAgTEhpSi9QN1FSUWVNd0RSb0JyczdnZW5CMWJEZDRwU0pyRVVjanJrQTV1UnJJajJaNWZMK1V1TGlMR1BPMnJNNworICAgICAgICBCTlFSSXEzUUZQZFgrK051b3pvd09EQU9CZ05WSFE4QkFmOEVCQU1DQjRBd0VRWURWUjBPQkFvRUNJSzdMampoCisgICAgICAgICtFc2ZNQk1HQTFVZEl3UU1NQXFBQ0lvY1ZqQmFNaEo5TUFrR0J5cUdTTTQ0QkFNREx3QXdMQUlVRUpKQ09IdzgKKyAgICAgICAgcHB4b1J5ejNzK1ZtYjROS0lmTUNGRGdKb1puOXpoLzNXb1lOQlVST0R3THZ5Qk95CisgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUteDUwOS1pcy54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLXg1MDktaXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTAxZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLXg1MDktaXMueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIGJtS015L3cxRE85ZEhBNkU3RHQwQjhJRmtZQWoxL1VEM1RxY2RxSWNma01UN2V2RTgrTkJnZz09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxYNTA5RGF0YT4KKyAgICAgIDxYNTA5SXNzdWVyU2VyaWFsPgorICAgICAgICA8WDUwOUlzc3Vlck5hbWU+CisgICAgICAgICAgQ049QW5vdGhlciBUcmFuc2llbnQgQ0EsT1U9WC9TZWN1cmUsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzIEx0ZC4sU1Q9RHVibGluLEM9SUUKKyAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgPFg1MDlTZXJpYWxOdW1iZXI+MTAxNzc5MjAwMzA2NjwvWDUwOVNlcmlhbE51bWJlcj4KKyAgICAgIDwvWDUwOUlzc3VlclNlcmlhbD4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUteDUwOS1za2kueG1sIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS14NTA5LXNraS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcxYmZjZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUteDUwOS1za2kueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEY5bkVVMVVzNDhpS1RtbDhuN0U0d3Q3SHRGSjVnYUxJZ294MEo5V2J1akduZFcwb1FKYmVHZz09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxYNTA5RGF0YT4KKyAgICAgIDxYNTA5U0tJPgorICAgICAgICBoZjEweEtmU25JZz0KKyAgICAgIDwvWDUwOVNLST4KKyAgICA8L1g1MDlEYXRhPgorICA8L0tleUluZm8+Cis8L1NpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS9zaWduYXR1cmUteDUwOS1zbi54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLXg1MDktc24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YjA4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLXg1MDktc24ueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIE1VT2ppcUcwZGJqdlI2K3FZWVBMODVuS1N0MkZlWkdRQlFrWXVkdjQ4S3lKaEpMRzFCcCtiQT09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxYNTA5RGF0YT4KKyAgICAgIDxYNTA5U3ViamVjdE5hbWU+CisgICAgICAgIENOPUJhZGIsT1U9WC9TZWN1cmUsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzIEx0ZC4sU1Q9RHVibGluLEM9SUUKKyAgICAgIDwvWDUwOVN1YmplY3ROYW1lPgorICAgIDwvWDUwOURhdGE+CisgIDwvS2V5SW5mbz4KKzwvU2lnbmF0dXJlPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS50bXBsIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS50bXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMGQzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLnRtcGwKQEAgLTAsMCArMSwyNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCFET0NUWVBFIGVudmVsb3BlIFsKKyAgPCFFTlRJVFkgZHNpZyAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDwhRU5USVRZIGMxNG4gImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1Ij4KKyAgPCFFTlRJVFkgeHBhdGggImh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhwYXRoLTE5OTkxMTE2Ij4KKyAgPCFFTlRJVFkgeHNsdCAiaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHNsdC0xOTk5MTExNiI+CisgIDwhQVRUTElTVCBOb3RhcmllcyBJZCBJRCAjSU1QTElFRD4KK10+Cis8IS0tIFByZWFtYmxlIC0tPgorPEVudmVsb3BlIHhtbG5zPSJodHRwOi8vZXhhbXBsZS5vcmcvdXNwcyIgeG1sbnM6Zm9vPSJodHRwOi8vZXhhbXBsZS5vcmcvZm9vIj4KKyAgPERlYXJTaXI+Zm9vPC9EZWFyU2lyPgorICA8Qm9keT5iYXI8L0JvZHk+CisgIDxZb3Vyc1NpbmNlcmVseT4KKyAgICA8U2lnbmF0dXJlIElkPSJzaWduYXR1cmUiIHhtbG5zPSImZHNpZzsiPgorICAgICAgPFNpZ25lZEluZm8+CisgICAgICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSIiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPmFhYWE8L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1NpZ25hdHVyZS8yMDAyLzA0L3htbC1zdHlsZXNoZWV0LmI2NCI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iJmRzaWc7YmFzZTY0IiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjb2JqZWN0LTEiIFR5cGU9IiZkc2lnO09iamVjdCI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iJnhwYXRoOyI+CisgICAgICAgICAgICAgIDxYUGF0aD4KKyAgICAgICAgICAgICAgICBzZWxmOjp0ZXh0KCkKKyAgICAgICAgICAgICAgPC9YUGF0aD4KKyAgICAgICAgICAgIDwvVHJhbnNmb3JtPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIiIFR5cGU9IiZkc2lnO09iamVjdCI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iJnhwYXRoOyI+CisgICAgICAgICAgICAgIDxYUGF0aCB4bWxuczpkc2lnPSImZHNpZzsiPgorICAgICAgICAgICAgICAgIGFuY2VzdG9yLW9yLXNlbGY6OmRzaWc6U2lnbmVkSW5mbworICAgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgY291bnQoYW5jZXN0b3Itb3Itc2VsZjo6ZHNpZzpSZWZlcmVuY2UgfAorICAgICAgICAgICAgICAgICAgICAgIGhlcmUoKS9hbmNlc3Rvcjo6ZHNpZzpSZWZlcmVuY2VbMV0pICZndDsKKyAgICAgICAgICAgICAgICBjb3VudChhbmNlc3Rvci1vci1zZWxmOjpkc2lnOlJlZmVyZW5jZSkKKyAgICAgICAgICAgICAgICAgIG9yCisgICAgICAgICAgICAgICAgY291bnQoYW5jZXN0b3Itb3Itc2VsZjo6bm9kZSgpIHwKKyAgICAgICAgICAgICAgICAgICAgICBpZCgnbm90YXJpZXMnKSkgPQorICAgICAgICAgICAgICAgIGNvdW50KGFuY2VzdG9yLW9yLXNlbGY6Om5vZGUoKSkKKyAgICAgICAgICAgICAgPC9YUGF0aD4KKyAgICAgICAgICAgIDwvVHJhbnNmb3JtPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjb2JqZWN0LTIiIFR5cGU9IiZkc2lnO09iamVjdCI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iJmRzaWc7YmFzZTY0IiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjbWFuaWZlc3QtMSIgVHlwZT0iJmRzaWc7TWFuaWZlc3QiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSIiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPmFhYWE8L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiNzaWduYXR1cmUtcHJvcGVydGllcy0xIiBUeXBlPSImZHNpZztTaWduYXR1cmVQcm9wZXJ0aWVzIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09IiZkc2lnO2VudmVsb3BlZC1zaWduYXR1cmUiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSIiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPmFhYWE8L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iJmRzaWc7ZW52ZWxvcGVkLXNpZ25hdHVyZSIgLz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSImYzE0bjsjV2l0aENvbW1lbnRzIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjeHBvaW50ZXIoLykiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09IiZkc2lnO2VudmVsb3BlZC1zaWduYXR1cmUiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSIiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPmFhYWE8L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiN4cG9pbnRlcigvKSI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iJmRzaWc7ZW52ZWxvcGVkLXNpZ25hdHVyZSIgLz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSImYzE0bjsjV2l0aENvbW1lbnRzIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjb2JqZWN0LTMiIFR5cGU9IiZkc2lnO09iamVjdCI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09IiIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+YWFhYTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iI29iamVjdC0zIiBUeXBlPSImZHNpZztPYmplY3QiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09IiZjMTRuOyNXaXRoQ29tbWVudHMiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSIiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPmFhYWE8L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiN4cG9pbnRlcihpZCgnb2JqZWN0LTMnKSkiIFR5cGU9IiZkc2lnO09iamVjdCI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09IiIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+YWFhYTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iI3hwb2ludGVyKGlkKCdvYmplY3QtMycpKSIgVHlwZT0iJmRzaWc7T2JqZWN0Ij4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSImYzE0bjsjV2l0aENvbW1lbnRzIiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjcmVmZXJlbmNlLTIiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSIiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPmFhYWE8L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBJZD0icmVmZXJlbmNlLTEiIFVSST0iI21hbmlmZXN0LXJlZmVyZW5jZS0xIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgSWQ9InJlZmVyZW5jZS0yIiBVUkk9IiNyZWZlcmVuY2UtMSI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09IiIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+YWFhYTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgPC9TaWduZWRJbmZvPgorICAgICAgPFNpZ25hdHVyZVZhbHVlPmFhYWE8L1NpZ25hdHVyZVZhbHVlPgorICAgICAgPEtleUluZm8+CisgICAgICAgIDxSZXRyaWV2YWxNZXRob2QgVVJJPSIjb2JqZWN0LTQiIFR5cGU9IiZkc2lnO1g1MDlEYXRhIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSImeHBhdGg7Ij4KKyAgICAgICAgICAgICAgPFhQYXRoIHhtbG5zOmRzaWc9IiZkc2lnOyI+CisgICAgICAgICAgICAgICAgYW5jZXN0b3Itb3Itc2VsZjo6ZHNpZzpYNTA5RGF0YQorICAgICAgICAgICAgICA8L1hQYXRoPgorICAgICAgICAgICAgPC9UcmFuc2Zvcm0+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICA8L1JldHJpZXZhbE1ldGhvZD4KKyAgICAgIDwvS2V5SW5mbz4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC0xIiBNaW1lVHlwZT0idGV4dC9wbGFpbiI+SSBhbSB0aGUgdGV4dC48L09iamVjdD4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC0yIiBNaW1lVHlwZT0idGV4dC9wbGFpbiIgRW5jb2Rpbmc9IiZkc2lnO2Jhc2U2NCI+U1NCaGJTQjBhR1VnZEdWNGRDND08L09iamVjdD4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC0zIj48Tm9uQ29tbWVudGFuZHVzIHhtbG5zPSIiPjwhLS0gQ29tbWVudGFuZHVtIC0tPjwvTm9uQ29tbWVudGFuZHVzPjwvT2JqZWN0PgorICAgICAgPE9iamVjdD4KKyAgICAgICAgPE1hbmlmZXN0IElkPSJtYW5pZmVzdC0xIj4KKyAgICAgICAgICA8UmVmZXJlbmNlIElkPSJtYW5pZmVzdC1yZWZlcmVuY2UtMSIgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iIiAvPgorICAgICAgICAgICAgPERpZ2VzdFZhbHVlPmFhYWE8L0RpZ2VzdFZhbHVlPgorICAgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjcmVmZXJlbmNlLTEiPgorICAgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09IiIgLz4KKyAgICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgICA8UmVmZXJlbmNlIFVSST0iI25vdGFyaWVzIj4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iJnhzbHQ7Ij4KKyAgICAgICAgICAgICAgICA8eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL3N0cmljdCIgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJmb28iPgorICAgICAgICAgICAgICAgICAgPHhzbDpvdXRwdXQgbWV0aG9kPSJ4bWwiIGluZGVudD0ibm8iIGVuY29kaW5nPSJVVEYtOCIvPgorICAgICAgICAgICAgICAgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sPgorICAgICAgICAgICAgICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk5vdGFyaWVzPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICAgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJOb3Rhcmllcy9Ob3RhcnkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgorICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L2JvZHk+CisgICAgICAgICAgICAgICAgICAgIDwvaHRtbD4KKyAgICAgICAgICAgICAgICAgIDwveHNsOnRlbXBsYXRlPgorICAgICAgICAgICAgICAgIDwveHNsOnN0eWxlc2hlZXQ+CisgICAgICAgICAgICAgIDwvVHJhbnNmb3JtPgorICAgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iJmMxNG47IiAvPgorICAgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09IiIgLz4KKyAgICAgICAgICAgIDxEaWdlc3RWYWx1ZT5hYWFhPC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPC9NYW5pZmVzdD4KKyAgICAgIDwvT2JqZWN0PgorICAgICAgPE9iamVjdD4KKyAgICAgICAgPFNpZ25hdHVyZVByb3BlcnRpZXMgSWQ9InNpZ25hdHVyZS1wcm9wZXJ0aWVzLTEiPgorICAgICAgICAgIDxTaWduYXR1cmVQcm9wZXJ0eSBUYXJnZXQ9IiNzaWduYXR1cmUiPgorICAgICAgICAgICAgPFNpZ25lckFkZHJlc3MgeG1sbnM9InVybjpkZW1vIj48SVA+MTkyLjE2OC4yMS4xMzg8L0lQPjwvU2lnbmVyQWRkcmVzcz4KKyAgICAgICAgICA8L1NpZ25hdHVyZVByb3BlcnR5PgorICAgICAgICA8L1NpZ25hdHVyZVByb3BlcnRpZXM+CisgICAgICA8L09iamVjdD4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC00Ij4KKyAgICAgICAgPFg1MDlEYXRhPgorICAgICAgICAgIDxYNTA5U3ViamVjdE5hbWU+CisgICAgICAgICAgICBDTj1NZXJsaW4gSHVnaGVzLE9VPVgvU2VjdXJlLE89QmFsdGltb3JlIFRlY2hub2xvZ2llcyBMdGQuLFNUPUR1YmxpbixDPUlFCisgICAgICAgICAgPC9YNTA5U3ViamVjdE5hbWU+CisgICAgICAgICAgPFg1MDlJc3N1ZXJTZXJpYWw+CisgICAgICAgICAgICA8WDUwOUlzc3Vlck5hbWU+CisgICAgICAgICAgICAgIENOPVRyYW5zaWVudCBDQSxPVT1YL1NlY3VyZSxPPUJhbHRpbW9yZSBUZWNobm9sb2dpZXMgTHRkLixTVD1EdWJsaW4sQz1JRQorICAgICAgICAgICAgPC9YNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgICAgIDxYNTA5U2VyaWFsTnVtYmVyPjEwMTc3ODgzNzAzNDg8L1g1MDlTZXJpYWxOdW1iZXI+CisgICAgICAgICAgPC9YNTA5SXNzdWVyU2VyaWFsPgorICAgICAgICAgIDxYNTA5Q2VydGlmaWNhdGU+CisgICAgICAgICAgICBNSUlEVURDQ0F4Q2dBd0lCQWdJR0FPejQ2ZzJzTUFrR0J5cUdTTTQ0QkFNd2JqRUxNQWtHQTFVRUJoTUNTVVV4CisgICAgICAgICAgICBEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWtNQ0lHQTFVRUNoTWJRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsCisgICAgICAgICAgICBjeUJNZEdRdU1SRXdEd1lEVlFRTEV3aFlMMU5sWTNWeVpURVZNQk1HQTFVRUF4TU1WSEpoYm5OcFpXNTBJRU5CCisgICAgICAgICAgICBNQjRYRFRBeU1EUXdNakl5TlRrek1Gb1hEVEV5TURRd01qSXhOVGt5TlZvd2J6RUxNQWtHQTFVRUJoTUNTVVV4CisgICAgICAgICAgICBEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWtNQ0lHQTFVRUNoTWJRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsCisgICAgICAgICAgICBjeUJNZEdRdU1SRXdEd1lEVlFRTEV3aFlMMU5sWTNWeVpURVdNQlFHQTFVRUF4TU5UV1Z5YkdsdUlFaDFaMmhsCisgICAgICAgICAgICBjekNDQWJjd2dnRXNCZ2NxaGtqT09BUUJNSUlCSHdLQmdRRGQ0NTRDK3FjVElXbGI2NU5LQ3QyUHRndU5wT1NuCisgICAgICAgICAgICBJZDV3b1VpZ3U3eEJrMlFaTkFqVnlJaE1FZlNXcDhpUjBJZEtMeCtKUUxjTk9yY24wV3dsNS9oaFcwTVhzbWxTCisgICAgICAgICAgICA4ZE01Q3EycnRtREhvb0x4YkdUUHF0QUxFNnZzWFFDazVpTHozTXRHaDdneVFNWjdxN0hUNWEzSTVOQ2hVZ1kxCisgICAgICAgICAgICBNTU5RVmV0UkExc3VzUUlWQUlReTNCU3RCanZ4ODlXcThUanI3SURQMVM4bEFvR0JBSjU4ZTRXM1ZxTXhtN1p4CisgICAgICAgICAgICBZSjJ4WjZLWDBaZTEwV25LWkR5VVJuK1Q5aUZJRmJLUkZFbEtEZW90WHd3WHdZT044eXJlM1pSR2tDKzIrZmlVCisgICAgICAgICAgICAyYmR6SVdUVDZMTWJJTVZiayswN1A0T1pPeEo2WFdMOUd1WWNPUWNOdlg0MnhoMzREUEhkcTRYZGxJdE1SMjVOCisgICAgICAgICAgICBBK09kWjRTOFZWcnBiNGprajRjeWlyMTYyOGtnQTRHRUFBS0JnSEgyS1lvYVFFSG5xV3pSVXVEQUcwRVlYVjZRCisgICAgICAgICAgICA0dWNDNjhNUk9ZU0w2R0txTlMvQVVGYnZIMk5VeFFEN2FHbnRZZ1lQeGlDY2o5NGkzOHJnU1dnN3lTU3o5OU1BCisgICAgICAgICAgICBSL1l2N09TZCt1ZWozcjZUbFhVMzR1Kyt4WXZSbytzdjRtOWxiL2ptWHlaSktlQytkUHFlVTFJVDVrQ3liVVJMCisgICAgICAgICAgICBJTFpmclp5RHNpVS92aHZWb3pvd09EQU9CZ05WSFE4QkFmOEVCQU1DQjRBd0VRWURWUjBPQkFvRUNJYXRZN1NFCisgICAgICAgICAgICBsWEVPTUJNR0ExVWRJd1FNTUFxQUNJT0dQa0IyTXVLVE1Ba0dCeXFHU000NEJBTURMd0F3TEFJVVN2VDAyaVFqCisgICAgICAgICAgICBRNWRhNFdwZTBCdnM3R3VDY1ZzQ0ZDRWNRcGJqVWZueFhGWE5XaUZ5UTQ5WnJXcW4KKyAgICAgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgICA8WDUwOUNlcnRpZmljYXRlPgorICAgICAgICAgICAgTUlJRFN6Q0NBd3VnQXdJQkFnSUdBT3o0NmZ3Sk1Ba0dCeXFHU000NEJBTXdiakVMTUFrR0ExVUVCaE1DU1VVeAorICAgICAgICAgICAgRHpBTkJnTlZCQWdUQmtSMVlteHBiakVrTUNJR0ExVUVDaE1iUW1Gc2RHbHRiM0psSUZSbFkyaHViMnh2WjJsbAorICAgICAgICAgICAgY3lCTWRHUXVNUkV3RHdZRFZRUUxFd2hZTDFObFkzVnlaVEVWTUJNR0ExVUVBeE1NVkhKaGJuTnBaVzUwSUVOQgorICAgICAgICAgICAgTUI0WERUQXlNRFF3TWpJeU5Ua3lOVm9YRFRFeU1EUXdNakl4TlRreU5Wb3diakVMTUFrR0ExVUVCaE1DU1VVeAorICAgICAgICAgICAgRHpBTkJnTlZCQWdUQmtSMVlteHBiakVrTUNJR0ExVUVDaE1iUW1Gc2RHbHRiM0psSUZSbFkyaHViMnh2WjJsbAorICAgICAgICAgICAgY3lCTWRHUXVNUkV3RHdZRFZRUUxFd2hZTDFObFkzVnlaVEVWTUJNR0ExVUVBeE1NVkhKaGJuTnBaVzUwSUVOQgorICAgICAgICAgICAgTUlJQnR6Q0NBU3dHQnlxR1NNNDRCQUV3Z2dFZkFvR0JBTjNqbmdMNnB4TWhhVnZyazBvSzNZKzJDNDJrNUtjaAorICAgICAgICAgICAgM25DaFNLQzd2RUdUWkJrMENOWElpRXdSOUphbnlKSFFoMG92SDRsQXR3MDZ0eWZSYkNYbitHRmJReGV5YVZMeAorICAgICAgICAgICAgMHprS3JhdTJZTWVpZ3ZGc1pNK3EwQXNUcSt4ZEFLVG1JdlBjeTBhSHVESkF4bnVyc2RQbHJjamswS0ZTQmpVdworICAgICAgICAgICAgdzFCVjYxRURXeTZ4QWhVQWhETGNGSzBHTy9IejFhcnhPT3ZzZ00vVkx5VUNnWUVBbm54N2hiZFdvekdidG5GZworICAgICAgICAgICAgbmJGbm9wZlJsN1hSYWNwa1BKUkdmNVAySVVnVnNwRVVTVW9ONmkxZkRCZkJnNDN6S3Q3ZGxFYVFMN2I1K0pUWgorICAgICAgICAgICAgdDNNaFpOUG9zeHNneFZ1VDdUcy9nNWs3RW5wZFl2MGE1aHc1QncyOWZqYkdIZmdNOGQycmhkMlVpMHhIYmswRAorICAgICAgICAgICAgNDUxbmhMeFZXdWx2aU9TUGh6S0t2WHJieVNBRGdZUUFBb0dBZmFnK0hDQUJJSmFkREQ5QWFyaGdjMlFSM0xwNworICAgICAgICAgICAgUHBNT2gwbEF3TGlJc3ZrTzRVbGJlT1MwSUpDOGJjcUxqTTFmVnc2RkdTYXhtcSs0eTFhZzJtOWs2SWRFMFFoNQorICAgICAgICAgICAgTnhCL3hGa21kd3FYRlJJSlZwNDRPZVV5Z0I0N1lLNzZObVVJWUczRGRmaVBQVTNicXpqdnRPdEVUaUNIdm8yNQorICAgICAgICAgICAgNEQ2VWp3UHBZRXJYUlVhak5qQTBNQTRHQTFVZER3RUIvd1FFQXdJQ0JEQVBCZ05WSFJNRUNEQUdBUUgvQWdFQQorICAgICAgICAgICAgTUJFR0ExVWREZ1FLQkFpRGhqNUFkakxpa3pBSkJnY3Foa2pPT0FRREF5OEFNQ3dDRkVMdTBudXdlcVc3V2YwcworICAgICAgICAgICAgZ2svQ0FHR0wwQkdLQWhSTmRnUUdyNWl5WktvSDRvcVBtMFZKOVRqWExnPT0KKyAgICAgICAgICA8L1g1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgPC9YNTA5RGF0YT4KKyAgICAgIDwvT2JqZWN0PgorICAgIDwvU2lnbmF0dXJlPgorICA8L1lvdXJzU2luY2VyZWx5PgorICA8UG9zdFNjcmlwdD5iYXI8L1Bvc3RTY3JpcHQ+CisgIDxOb3RhcmllcyBJZD0ibm90YXJpZXMiIHhtbG5zPSIiPgorICAgIDxOb3RhcnkgbmFtZT0iR3JlYXQsIEEuIFQuIiAvPgorICAgIDxOb3RhcnkgbmFtZT0iSHVuLCBBLiBULiIgLz4KKyAgPC9Ob3Rhcmllcz4KKyAgPCEtLSBDb21tZW50YXJ5IC0tPgorPC9FbnZlbG9wZT4KKzwhLS0gUG9zdGFtYmxlIC0tPgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS54bWwgYi9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUvc2lnbmF0dXJlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDRmYmUxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3NpZ25hdHVyZS54bWwKQEAgLTAsMCArMSwyNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgRW52ZWxvcGUgWworICA8IUVOVElUWSBkc2lnICdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz4KKyAgPCFFTlRJVFkgYzE0biAnaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUnPgorICA8IUVOVElUWSB4cGF0aCAnaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHBhdGgtMTk5OTExMTYnPgorICA8IUVOVElUWSB4c2x0ICdodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14c2x0LTE5OTkxMTE2Jz4KKyAgPCFBVFRMSVNUIE5vdGFyaWVzIElkIElEICNJTVBMSUVEPgorXT4KKzwhLS0gUHJlYW1ibGUgLS0+Cis8RW52ZWxvcGUgeG1sbnM6Zm9vPSJodHRwOi8vZXhhbXBsZS5vcmcvZm9vIiB4bWxucz0iaHR0cDovL2V4YW1wbGUub3JnL3VzcHMiPgorICA8RGVhclNpcj5mb288L0RlYXJTaXI+CisgIDxCb2R5PmJhcjwvQm9keT4KKyAgPFlvdXJzU2luY2VyZWx5PgorICAgIDxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiIElkPSJzaWduYXR1cmUiPgorICAgICAgPFNpZ25lZEluZm8+CisgICAgICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+CisgICAgICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiIC8+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9TaWduYXR1cmUvMjAwMi8wNC94bWwtc3R5bGVzaGVldC5iNjQiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiIFVSST0iI29iamVjdC0xIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNiI+CisgICAgICAgICAgICAgIDxYUGF0aD4KKyAgICAgICAgICAgICAgICBzZWxmOjp0ZXh0KCkKKyAgICAgICAgICAgICAgPC9YUGF0aD4KKyAgICAgICAgICAgIDwvVHJhbnNmb3JtPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPnp5anA4R0pPWDY5OTkwS2txdzhpb1BYR0V4az08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0IiBVUkk9IiI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHBhdGgtMTk5OTExMTYiPgorICAgICAgICAgICAgICA8WFBhdGggeG1sbnM6ZHNpZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgICAgICAgICAgICAgICAgYW5jZXN0b3Itb3Itc2VsZjo6ZHNpZzpTaWduZWRJbmZvCisgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICBjb3VudChhbmNlc3Rvci1vci1zZWxmOjpkc2lnOlJlZmVyZW5jZSB8CisgICAgICAgICAgICAgICAgICAgICAgaGVyZSgpL2FuY2VzdG9yOjpkc2lnOlJlZmVyZW5jZVsxXSkgJmd0OworICAgICAgICAgICAgICAgIGNvdW50KGFuY2VzdG9yLW9yLXNlbGY6OmRzaWc6UmVmZXJlbmNlKQorICAgICAgICAgICAgICAgICAgb3IKKyAgICAgICAgICAgICAgICBjb3VudChhbmNlc3Rvci1vci1zZWxmOjpub2RlKCkgfAorICAgICAgICAgICAgICAgICAgICAgIGlkKCdub3RhcmllcycpKSA9CisgICAgICAgICAgICAgICAgY291bnQoYW5jZXN0b3Itb3Itc2VsZjo6bm9kZSgpKQorICAgICAgICAgICAgICA8L1hQYXRoPgorICAgICAgICAgICAgPC9UcmFuc2Zvcm0+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+dFFpRTNHVUtpQmVuUHlwM0owRWk2ckpNRnY0PTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiIFVSST0iI29iamVjdC0yIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjYmFzZTY0IiAvPgorICAgICAgICAgIDwvVHJhbnNmb3Jtcz4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPnp5anA4R0pPWDY5OTkwS2txdzhpb1BYR0V4az08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjTWFuaWZlc3QiIFVSST0iI21hbmlmZXN0LTEiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+cWc0SEZ3c04rL1dYMzJ1SDg1V2xKVTlsNDVrPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNTaWduYXR1cmVQcm9wZXJ0aWVzIiBVUkk9IiNzaWduYXR1cmUtcHJvcGVydGllcy0xIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPkVUbEVJM3k3aHZ2QXRNZTl3UVN6N0xoYkhFRT08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiI+CisgICAgICAgICAgPFRyYW5zZm9ybXM+CisgICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2VudmVsb3BlZC1zaWduYXR1cmUiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+Si9PMEhoZGFQWHh4NDlmZ0dXTUVTTDA5R3BBPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIgLz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+Si9PMEhoZGFQWHh4NDlmZ0dXTUVTTDA5R3BBPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iI3hwb2ludGVyKC8pIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIgLz4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5KL08wSGhkYVBYeHg0OWZnR1dNRVNMMDlHcEE9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVVJJPSIjeHBvaW50ZXIoLykiPgorICAgICAgICAgIDxUcmFuc2Zvcm1zPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIiAvPgorICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1I1dpdGhDb21tZW50cyIgLz4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT5Na0w5Q1g4eWVBQkJ0aDFSQ2h5UHg1OExzOHc9PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIgVVJJPSIjb2JqZWN0LTMiPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+eWFtU0lva0ttakEzaEIvczNGdTA3d0RPM3ZNPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiIFVSST0iI29iamVjdC0zIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+eWFtU0lva0ttakEzaEIvczNGdTA3d0RPM3ZNPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFR5cGU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiIFVSST0iI3hwb2ludGVyKGlkKCdvYmplY3QtMycpKSI+CisgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgIDxEaWdlc3RWYWx1ZT55YW1TSW9rS21qQTNoQi9zM0Z1MDd3RE8zdk09PC9EaWdlc3RWYWx1ZT4KKyAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgIDxSZWZlcmVuY2UgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIgVVJJPSIjeHBvaW50ZXIoaWQoJ29iamVjdC0zJykpIj4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMiIC8+CisgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4KKyAgICAgICAgICA8RGlnZXN0VmFsdWU+NDE5Q1lneVRXT1RHWUdCaHppZVdrbE5mN0JrPTwvRGlnZXN0VmFsdWU+CisgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8UmVmZXJlbmNlIFVSST0iI3JlZmVyZW5jZS0yIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPlZ6SzQ1UDlLc2pxcTVvWGxLUXBrR2dCMkNOWT08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBJZD0icmVmZXJlbmNlLTEiIFVSST0iI21hbmlmZXN0LXJlZmVyZW5jZS0xIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPjcvOWZSK05JRHo5b3djMUxmc3h1MUpCcjh1bz08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgICAgPFJlZmVyZW5jZSBJZD0icmVmZXJlbmNlLTIiIFVSST0iI3JlZmVyZW5jZS0xIj4KKyAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgPERpZ2VzdFZhbHVlPnFVUmxvM0xTcTRUV1F0eWdCWkowaVhROUUxND08L0RpZ2VzdFZhbHVlPgorICAgICAgICA8L1JlZmVyZW5jZT4KKyAgICAgIDwvU2lnbmVkSW5mbz4KKyAgICAgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICAgICAgV3ZaVUpBSi8zUU5xelF2d25lMnZ2eTdVNVBjazhaWjVVVGE2cEl3UjdHRStQb0dpNkExa3l3PT0KKyAgICAgIDwvU2lnbmF0dXJlVmFsdWU+CisgICAgICA8S2V5SW5mbz4KKyAgICAgICAgPFJldHJpZXZhbE1ldGhvZCBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjWDUwOURhdGEiIFVSST0iI29iamVjdC00Ij4KKyAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNiI+CisgICAgICAgICAgICAgIDxYUGF0aCB4bWxuczpkc2lnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgICAgICAgICAgICAgICBhbmNlc3Rvci1vci1zZWxmOjpkc2lnOlg1MDlEYXRhCisgICAgICAgICAgICAgIDwvWFBhdGg+CisgICAgICAgICAgICA8L1RyYW5zZm9ybT4KKyAgICAgICAgICA8L1RyYW5zZm9ybXM+CisgICAgICAgIDwvUmV0cmlldmFsTWV0aG9kPgorICAgICAgPC9LZXlJbmZvPgorICAgICAgPE9iamVjdCBJZD0ib2JqZWN0LTEiIE1pbWVUeXBlPSJ0ZXh0L3BsYWluIj5JIGFtIHRoZSB0ZXh0LjwvT2JqZWN0PgorICAgICAgPE9iamVjdCBFbmNvZGluZz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIgSWQ9Im9iamVjdC0yIiBNaW1lVHlwZT0idGV4dC9wbGFpbiI+U1NCaGJTQjBhR1VnZEdWNGRDND08L09iamVjdD4KKyAgICAgIDxPYmplY3QgSWQ9Im9iamVjdC0zIj4KKyAgICAgICAgPE5vbkNvbW1lbnRhbmR1cyB4bWxucz0iIj48IS0tIENvbW1lbnRhbmR1bSAtLT48L05vbkNvbW1lbnRhbmR1cz4KKyAgICAgIDwvT2JqZWN0PgorICAgICAgPE9iamVjdD4KKyAgICAgICAgPE1hbmlmZXN0IElkPSJtYW5pZmVzdC0xIj4KKyAgICAgICAgICA8UmVmZXJlbmNlIElkPSJtYW5pZmVzdC1yZWZlcmVuY2UtMSIgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiNyZWZlcmVuY2UtMSI+CisgICAgICAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICAgICAgICA8RGlnZXN0VmFsdWU+cVVSbG8zTFNxNFRXUXR5Z0JaSjBpWFE5RTE0PTwvRGlnZXN0VmFsdWU+CisgICAgICAgICAgPC9SZWZlcmVuY2U+CisgICAgICAgICAgPFJlZmVyZW5jZSBVUkk9IiNub3RhcmllcyI+CisgICAgICAgICAgICA8VHJhbnNmb3Jtcz4KKyAgICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhzbHQtMTk5OTExMTYiPgorICAgICAgICAgICAgICAgIDx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9zdHJpY3QiIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJmb28iIHZlcnNpb249IjEuMCI+CisgICAgICAgICAgICAgICAgICA8eHNsOm91dHB1dCBlbmNvZGluZz0iVVRGLTgiIGluZGVudD0ibm8iIG1ldGhvZD0ieG1sIiAvPgorICAgICAgICAgICAgICAgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+CisgICAgICAgICAgICAgICAgICAgIDxodG1sPgorICAgICAgICAgICAgICAgICAgICAgIDxoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk5vdGFyaWVzPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICA8L2hlYWQ+CisgICAgICAgICAgICAgICAgICAgICAgPGJvZHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJOb3Rhcmllcy9Ob3RhcnkiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBuYW1lIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8L3hzbDpmb3ItZWFjaD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgPC9ib2R5PgorICAgICAgICAgICAgICAgICAgICA8L2h0bWw+CisgICAgICAgICAgICAgICAgICA8L3hzbDp0ZW1wbGF0ZT4KKyAgICAgICAgICAgICAgICA8L3hzbDpzdHlsZXNoZWV0PgorICAgICAgICAgICAgICA8L1RyYW5zZm9ybT4KKyAgICAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPgorICAgICAgICAgICAgPC9UcmFuc2Zvcm1zPgorICAgICAgICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgICAgICAgPERpZ2VzdFZhbHVlPmM3d3E1WEtvczZScU5WSnlGeTcvZmw2K3NBcz08L0RpZ2VzdFZhbHVlPgorICAgICAgICAgIDwvUmVmZXJlbmNlPgorICAgICAgICA8L01hbmlmZXN0PgorICAgICAgPC9PYmplY3Q+CisgICAgICA8T2JqZWN0PgorICAgICAgICA8U2lnbmF0dXJlUHJvcGVydGllcyBJZD0ic2lnbmF0dXJlLXByb3BlcnRpZXMtMSI+CisgICAgICAgICAgPFNpZ25hdHVyZVByb3BlcnR5IFRhcmdldD0iI3NpZ25hdHVyZSI+CisgICAgICAgICAgICA8U2lnbmVyQWRkcmVzcyB4bWxucz0idXJuOmRlbW8iPjxJUD4xOTIuMTY4LjIxLjEzODwvSVA+PC9TaWduZXJBZGRyZXNzPgorICAgICAgICAgIDwvU2lnbmF0dXJlUHJvcGVydHk+CisgICAgICAgIDwvU2lnbmF0dXJlUHJvcGVydGllcz4KKyAgICAgIDwvT2JqZWN0PgorICAgICAgPE9iamVjdCBJZD0ib2JqZWN0LTQiPgorICAgICAgICA8WDUwOURhdGE+CisgICAgICAgICAgPFg1MDlTdWJqZWN0TmFtZT4KKyAgICAgICAgICAgIENOPU1lcmxpbiBIdWdoZXMsT1U9WC9TZWN1cmUsTz1CYWx0aW1vcmUgVGVjaG5vbG9naWVzIEx0ZC4sU1Q9RHVibGluLEM9SUUKKyAgICAgICAgICA8L1g1MDlTdWJqZWN0TmFtZT4KKyAgICAgICAgICA8WDUwOUlzc3VlclNlcmlhbD4KKyAgICAgICAgICAgIDxYNTA5SXNzdWVyTmFtZT4KKyAgICAgICAgICAgICAgQ049VHJhbnNpZW50IENBLE9VPVgvU2VjdXJlLE89QmFsdGltb3JlIFRlY2hub2xvZ2llcyBMdGQuLFNUPUR1YmxpbixDPUlFCisgICAgICAgICAgICA8L1g1MDlJc3N1ZXJOYW1lPgorICAgICAgICAgICAgPFg1MDlTZXJpYWxOdW1iZXI+MTAxNzc4ODM3MDM0ODwvWDUwOVNlcmlhbE51bWJlcj4KKyAgICAgICAgICA8L1g1MDlJc3N1ZXJTZXJpYWw+CisgICAgICAgICAgPFg1MDlDZXJ0aWZpY2F0ZT4KKyAgICAgICAgICAgIE1JSURVRENDQXhDZ0F3SUJBZ0lHQU96NDZnMnNNQWtHQnlxR1NNNDRCQU13YmpFTE1Ba0dBMVVFQmhNQ1NVVXgKKyAgICAgICAgICAgIER6QU5CZ05WQkFnVEJrUjFZbXhwYmpFa01DSUdBMVVFQ2hNYlFtRnNkR2x0YjNKbElGUmxZMmh1YjJ4dloybGwKKyAgICAgICAgICAgIGN5Qk1kR1F1TVJFd0R3WURWUVFMRXdoWUwxTmxZM1Z5WlRFVk1CTUdBMVVFQXhNTVZISmhibk5wWlc1MElFTkIKKyAgICAgICAgICAgIE1CNFhEVEF5TURRd01qSXlOVGt6TUZvWERURXlNRFF3TWpJeE5Ua3lOVm93YnpFTE1Ba0dBMVVFQmhNQ1NVVXgKKyAgICAgICAgICAgIER6QU5CZ05WQkFnVEJrUjFZbXhwYmpFa01DSUdBMVVFQ2hNYlFtRnNkR2x0YjNKbElGUmxZMmh1YjJ4dloybGwKKyAgICAgICAgICAgIGN5Qk1kR1F1TVJFd0R3WURWUVFMRXdoWUwxTmxZM1Z5WlRFV01CUUdBMVVFQXhNTlRXVnliR2x1SUVoMVoyaGwKKyAgICAgICAgICAgIGN6Q0NBYmN3Z2dFc0JnY3Foa2pPT0FRQk1JSUJId0tCZ1FEZDQ1NEMrcWNUSVdsYjY1TktDdDJQdGd1TnBPU24KKyAgICAgICAgICAgIElkNXdvVWlndTd4QmsyUVpOQWpWeUloTUVmU1dwOGlSMElkS0x4K0pRTGNOT3JjbjBXd2w1L2hoVzBNWHNtbFMKKyAgICAgICAgICAgIDhkTTVDcTJydG1ESG9vTHhiR1RQcXRBTEU2dnNYUUNrNWlMejNNdEdoN2d5UU1aN3E3SFQ1YTNJNU5DaFVnWTEKKyAgICAgICAgICAgIE1NTlFWZXRSQTFzdXNRSVZBSVF5M0JTdEJqdng4OVdxOFRqcjdJRFAxUzhsQW9HQkFKNThlNFczVnFNeG03WngKKyAgICAgICAgICAgIFlKMnhaNktYMFplMTBXbktaRHlVUm4rVDlpRklGYktSRkVsS0Rlb3RYd3dYd1lPTjh5cmUzWlJHa0MrMitmaVUKKyAgICAgICAgICAgIDJiZHpJV1RUNkxNYklNVmJrKzA3UDRPWk94SjZYV0w5R3VZY09RY052WDQyeGgzNERQSGRxNFhkbEl0TVIyNU4KKyAgICAgICAgICAgIEErT2RaNFM4VlZycGI0amtqNGN5aXIxNjI4a2dBNEdFQUFLQmdISDJLWW9hUUVIbnFXelJVdURBRzBFWVhWNlEKKyAgICAgICAgICAgIDR1Y0M2OE1ST1lTTDZHS3FOUy9BVUZidkgyTlV4UUQ3YUdudFlnWVB4aUNjajk0aTM4cmdTV2c3eVNTejk5TUEKKyAgICAgICAgICAgIFIvWXY3T1NkK3VlajNyNlRsWFUzNHUrK3hZdlJvK3N2NG05bGIvam1YeVpKS2VDK2RQcWVVMUlUNWtDeWJVUkwKKyAgICAgICAgICAgIElMWmZyWnlEc2lVL3ZodlZvem93T0RBT0JnTlZIUThCQWY4RUJBTUNCNEF3RVFZRFZSME9CQW9FQ0lhdFk3U0UKKyAgICAgICAgICAgIGxYRU9NQk1HQTFVZEl3UU1NQXFBQ0lPR1BrQjJNdUtUTUFrR0J5cUdTTTQ0QkFNREx3QXdMQUlVU3ZUMDJpUWoKKyAgICAgICAgICAgIFE1ZGE0V3BlMEJ2czdHdUNjVnNDRkNFY1FwYmpVZm54WEZYTldpRnlRNDlacldxbgorICAgICAgICAgIDwvWDUwOUNlcnRpZmljYXRlPgorICAgICAgICAgIDxYNTA5Q2VydGlmaWNhdGU+CisgICAgICAgICAgICBNSUlEU3pDQ0F3dWdBd0lCQWdJR0FPejQ2ZndKTUFrR0J5cUdTTTQ0QkFNd2JqRUxNQWtHQTFVRUJoTUNTVVV4CisgICAgICAgICAgICBEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWtNQ0lHQTFVRUNoTWJRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsCisgICAgICAgICAgICBjeUJNZEdRdU1SRXdEd1lEVlFRTEV3aFlMMU5sWTNWeVpURVZNQk1HQTFVRUF4TU1WSEpoYm5OcFpXNTBJRU5CCisgICAgICAgICAgICBNQjRYRFRBeU1EUXdNakl5TlRreU5Wb1hEVEV5TURRd01qSXhOVGt5TlZvd2JqRUxNQWtHQTFVRUJoTUNTVVV4CisgICAgICAgICAgICBEekFOQmdOVkJBZ1RCa1IxWW14cGJqRWtNQ0lHQTFVRUNoTWJRbUZzZEdsdGIzSmxJRlJsWTJodWIyeHZaMmxsCisgICAgICAgICAgICBjeUJNZEdRdU1SRXdEd1lEVlFRTEV3aFlMMU5sWTNWeVpURVZNQk1HQTFVRUF4TU1WSEpoYm5OcFpXNTBJRU5CCisgICAgICAgICAgICBNSUlCdHpDQ0FTd0dCeXFHU000NEJBRXdnZ0VmQW9HQkFOM2puZ0w2cHhNaGFWdnJrMG9LM1krMkM0Mms1S2NoCisgICAgICAgICAgICAzbkNoU0tDN3ZFR1RaQmswQ05YSWlFd1I5SmFueUpIUWgwb3ZINGxBdHcwNnR5ZlJiQ1huK0dGYlF4ZXlhVkx4CisgICAgICAgICAgICAwemtLcmF1MllNZWlndkZzWk0rcTBBc1RxK3hkQUtUbUl2UGN5MGFIdURKQXhudXJzZFBscmNqazBLRlNCalV3CisgICAgICAgICAgICB3MUJWNjFFRFd5NnhBaFVBaERMY0ZLMEdPL0h6MWFyeE9PdnNnTS9WTHlVQ2dZRUFubng3aGJkV296R2J0bkZnCisgICAgICAgICAgICBuYkZub3BmUmw3WFJhY3BrUEpSR2Y1UDJJVWdWc3BFVVNVb042aTFmREJmQmc0M3pLdDdkbEVhUUw3YjUrSlRaCisgICAgICAgICAgICB0M01oWk5Qb3N4c2d4VnVUN1RzL2c1azdFbnBkWXYwYTVodzVCdzI5ZmpiR0hmZ004ZDJyaGQyVWkweEhiazBECisgICAgICAgICAgICA0NTFuaEx4Vld1bHZpT1NQaHpLS3ZYcmJ5U0FEZ1lRQUFvR0FmYWcrSENBQklKYWRERDlBYXJoZ2MyUVIzTHA3CisgICAgICAgICAgICBQcE1PaDBsQXdMaUlzdmtPNFVsYmVPUzBJSkM4YmNxTGpNMWZWdzZGR1NheG1xKzR5MWFnMm05azZJZEUwUWg1CisgICAgICAgICAgICBOeEIveEZrbWR3cVhGUklKVnA0NE9lVXlnQjQ3WUs3Nk5tVUlZRzNEZGZpUFBVM2Jxemp2dE90RVRpQ0h2bzI1CisgICAgICAgICAgICA0RDZVandQcFlFclhSVWFqTmpBME1BNEdBMVVkRHdFQi93UUVBd0lDQkRBUEJnTlZIUk1FQ0RBR0FRSC9BZ0VBCisgICAgICAgICAgICBNQkVHQTFVZERnUUtCQWlEaGo1QWRqTGlrekFKQmdjcWhrak9PQVFEQXk4QU1Dd0NGRUx1MG51d2VxVzdXZjBzCisgICAgICAgICAgICBnay9DQUdHTDBCR0tBaFJOZGdRR3I1aXlaS29ING9xUG0wVko5VGpYTGc9PQorICAgICAgICAgIDwvWDUwOUNlcnRpZmljYXRlPgorICAgICAgICA8L1g1MDlEYXRhPgorICAgICAgPC9PYmplY3Q+CisgICAgPC9TaWduYXR1cmU+CisgIDwvWW91cnNTaW5jZXJlbHk+CisgIDxQb3N0U2NyaXB0PmJhcjwvUG9zdFNjcmlwdD4KKyAgPE5vdGFyaWVzIHhtbG5zPSIiIElkPSJub3RhcmllcyI+CisgICAgPE5vdGFyeSBuYW1lPSJHcmVhdCwgQS4gVC4iIC8+CisgICAgPE5vdGFyeSBuYW1lPSJIdW4sIEEuIFQuIiAvPgorICA8L05vdGFyaWVzPgorICA8IS0tIENvbW1lbnRhcnkgLS0+Cis8L0VudmVsb3BlPgorPCEtLSBQb3N0YW1ibGUgLS0+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvaWUvYmFsdGltb3JlL21lcmxpbi1leGFtcGxlcy9tZXJsaW4teG1sZHNpZy10d2VudHktdGhyZWUveG1sLXN0eWxlc2hlZXQuYjY0IGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3htbC1zdHlsZXNoZWV0LmI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjlhMTFhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3htbC1zdHlsZXNoZWV0LmI2NApAQCAtMCwwICsxLDI3NCBAQAorUENGRVQwTlVXVkJGSUdoMGJXd2dVRlZDVEVsRElDSXRMeTlYTTBNdkwwUlVSQ0JJVkUxTUlEUXVNQ0JVY21GdQorYzJsMGFXOXVZV3d2TDBWT0lqNEtQR2gwYld3K0NqeG9aV0ZrUGdvOGRHbDBiR1UrUVhOemIyTnBZWFJwYm1jZworVTNSNWJHVWdVMmhsWlhSeklIZHBkR2dnV0UxTUlHUnZZM1Z0Wlc1MGN6d3ZkR2wwYkdVK0NqeHNhVzVySUhKbAorYkQwaWMzUjViR1Z6YUdWbGRDSWdkSGx3WlQwaWRHVjRkQzlqYzNNaUlHaHlaV1k5SW1oMGRIQTZMeTkzZDNjdQorZHpNdWIzSm5MMU4wZVd4bFUyaGxaWFJ6TDFSU0wxY3pReTFTUlVNaVBnbzhjM1I1YkdVZ2RIbHdaVDBpZEdWNAorZEM5amMzTWlQbU52WkdVZ2V5Qm1iMjUwTFdaaGJXbHNlVG9nYlc5dWIzTndZV05sSUgwOEwzTjBlV3hsUGdvOAorTDJobFlXUStDanhpYjJSNVBnbzhaR2wySUdOc1lYTnpQU0pvWldGa0lqNEtQR0VnYUhKbFpqMGlhSFIwY0RvdgorTDNkM2R5NTNNeTV2Y21jdklqNDhhVzFuSUhOeVl6MGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZTV052Ym5NdgorVjFkWEwzY3pZMTlvYjIxbElpQmhiSFE5SWxjelF5SWdhR1ZwWjJoMFBTSTBPQ0lnZDJsa2RHZzlJamN5SWo0OAorTDJFK0NqeG9NVDVCYzNOdlkybGhkR2x1WnlCVGRIbHNaU0JUYUdWbGRITWdkMmwwYUNCWVRVd2daRzlqZFcxbAorYm5SelBHSnlQbFpsY25OcGIyNGdNUzR3UEM5b01UNEtQR2d5UGxjelF5QlNaV052YlcxbGJtUmhkR2x2YmlBeQorT1NCS2RXNWxJREU1T1RrOEwyZ3lQZ284Wkd3K0NqeGtkRDVVYUdseklIWmxjbk5wYjI0NlBDOWtkRDRLUEdSaworUGdvOFlTQm9jbVZtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk4eE9UazVMekEyTDFKRlF5MTRiV3d0YzNSNQorYkdWemFHVmxkQzB4T1RrNU1EWXlPU0krYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2TVRrNU9TOHdOaTlTUlVNdAorZUcxc0xYTjBlV3hsYzJobFpYUXRNVGs1T1RBMk1qazhMMkUrQ2p4aWNqNEtQQzlrWkQ0S1BHUjBQa3hoZEdWegorZENCMlpYSnphVzl1T2p3dlpIUStDanhrWkQ0S1BHRWdhSEpsWmowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdgorVkZJdmVHMXNMWE4wZVd4bGMyaGxaWFFpUG1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDFSU0wzaHRiQzF6ZEhscworWlhOb1pXVjBQQzloUGdvOFluSStDand2WkdRK0NqeGtkRDVRY21WMmFXOTFjeUIyWlhKemFXOXVPand2WkhRKworQ2p4a1pENEtQR0VnYUhKbFpqMGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZWRkl2TVRrNU9TOTRiV3d0YzNSNQorYkdWemFHVmxkQzB4T1RrNU1EUXlPQ0krYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2VkZJdk1UazVPUzk0Yld3dAorYzNSNWJHVnphR1ZsZEMweE9UazVNRFF5T0R3dllUNEtQR0p5UGdvOEwyUmtQZ284WkhRK1JXUnBkRzl5T2p3dgorWkhRK0NqeGtaRDRLQ2twaGJXVnpJRU5zWVhKckNqeGhJR2h5WldZOUltMWhhV3gwYnpwcWFtTkFhbU5zWVhKcgorTG1OdmJTSStKbXgwTzJwcVkwQnFZMnhoY21zdVkyOXRKbWQwT3p3dllUNEtQR0p5UGdvOEwyUmtQZ284TDJScworUGdvOGNDQmpiR0Z6Y3owaVkyOXdlWEpwWjJoMElqNEtQR0VnYUhKbFpqMGlhSFIwY0RvdkwzZDNkeTUzTXk1dgorY21jdlEyOXVjMjl5ZEdsMWJTOU1aV2RoYkM5cGNISXRibTkwYVdObExtaDBiV3dqUTI5d2VYSnBaMmgwSWo0SworQ1FsRGIzQjVjbWxuYUhROEwyRStJQ1p1WW5Od095WmpiM0I1T3ladVluTndPeUF4T1RrNUlEeGhJR2h5WldZOQorSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puSWo1WE0wTThMMkUrQ2drSktEeGhJR2h5WldZOUltaDBkSEE2THk5MworZDNjdWJHTnpMbTFwZEM1bFpIVWlQazFKVkR3dllUNHNDZ2tKUEdFZ2FISmxaajBpYUhSMGNEb3ZMM2QzZHk1cAorYm5KcFlTNW1jaThpUGtsT1VrbEJQQzloUGl3S0NRazhZU0JvY21WbVBTSm9kSFJ3T2k4dmQzZDNMbXRsYVc4dQorWVdNdWFuQXZJajVMWldsdlBDOWhQaUFwTENCQmJHd2dVbWxuYUhSeklGSmxjMlZ5ZG1Wa0xpQlhNME1LQ1FrOAorWVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTlEYjI1emIzSjBhWFZ0TDB4bFoyRnNMMmx3Y2kxdQorYjNScFkyVXVhSFJ0YkNOTVpXZGhiQ0JFYVhOamJHRnBiV1Z5SWo1c2FXRmlhV3hwZEhrc1BDOWhQanhoSUdoeQorWldZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbkwwTnZibk52Y25ScGRXMHZUR1ZuWVd3dmFYQnlMVzV2ZEdsagorWlM1b2RHMXNJMWN6UXlCVWNtRmtaVzFoY210eklqNTBjbUZrWlcxaGNtczhMMkUrTEFvSkNUeGhJR2h5WldZOQorSW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDBOdmJuTnZjblJwZFcwdlRHVm5ZV3d2WTI5d2VYSnBaMmgwTFdSdgorWTNWdFpXNTBjeTVvZEcxc0lqNWtiMk4xYldWdWRDQjFjMlVnUEM5aFBtRnVaQW9KQ1R4aElHaHlaV1k5SW1oMAorZEhBNkx5OTNkM2N1ZHpNdWIzSm5MME52Ym5OdmNuUnBkVzB2VEdWbllXd3ZZMjl3ZVhKcFoyaDBMWE52Wm5SMworWVhKbExtaDBiV3dpUG5OdlpuUjNZWEpsSUd4cFkyVnVjMmx1WnlBOEwyRStjblZzWlhNZ1lYQndiSGt1Q2drOAorTDNBK0NqeG9jaUIwYVhSc1pUMGlVMlZ3WVhKaGRHOXlJR1p2Y2lCb1pXRmtaWElpUGdvOEwyUnBkajRLUEdneQorUGdvOFlTQnVZVzFsUFNKaFluTjBjbUZqZENJK1FXSnpkSEpoWTNROEwyRStDand2YURJK0NnbzhjRDVVYUdsegorSUdSdlkzVnRaVzUwSUdGc2JHOTNjeUJoSUhOMGVXeGxJSE5vWldWMElIUnZJR0psSUdGemMyOWphV0YwWldRZworZDJsMGFDQmhiaUJZVFV3S1pHOWpkVzFsYm5RZ1lua2dhVzVqYkhWa2FXNW5JRzl1WlNCdmNpQnRiM0psSUhCeQorYjJObGMzTnBibWNnYVc1emRISjFZM1JwYjI1eklIZHBkR2dnWVFwMFlYSm5aWFFnYjJZZ1BHTnZaR1UrZUcxcworTFhOMGVXeGxjMmhsWlhROEwyTnZaR1UrSUdsdUlIUm9aU0JrYjJOMWJXVnVkQ2R6SUhCeWIyeHZaeTQ4TDNBKworQ2dvOGFESStDanhoSUc1aGJXVTlJbk4wWVhSMWN5SStVM1JoZEhWeklHOW1JSFJvYVhNZ1pHOWpkVzFsYm5ROAorTDJFK0Nqd3ZhREkrQ2dvOGNENVVhR2x6SUdSdlkzVnRaVzUwSUdoaGN5QmlaV1Z1SUhKbGRtbGxkMlZrSUdKNQorSUZjelF5Qk5aVzFpWlhKeklHRnVaQ0J2ZEdobGNpQnBiblJsY21WemRHVmtDbkJoY25ScFpYTWdZVzVrSUdoaAorY3lCaVpXVnVJR1Z1Wkc5eWMyVmtJR0o1SUhSb1pTQkVhWEpsWTNSdmNpQmhjeUJoSUZjelF5QThZU0JvY21WbQorUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk5RGIyNXpiM0owYVhWdEwxQnliMk5sYzNNdkkxSmxZM05YTTBNaQorUGxKbFkyOXRiV1Z1WkdGMGFXOXVQQzloUGk0Z1NYUUthWE1nWVNCemRHRmliR1VnWkc5amRXMWxiblFnWVc1aworSUcxaGVTQmlaU0IxYzJWa0lHRnpJSEpsWm1WeVpXNWpaU0J0WVhSbGNtbGhiQ0J2Y2lCamFYUmxaQ0JoY3dwaAorSUc1dmNtMWhkR2wyWlNCeVpXWmxjbVZ1WTJVZ1puSnZiU0J2ZEdobGNpQmtiMk4xYldWdWRITXVJRmN6UXlkegorSUhKdmJHVWdhVzRnYldGcmFXNW5JSFJvWlFwU1pXTnZiVzFsYm1SaGRHbHZiaUJwY3lCMGJ5QmtjbUYzSUdGMAorZEdWdWRHbHZiaUIwYnlCMGFHVWdjM0JsWTJsbWFXTmhkR2x2YmlCaGJtUWdkRzhLY0hKdmJXOTBaU0JwZEhNZworZDJsa1pYTndjbVZoWkNCa1pYQnNiM2x0Wlc1MExpQlVhR2x6SUdWdWFHRnVZMlZ6SUhSb1pTQm1kVzVqZEdsdgorYm1Gc2FYUjVJR0Z1WkFwcGJuUmxjbTl3WlhKaFltbHNhWFI1SUc5bUlIUm9aU0JYWldJdVBDOXdQZ29LUEhBKworVkdobElHeHBjM1FnYjJZZ2EyNXZkMjRnWlhKeWIzSnpJR2x1SUhSb2FYTWdjM0JsWTJsbWFXTmhkR2x2Ym5NZworYVhNZ1lYWmhhV3hoWW14bElHRjBDanhoSUdoeVpXWTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MekU1T1RrdgorTURZdlVrVkRMWGh0YkMxemRIbHNaWE5vWldWMExURTVPVGt3TmpJNUwyVnljbUYwWVNJK2FIUjBjRG92TDNkMworZHk1M015NXZjbWN2VkZJdk1UazVPUzk0Yld3dGMzUjViR1Z6YUdWbGRDMHhPVGs1TURZeU9TOWxjbkpoZEdFOAorTDJFK0xqd3ZjRDRLQ2p4d1BrTnZiVzFsYm5SeklHOXVJSFJvYVhNZ2MzQmxZMmxtYVdOaGRHbHZiaUJ0WVhrZworWW1VZ2MyVnVkQ0IwYnlBbWJIUTdQR0VnYUhKbFpqMGliV0ZwYkhSdk9uZDNkeTE0Yld3dGMzUjViR1Z6YUdWbAorZEMxamIyMXRaVzUwYzBCM015NXZjbWNpUG5kM2R5MTRiV3d0YzNSNWJHVnphR1ZsZEMxamIyMXRaVzUwYzBCMworTXk1dmNtYzhMMkUrSm1kME95NGdWR2hsSUdGeVkyaHBkbVVnYjJZZ2NIVmliR2xqQ21OdmJXMWxiblJ6SUdsegorSUdGMllXbHNZV0pzWlNCaGRDQThZU0JvY21WbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OUJjbU5vYVhabAorY3k5UWRXSnNhV012ZDNkM0xYaHRiQzF6ZEhsc1pYTm9aV1YwTFdOdmJXMWxiblJ6SWo1b2RIUndPaTh2ZHpNdQorYjNKbkwwRnlZMmhwZG1WekwxQjFZbXhwWXk5M2QzY3RlRzFzTFhOMGVXeGxjMmhsWlhRdFkyOXRiV1Z1ZEhNOAorTDJFK0xqd3ZjRDRLQ2p4d1BrRWdiR2x6ZENCdlppQmpkWEp5Wlc1MElGY3pReUJTWldOdmJXMWxibVJoZEdsdgorYm5NZ1lXNWtJRzkwYUdWeUlIUmxZMmh1YVdOaGJDQmtiMk4xYldWdWRITUtZMkZ1SUdKbElHWnZkVzVrSUdGMAorSUR4aElHaHlaV1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDFSU0lqNW9kSFJ3T2k4dmQzZDNMbmN6TG05eQorWnk5VVVqd3ZZVDR1UEM5d1Bnb0tQSEErVkdobElGZHZjbXRwYm1jZ1IzSnZkWEFnWlhod1pXTjBjeUJoWkdScAorZEdsdmJtRnNJRzFsWTJoaGJtbHpiWE1nWm05eUlHeHBibXRwYm1jZ2MzUjViR1VLYzJobFpYUnpJSFJ2SUZoTgorVENCa2IyTjFiV1Z1ZENCMGJ5QmlaU0JrWldacGJtVmtJR2x1SUdFZ1puVjBkWEpsSUhOd1pXTnBabWxqWVhScAorYjI0dVBDOXdQZ29LUEhBK1ZHaGxJSFZ6WlNCdlppQllUVXdnY0hKdlkyVnpjMmx1WnlCcGJuTjBjblZqZEdsdgorYm5NZ2FXNGdkR2hwY3lCemNHVmphV1pwWTJGMGFXOXVJSE5vYjNWc1pBcHViM1FnWW1VZ2RHRnJaVzRnWVhNZworWVNCd2NtVmpaV1JsYm5RdUlDQlVhR1VnVnpORElHUnZaWE1nYm05MElHRnVkR2xqYVhCaGRHVWdjbVZqYjIxdAorWlc1a2FXNW5DblJvWlNCMWMyVWdiMllnY0hKdlkyVnpjMmx1WnlCcGJuTjBjblZqZEdsdmJuTWdhVzRnWVc1NQorSUdaMWRIVnlaU0J6Y0dWamFXWnBZMkYwYVc5dUxpQWdWR2hsQ2p4aElHaHlaV1k5SWlOeVlYUnBiMjVoYkdVaQorUGxKaGRHbHZibUZzWlR3dllUNGdaWGh3YkdGcGJuTWdkMmg1SUhSb1pYa2dkMlZ5WlNCMWMyVmtJR2x1Q25SbworYVhNZ2MzQmxZMmxtYVdOaGRHbHZiaTQ4TDNBK0NnbzhjRDVVYUdseklHUnZZM1Z0Wlc1MElIZGhjeUJ3Y205aworZFdObFpDQmhjeUJ3WVhKMElHOW1JSFJvWlNBOFlTQm9jbVZtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk5WQorVFV3dlFXTjBhWFpwZEhraVBsY3pReUJZVFV3Z1FXTjBhWFpwZEhrOEwyRStMand2Y0Q0S0NnbzhhREkrQ2p4aAorSUc1aGJXVTlJbU52Ym5SbGJuUnpJajVVWVdKc1pTQnZaaUJqYjI1MFpXNTBjend2WVQ0S1BDOW9NajR4SUR4aAorSUdoeVpXWTlJaU5VYUdVZ2VHMXNMWE4wZVd4bGMyaGxaWFFnY0hKdlkyVnpjMmx1WnlCcGJuTjBjblZqZEdsdgorYmlJK1ZHaGxJSGh0YkMxemRIbHNaWE5vWldWMElIQnliMk5sYzNOcGJtY2dhVzV6ZEhKMVkzUnBiMjQ4TDJFKworQ2p4aWNqNEtQR2d6UGtGd2NHVnVaR2xqWlhNOEwyZ3pQa0VnUEdFZ2FISmxaajBpSTFKbFptVnlaVzVqWlhNaQorUGxKbFptVnlaVzVqWlhNOEwyRStDanhpY2o1Q0lEeGhJR2h5WldZOUlpTnlZWFJwYjI1aGJHVWlQbEpoZEdsdgorYm1Gc1pUd3ZZVDRLUEdKeVBnbzhhSEkrQ2dvOGFESStDanhoSUc1aGJXVTlJbFJvWlNCNGJXd3RjM1I1YkdWegorYUdWbGRDQndjbTlqWlhOemFXNW5JR2x1YzNSeWRXTjBhVzl1SWo0OEwyRStNU0JVYUdVZ1BHTnZaR1UrZUcxcworTFhOMGVXeGxjMmhsWlhROEwyTnZaR1UrSUhCeWIyTmxjM05wYm1jZ2FXNXpkSEoxWTNScGIyNDhMMmd5UGdvSworUEhBK1UzUjViR1VnVTJobFpYUnpJR05oYmlCaVpTQmhjM052WTJsaGRHVmtJSGRwZEdnZ1lXNGdXRTFNUEdFZworYUhKbFpqMGlJMWhOVENJK1cxaE5UREV3WFR3dllUNEtaRzlqZFcxbGJuUWdZbmtnZFhOcGJtY2dZU0J3Y205agorWlhOemFXNW5JR2x1YzNSeWRXTjBhVzl1SUhkb2IzTmxJSFJoY21kbGRDQnBjd284WTI5a1pUNTRiV3d0YzNSNQorYkdWemFHVmxkRHd2WTI5a1pUNHVJQ0JVYUdseklIQnliMk5sYzNOcGJtY2dhVzV6ZEhKMVkzUnBiMjRnWm05cworYkc5M2N5QjBhR1VLWW1Wb1lYWnBiM1Z5SUc5bUlIUm9aU0JJVkUxTUlEUXVNQ0E4WTI5a1pUNG1iSFE3VEVsTworU3dwU1JVdzlJbk4wZVd4bGMyaGxaWFFpSm1kME96d3ZZMjlrWlQ0OFlTQm9jbVZtUFNJalNGUk5UQ0krVzBoVQorVFV3ME1GMDhMMkUrTGp3dmNENEtDanh3UGxSb1pTQThZMjlrWlQ1NGJXd3RjM1I1YkdWemFHVmxkRHd2WTI5aworWlQ0Z2NISnZZMlZ6YzJsdVp5QnBibk4wY25WamRHbHZiaUJwY3lCd1lYSnpaV1FnYVc0S2RHaGxJSE5oYldVZworZDJGNUlHRnpJR0VnYzNSaGNuUXRkR0ZuTENCM2FYUm9JSFJvWlNCbGVHTmxjSFJwYjI0Z2RHaGhkQ0JsYm5ScAorZEdsbGN5QnZkR2hsY2dwMGFHRnVJSEJ5WldSbFptbHVaV1FnWlc1MGFYUnBaWE1nYlhWemRDQnViM1FnWW1VZworY21WbVpYSmxibU5sWkM0OEwzQStDZ284Y0Q1VWFHVWdabTlzYkc5M2FXNW5JR2R5WVcxdFlYSWdhWE1nWjJsMgorWlc0Z2RYTnBibWNnZEdobElITmhiV1VnYm05MFlYUnBiMjRnWVhNZ2RHaGxDbWR5WVcxdFlYSWdhVzRnZEdobAorSUZoTlRDQlNaV052YlcxbGJtUmhkR2x2Ymp4aElHaHlaV1k5SWlOWVRVd2lQbHRZVFV3eE1GMDhMMkUrTGlBZworVTNsdFltOXNjeUJwYmlCMGFHVUtaM0poYlcxaGNpQjBhR0YwSUdGeVpTQnViM1FnWkdWbWFXNWxaQ0JvWlhKbAorSUdGeVpTQmtaV1pwYm1Wa0lHbHVJSFJvWlNCWVRVd0tVbVZqYjIxdFpXNWtZWFJwYjI0dVBDOXdQZ29LUEdnMQorUG5odGJDMXpkSGxzWlhOb1pXVjBJSEJ5YjJObGMzTnBibWNnYVc1emRISjFZM1JwYjI0OEwyZzFQZ284ZEdGaQorYkdVZ1kyeGhjM005SW5OamNtRndJajRLUEhSaWIyUjVQZ284ZEhJZ2RtRnNhV2R1UFNKaVlYTmxiR2x1WlNJKworQ2p4MFpENEtQR0VnYm1GdFpUMGlUbFF0VTNSNWJHVlRhR1ZsZEZCSklqNDhMMkUrV3pGZEptNWljM0E3Sm01aQorYzNBN0ptNWljM0E3UEM5MFpENEtQSFJrUGxOMGVXeGxVMmhsWlhSUVNUd3ZkR1ErQ2p4MFpENG1ibUp6Y0RzbQorYm1KemNEc21ibUp6Y0RzNk9qMG1ibUp6Y0RzbWJtSnpjRHNtYm1KemNEczhMM1JrUGdvOGRHUStKeVpzZERzLworZUcxc0xYTjBlV3hsYzJobFpYUW5JQ2c4WVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTG5jekxtOXlaeTlVVWk5UworUlVNdGVHMXNJMDVVTFZNaVBsTThMMkUrSUR4aElHaHlaV1k5SWlOT1ZDMVFjMlYxWkc5QmRIUWlQbEJ6WlhWaworYjBGMGREd3ZZVDRwS2lBOFlTQm9jbVZtUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk5VVVpOVNSVU10ZUcxcworSTA1VUxWTWlQbE04TDJFK1B5QW5QeVpuZERzblBDOTBaRDRLUEhSa1BnbzhMM1JrUGdvOEwzUnlQZ284ZEhJZworZG1Gc2FXZHVQU0ppWVhObGJHbHVaU0krQ2p4MFpENEtQR0VnYm1GdFpUMGlUbFF0VUhObGRXUnZRWFIwSWo0OAorTDJFK1d6SmRKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdQQzkwWkQ0S1BIUmtQbEJ6WlhWa2IwRjBkRHd2ZEdRKworQ2p4MFpENG1ibUp6Y0RzbWJtSnpjRHNtYm1KemNEczZPajBtYm1KemNEc21ibUp6Y0RzbWJtSnpjRHM4TDNSaworUGdvOGRHUStDanhoSUdoeVpXWTlJbWgwZEhBNkx5OTNkM2N1ZHpNdWIzSm5MMVJTTDFKRlF5MTRiV3dqVGxRdAorVG1GdFpTSStUbUZ0WlR3dllUNGdQR0VnYUhKbFpqMGlhSFIwY0RvdkwzZDNkeTUzTXk1dmNtY3ZWRkl2VWtWRAorTFhodGJDTk9WQzFUSWo1VFBDOWhQajhnSnowbklEeGhJR2h5WldZOUltaDBkSEE2THk5M2QzY3Vkek11YjNKbgorTDFSU0wxSkZReTE0Yld3alRsUXRVeUkrVXp3dllUNC9JRHhoSUdoeVpXWTlJaU5PVkMxUWMyVjFaRzlCZEhSVworWVd4MVpTSStVSE5sZFdSdlFYUjBWbUZzZFdVOEwyRStDand2ZEdRK0NqeDBaRDRLUEM5MFpENEtQQzkwY2o0SworUEhSeUlIWmhiR2xuYmowaVltRnpaV3hwYm1VaVBnbzhkR1ErQ2p4aElHNWhiV1U5SWs1VUxWQnpaWFZrYjBGMAorZEZaaGJIVmxJajQ4TDJFK1d6TmRKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdQQzkwWkQ0S1BIUmtQbEJ6WlhWaworYjBGMGRGWmhiSFZsUEM5MFpENEtQSFJrUGladVluTndPeVp1WW5Od095WnVZbk53T3pvNlBTWnVZbk53T3ladQorWW5Od095WnVZbk53T3p3dmRHUStDangwWkQ0b0p5SW5JQ2hiWGlJbWJIUTdKbUZ0Y0R0ZElId2dQR0VnYUhKbAorWmowaWFIUjBjRG92TDNkM2R5NTNNeTV2Y21jdlZGSXZVa1ZETFhodGJDTk9WQzFEYUdGeVVtVm1JajVEYUdGeQorVW1WbVBDOWhQaUI4SUR4aElHaHlaV1k5SWlOT1ZDMVFjbVZrWldaRmJuUnBkSGxTWldZaVBsQnlaV1JsWmtWdQorZEdsMGVWSmxaand2WVQ0cEtpQW5JaWM4TDNSa1BnbzhkR1ErQ2p3dmRHUStDand2ZEhJK0NqeDBjaUIyWVd4cAorWjI0OUltSmhjMlZzYVc1bElqNEtQSFJrUGdvOEwzUmtQZ284ZEdRK0Nqd3ZkR1ErQ2p4MFpENEtQQzkwWkQ0SworUEhSa1Bud2dJaWNpSUNoYlhpY21iSFE3Sm1GdGNEdGRJSHdnUEdFZ2FISmxaajBpYUhSMGNEb3ZMM2QzZHk1MworTXk1dmNtY3ZWRkl2VWtWRExYaHRiQ05PVkMxRGFHRnlVbVZtSWo1RGFHRnlVbVZtUEM5aFBpQjhJRHhoSUdoeQorWldZOUlpTk9WQzFRY21Wa1pXWkZiblJwZEhsU1pXWWlQbEJ5WldSbFprVnVkR2wwZVZKbFpqd3ZZVDRwS2lBaQorSnlJcFBDOTBaRDRLUEhSa1BnbzhMM1JrUGdvOEwzUnlQZ284ZEhJZ2RtRnNhV2R1UFNKaVlYTmxiR2x1WlNJKworQ2p4MFpENEtQQzkwWkQ0S1BIUmtQZ284TDNSa1BnbzhkR1ErQ2p3dmRHUStDangwWkQ0dElDZzhZU0JvY21WbQorUFNKb2RIUndPaTh2ZDNkM0xuY3pMbTl5Wnk5VVVpOVNSVU10ZUcxc0kwNVVMVU5vWVhJaVBrTm9ZWEk4TDJFKworS2lBblB5Wm5kRHNuSUR4aElHaHlaV1k5SW1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDFSU0wxSkZReTE0Yld3agorVGxRdFEyaGhjaUkrUTJoaGNqd3ZZVDRxS1R3dmRHUStDangwWkQ0S1BDOTBaRDRLUEM5MGNqNEtQSFJ5SUhaaAorYkdsbmJqMGlZbUZ6Wld4cGJtVWlQZ284ZEdRK0NqeGhJRzVoYldVOUlrNVVMVkJ5WldSbFprVnVkR2wwZVZKbAorWmlJK1BDOWhQbHMwWFNadVluTndPeVp1WW5Od095WnVZbk53T3p3dmRHUStDangwWkQ1UWNtVmtaV1pGYm5ScAorZEhsU1pXWThMM1JrUGdvOGRHUStKbTVpYzNBN0ptNWljM0E3Sm01aWMzQTdPam85Sm01aWMzQTdKbTVpYzNBNworSm01aWMzQTdQQzkwWkQ0S1BIUmtQaWNtWVcxd08yRnRjRHNuSUh3Z0p5WmhiWEE3YkhRN0p5QjhJQ2NtWVcxdworTzJkME95Y2dmQ0FuSm1GdGNEdHhkVzkwT3ljZ2ZDQW5KbUZ0Y0R0aGNHOXpPeWM4TDNSa1BnbzhkR1ErQ2p3dgorZEdRK0Nqd3ZkSEkrQ2p3dmRHSnZaSGsrQ2p3dmRHRmliR1UrQ2dvOGNENUpiaUE4WVNCb2NtVm1QU0lqVGxRdAorVUhObGRXUnZRWFIwVm1Gc2RXVWlQbEJ6WlhWa2IwRjBkRlpoYkhWbFBDOWhQaXdnWVNBOFlTQm9jbVZtUFNKbworZEhSd09pOHZkM2QzTG5jekxtOXlaeTlVVWk5U1JVTXRlRzFzSTA1VUxVTm9ZWEpTWldZaVBrTm9ZWEpTWldZOAorTDJFK0lHOXlJR0VnUEdFZ2FISmxaajBpSTA1VUxWQnlaV1JsWmtWdWRHbDBlVkpsWmlJK1VISmxaR1ZtUlc1MAorYVhSNVVtVm1QQzloUGlCcGN5QnBiblJsY25CeVpYUmxaQ0JwYmlCMGFHVUtjMkZ0WlNCdFlXNXVaWElnWVhNZworYVc0Z1lTQnViM0p0WVd3Z1dFMU1JR0YwZEhKcFluVjBaU0IyWVd4MVpTNGdJRlJvWlNCaFkzUjFZV3dnZG1GcworZFdVZ2IyWUtkR2hsSUhCelpYVmtieTFoZEhSeWFXSjFkR1VnYVhNZ2RHaGxJSFpoYkhWbElHRm1kR1Z5SUdWaAorWTJnZ2NtVm1aWEpsYm1ObElHbHpJSEpsY0d4aFkyVmtJR0o1Q25Sb1pTQmphR0Z5WVdOMFpYSWdhWFFnY21WbQorWlhKbGJtTmxjeTRnSUZSb2FYTWdjbVZ3YkdGalpXMWxiblFnYVhNZ2JtOTBJSEJsY21admNtMWxaQXBoZFhSdgorYldGMGFXTmhiR3g1SUdKNUlHRnVJRmhOVENCd2NtOWpaWE56YjNJdVBDOXdQZ29LUEhBK1ZHaGxJRHhqYjJSbAorUG5odGJDMXpkSGxzWlhOb1pXVjBQQzlqYjJSbFBpQndjbTlqWlhOemFXNW5JR2x1YzNSeWRXTjBhVzl1SUdsegorSUdGc2JHOTNaV1FLYjI1c2VTQnBiaUIwYUdVZ2NISnZiRzluSUc5bUlHRnVJRmhOVENCa2IyTjFiV1Z1ZEM0ZworVkdobElITjViblJoZUNCdlppQllUVXdnWTI5dWMzUnlZV2x1Y3dwM2FHVnlaU0J3Y205alpYTnphVzVuSUdsdQorYzNSeWRXTjBhVzl1Y3lCaGNtVWdZV3hzYjNkbFpDQnBiaUIwYUdVZ2NISnZiRzluT3lCMGFHVUtQR052WkdVKworZUcxc0xYTjBlV3hsYzJobFpYUThMMk52WkdVK0lIQnliMk5sYzNOcGJtY2dhVzV6ZEhKMVkzUnBiMjRnYVhNZworWVd4c2IzZGxaQ0JoYm5sM2FHVnlaUXBwYmlCMGFHVWdjSEp2Ykc5bklIUm9ZWFFnYldWbGRITWdkR2hsYzJVZworWTI5dWMzUnlZV2x1ZEhNdVBDOXdQZ29LUEdKc2IyTnJjWFZ2ZEdVK0NqeGlQazVQVkVVNklEd3ZZajVKWmlCMAorYUdVZ1BHTnZaR1UrZUcxc0xYTjBlV3hsYzJobFpYUThMMk52WkdVK0lIQnliMk5sYzNOcGJtY2dhVzV6ZEhKMQorWTNScGIyNEtiMk5qZFhKeklHbHVJSFJvWlNCbGVIUmxjbTVoYkNCRVZFUWdjM1ZpYzJWMElHOXlJR2x1SUdFZworY0dGeVlXMWxkR1Z5SUdWdWRHbDBlU3dnYVhRZ2FYTUtjRzl6YzJsaWJHVWdkR2hoZENCcGRDQnRZWGtnYm05MAorSUdKbElIQnliMk5sYzNObFpDQmllU0JoSUc1dmJpMTJZV3hwWkdGMGFXNW5JRmhOVEFwd2NtOWpaWE56YjNJZworS0hObFpTQThZU0JvY21WbVBTSWpXRTFNSWo1YldFMU1NVEJkUEM5aFBpa3VQQzlpYkc5amEzRjFiM1JsUGdvSworUEhBK1ZHaGxJR1p2Ykd4dmQybHVaeUJ3YzJWMVpHOGdZWFIwY21saWRYUmxjeUJoY21VZ1pHVm1hVzVsWkR3dgorY0Q0S0NqeHdjbVUrYUhKbFppQkRSRUZVUVNBalVrVlJWVWxTUlVRS2RIbHdaU0JEUkVGVVFTQWpVa1ZSVlVsUworUlVRS2RHbDBiR1VnUTBSQlZFRWdJMGxOVUV4SlJVUUtiV1ZrYVdFZ1EwUkJWRUVnSTBsTlVFeEpSVVFLWTJoaAorY25ObGRDQkRSRUZVUVNBalNVMVFURWxGUkFwaGJIUmxjbTVoZEdVZ0tIbGxjM3h1YnlrZ0ltNXZJand2Y0hKbAorUGdvS1BIQStWR2hsSUhObGJXRnVkR2xqY3lCdlppQjBhR1VnY0hObGRXUnZMV0YwZEhKcFluVjBaWE1nWVhKbAorSUdWNFlXTjBiSGtnWVhNZ2QybDBhQW84WTI5a1pUNG1iSFE3VEVsT1N5QlNSVXc5SW5OMGVXeGxjMmhsWlhRaQorSm1kME96d3ZZMjlrWlQ0Z2FXNGdTRlJOVENBMExqQXNJSGRwZEdnZ2RHaGxDbVY0WTJWd2RHbHZiaUJ2WmlCMAorYUdVZ1BHTnZaR1UrWVd4MFpYSnVZWFJsUEM5amIyUmxQaUJ3YzJWMVpHOHRZWFIwY21saWRYUmxMaUFnU1dZSworUEdOdlpHVStZV3gwWlhKdVlYUmxQU0o1WlhNaVBDOWpiMlJsUGlCcGN5QnpjR1ZqYVdacFpXUXNJSFJvWlc0ZworZEdobElIQnliMk5sYzNOcGJtY0thVzV6ZEhKMVkzUnBiMjRnYUdGeklIUm9aU0J6WlcxaGJuUnBZM01nYjJZZworUEdOdlpHVStKbXgwTzB4SlRrc2dVa1ZNUFNKaGJIUmxjbTVoZEdVS2MzUjViR1Z6YUdWbGRDSW1aM1E3UEM5agorYjJSbFBpQnBibk4wWldGa0lHOW1JRHhqYjJSbFBpWnNkRHRNU1U1TENsSkZURDBpYzNSNWJHVnphR1ZsZENJbQorWjNRN1BDOWpiMlJsUGk0OEwzQStDZ284WW14dlkydHhkVzkwWlQ0S1BHSStUazlVUlRvZ1BDOWlQbE5wYm1ObAorSUhSb1pTQjJZV3gxWlNCdlppQjBhR1VnUEdOdlpHVSthSEpsWmp3dlkyOWtaVDRnWVhSMGNtbGlkWFJsSUdsegorSUdFZ1ZWSkpDbkpsWm1WeVpXNWpaU3dnYVhRZ2JXRjVJR0psSUdFZ2NtVnNZWFJwZG1VZ1ZWSkpJR0Z1WkNCcAorZENCdFlYa2dZMjl1ZEdGcGJpQmhJR1p5WVdkdFpXNTBDbWxrWlc1MGFXWnBaWEl1SUVsdUlIQmhjblJwWTNWcworWVhJZ2RHaGxJRlZTU1NCeVpXWmxjbVZ1WTJVZ2JXRjVJR052Ym5SaGFXNGdiMjVzZVNCaENtWnlZV2R0Wlc1MAorSUdsa1pXNTBhV1pwWlhJdUlDQlRkV05vSUdFZ1ZWSkpJSEpsWm1WeVpXNWpaU0JwY3lCaElISmxabVZ5Wlc1agorWlNCMGJ5QmhJSEJoY25RZ2IyWUtkR2hsSUdSdlkzVnRaVzUwSUdOdmJuUmhhVzVwYm1jZ2RHaGxJRHhqYjJSbAorUG5odGJDMXpkSGxzWlhOb1pXVjBQQzlqYjJSbFBpQndjbTlqWlhOemFXNW5DbWx1YzNSeWRXTjBhVzl1SUNoegorWldVZ1BHRWdhSEpsWmowaUkxSkdRekl6T1RZaVBsdFNSa015TXprMlhUd3ZZVDRwTGlCVWFHVWdZMjl1YzJWeAorZFdWdVkyVWdhWE1nZEdoaGRDQjBhR1VLUEdOdlpHVStlRzFzTFhOMGVXeGxjMmhsWlhROEwyTnZaR1UrSUhCeQorYjJObGMzTnBibWNnYVc1emRISjFZM1JwYjI0Z1lXeHNiM2R6SUhOMGVXeGxJSE5vWldWMGN3cDBieUJpWlNCbAorYldKbFpHUmxaQ0JwYmlCMGFHVWdjMkZ0WlNCa2IyTjFiV1Z1ZENCaGN5QjBhR1VnUEdOdlpHVStlRzFzTFhOMAorZVd4bGMyaGxaWFE4TDJOdlpHVStDbkJ5YjJObGMzTnBibWNnYVc1emRISjFZM1JwYjI0dVBDOWliRzlqYTNGMQorYjNSbFBnb0tQSEErU1c0Z2MyOXRaU0JqWVhObGN5d2djM1I1YkdVZ2MyaGxaWFJ6SUcxaGVTQmlaU0JzYVc1cgorWldRZ2QybDBhQ0JoYmlCWVRVd2daRzlqZFcxbGJuUWdZbmtLYldWaGJuTWdaWGgwWlhKdVlXd2dkRzhnZEdobAorSUdSdlkzVnRaVzUwTGlCR2IzSWdaWGhoYlhCc1pTd2daV0Z5YkdsbGNpQjJaWEp6YVc5dWN5QnZaaUJJVkZSUQorQ2p4aElHaHlaV1k5SWlOU1JrTXlNRFk0SWo1YlVrWkRNakEyT0YwOEwyRStJQ2h6WldOMGFXOXVJREU1TGpZdQorTWk0MEtTQmhiR3h2ZDJWa0lITjBlV3hsSUhOb1pXVjBjeUIwYnlCaVpRcGhjM052WTJsaGRHVmtJSGRwZEdnZworV0UxTUlHUnZZM1Z0Wlc1MGN5QmllU0J0WldGdWN5QnZaaUIwYUdVZ1BHTnZaR1UrVEdsdWF6d3ZZMjlrWlQ0SworYUdWaFpHVnlMaUFnUVc1NUlHeHBibXR6SUhSdklITjBlV3hsSUhOb1pXVjBjeUIwYUdGMElHRnlaU0J6Y0dWagorYVdacFpXUWdaWGgwWlhKdVlXeHNlU0IwYnlCMGFHVUtaRzlqZFcxbGJuUWdZWEpsSUdOdmJuTnBaR1Z5WldRZworZEc4Z2IyTmpkWElnWW1WbWIzSmxJSFJvWlNCc2FXNXJjeUJ6Y0dWamFXWnBaV1FnWW5rZ2RHaGxDanhqYjJSbAorUG5odGJDMXpkSGxzWlhOb1pXVjBQQzlqYjJSbFBpQndjbTlqWlhOemFXNW5JR2x1YzNSeWRXTjBhVzl1Y3k0ZworSUZSb2FYTWdhWE1nZEdobElITmhiV1VLWVhNZ2FXNGdTRlJOVENBMExqQWdLSE5sWlNBOFlTQm9jbVZtUFNKbworZEhSd09pOHZkM2QzTG5jekxtOXlaeTlVVWk5U1JVTXRhSFJ0YkRRd0wzQnlaWE5sYm5RdmMzUjViR1Z6TG1oMAorYld3amFDMHhOQzQySWo1elpXTjBhVzl1Q2pFMExqWThMMkUrS1M0OEwzQStDZ284Y0Q1SVpYSmxJR0Z5WlNCegorYjIxbElHVjRZVzF3YkdWeklHWnliMjBnU0ZSTlRDQTBMakFnZDJsMGFDQjBhR1VnWTI5eWNtVnpjRzl1WkdsdQorWndwd2NtOWpaWE56YVc1bklHbHVjM1J5ZFdOMGFXOXVPand2Y0Q0S0NqeHdjbVUrSm14ME8weEpUa3NnYUhKbAorWmowaWJYbHpkSGxzWlM1amMzTWlJSEpsYkQwaWMzUjViR1VnYzJobFpYUWlJSFI1Y0dVOUluUmxlSFF2WTNOegorSWlabmREc0tKbXgwT3o5NGJXd3RjM1I1YkdWemFHVmxkQ0JvY21WbVBTSnRlWE4wZVd4bExtTnpjeUlnZEhsdworWlQwaWRHVjRkQzlqYzNNaVB5Wm5kRHNLQ2lac2REdE1TVTVMSUdoeVpXWTlJbTE1YzNSNWJHVXVZM056SWlCMAorYVhSc1pUMGlRMjl0Y0dGamRDSWdjbVZzUFNKemRIbHNaWE5vWldWMElncDBlWEJsUFNKMFpYaDBMMk56Y3lJbQorWjNRN0NpWnNkRHMvZUcxc0xYTjBlV3hsYzJobFpYUWdhSEpsWmowaWJYbHpkSGxzWlM1amMzTWlJSFJwZEd4bAorUFNKRGIyMXdZV04wSWlCMGVYQmxQU0owWlhoMEwyTnpjeUkvSm1kME93b0tKbXgwTzB4SlRrc2dhSEpsWmowaQorYlhsemRIbHNaUzVqYzNNaUlIUnBkR3hsUFNKTlpXUnBkVzBpSUhKbGJEMGlZV3gwWlhKdVlYUmxJSE4wZVd4bAorYzJobFpYUWlDblI1Y0dVOUluUmxlSFF2WTNOeklpWm5kRHNLSm14ME96OTRiV3d0YzNSNWJHVnphR1ZsZENCaAorYkhSbGNtNWhkR1U5SW5sbGN5SWdhSEpsWmowaWJYbHpkSGxzWlM1amMzTWlJSFJwZEd4bFBTSk5aV1JwZFcwaQorQ25SNWNHVTlJblJsZUhRdlkzTnpJajhtWjNRN1BDOXdjbVUrQ2dvOGNENU5kV3gwYVhCc1pTQThZMjlrWlQ1NAorYld3dGMzUjViR1Z6YUdWbGREd3ZZMjlrWlQ0Z2NISnZZMlZ6YzJsdVp5QnBibk4wY25WamRHbHZibk1nWVhKbAorQ21Gc2MyOGdZV3hzYjNkbFpDQjNhWFJvSUdWNFlXTjBiSGtnZEdobElITmhiV1VnYzJWdFlXNTBhV056SUdGegorSUhkcGRHZ2dQR052WkdVK1RFbE9Td3BTUlV3OUluTjBlV3hsYzJobFpYUWlQQzlqYjJSbFBpNGdSbTl5SUdWNAorWVcxd2JHVXNQQzl3UGdvS1BIQnlaVDRtYkhRN1RFbE9TeUJ5Wld3OUltRnNkR1Z5Ym1GMFpTQnpkSGxzWlhObworWldWMElpQjBhWFJzWlQwaVkyOXRjR0ZqZENJZ2FISmxaajBpYzIxaGJHd3RZbUZ6WlM1amMzTWlDblI1Y0dVOQorSW5SbGVIUXZZM056SWlabmREc0tKbXgwTzB4SlRrc2djbVZzUFNKaGJIUmxjbTVoZEdVZ2MzUjViR1Z6YUdWbAorZENJZ2RHbDBiR1U5SW1OdmJYQmhZM1FpSUdoeVpXWTlJbk50WVd4c0xXVjRkSEpoY3k1amMzTWlDblI1Y0dVOQorSW5SbGVIUXZZM056SWlabmREc0tKbXgwTzB4SlRrc2djbVZzUFNKaGJIUmxjbTVoZEdVZ2MzUjViR1Z6YUdWbAorZENJZ2RHbDBiR1U5SW1KcFp5QndjbWx1ZENJZ2FISmxaajBpWW1sbmNISnBiblF1WTNOeklncDBlWEJsUFNKMAorWlhoMEwyTnpjeUltWjNRN0NpWnNkRHRNU1U1TElISmxiRDBpYzNSNWJHVnphR1ZsZENJZ2FISmxaajBpWTI5dAorYlc5dUxtTnpjeUlnZEhsd1pUMGlkR1Y0ZEM5amMzTWlKbWQwT3p3dmNISmxQZ29LUEhBK2QyOTFiR1FnWW1VZworWlhGMWFYWmhiR1Z1ZENCMGJ6bzhMM0ErQ2dvOGNISmxQaVpzZERzL2VHMXNMWE4wZVd4bGMyaGxaWFFnWVd4MAorWlhKdVlYUmxQU0o1WlhNaUlIUnBkR3hsUFNKamIyMXdZV04wSWlCb2NtVm1QU0p6YldGc2JDMWlZWE5sTG1OegorY3lJS2RIbHdaVDBpZEdWNGRDOWpjM01pUHlabmREc0tKbXgwT3o5NGJXd3RjM1I1YkdWemFHVmxkQ0JoYkhSbAorY201aGRHVTlJbmxsY3lJZ2RHbDBiR1U5SW1OdmJYQmhZM1FpSUdoeVpXWTlJbk50WVd4c0xXVjRkSEpoY3k1agorYzNNaUNuUjVjR1U5SW5SbGVIUXZZM056SWo4bVozUTdDaVpzZERzL2VHMXNMWE4wZVd4bGMyaGxaWFFnWVd4MAorWlhKdVlYUmxQU0o1WlhNaUlIUnBkR3hsUFNKaWFXY2djSEpwYm5RaUlHaHlaV1k5SW1KcFozQnlhVzUwTG1OegorY3lJS2RIbHdaVDBpZEdWNGRDOWpjM01pUHlabmREc0tKbXgwT3o5NGJXd3RjM1I1YkdWemFHVmxkQ0JvY21WbQorUFNKamIyMXRiMjR1WTNOeklpQjBlWEJsUFNKMFpYaDBMMk56Y3lJL0ptZDBPend2Y0hKbFBnb0tDZ284YUhJZworZEdsMGJHVTlJbE5sY0dGeVlYUnZjaUJtY205dElHWnZiM1JsY2lJK0NnbzhhREkrQ2p4aElHNWhiV1U5SWxKbAorWm1WeVpXNWpaWE1pUGp3dllUNUJJRkpsWm1WeVpXNWpaWE04TDJneVBnb0tQR1JzUGdvS1BHUjBQZ284WVNCdQorWVcxbFBTSklWRTFNSWo1SVZFMU1OREE4TDJFK0Nqd3ZaSFErQ2p4a1pENVhiM0pzWkNCWGFXUmxJRmRsWWdwRAorYjI1emIzSjBhWFZ0TGlBOGFUNUlWRTFNSURRdU1DQlRjR1ZqYVdacFkyRjBhVzl1TGp3dmFUNGdWek5ESUZKbAorWTI5dGJXVnVaR0YwYVc5dUxpQlRaV1VLUEdFZ2FISmxaajBpYUhSMGNEb3ZMM2QzZHk1M015NXZjbWN2VkZJdgorVWtWRExXaDBiV3cwTUNJK2FIUjBjRG92TDNkM2R5NTNNeTV2Y21jdlZGSXZVa1ZETFdoMGJXdzBNRHd2WVQ0SworUEM5a1pENEtDanhrZEQ0S1BHRWdibUZ0WlQwaVVrWkRNakEyT0NJK1VrWkRNakEyT0R3dllUNEtQQzlrZEQ0SworUEdSa1BsSXVJRVpwWld4a2FXNW5MQ0JLTGlCSFpYUjBlWE1zSUVvdUlFMXZaM1ZzTEFwSUxpQkdjbmx6ZEhscgorSUU1cFpXeHpaVzRzSUdGdVpDQlVMaUJDWlhKdVpYSnpMVXhsWlM0Z0lEeHBQa2g1Y0dWeWRHVjRkQ0JVY21GdQorYzJabGNncFFjbTkwYjJOdmJDQXRMU0JJVkZSUUx6RXVNUzQ4TDJrK0xpQkpSVlJHSUZKR1F5QXlNRFk0TGlCVAorWldVZ1BHRWdhSEpsWmowaWFIUjBjRG92TDNkM2R5NXBaWFJtTG05eVp5OXlabU12Y21aak1qQTJPQzUwZUhRaQorUG1oMGRIQTZMeTkzZDNjdWFXVjBaaTV2Y21jdmNtWmpMM0ptWXpJd05qZ3VkSGgwUEM5aFBpNDhMMlJrUGdvSworUEdSMFBnbzhZU0J1WVcxbFBTSlNSa015TXprMklqNVNSa015TXprMlBDOWhQZ284TDJSMFBnbzhaR1ErVkM0ZworUW1WeWJtVnljeTFNWldVc0lGSXVJRVpwWld4a2FXNW5MQ0JoYm1RS1RDNGdUV0Z6YVc1MFpYSXVJQ0E4YVQ1VgorYm1sbWIzSnRJRkpsYzI5MWNtTmxJRWxrWlc1MGFXWnBaWEp6SUNoVlVra3BPaUJIWlc1bGNtbGpDbE41Ym5SaAorZUR3dmFUNHVJRWxGVkVZZ1VrWkRJREl6T1RZdUlGTmxaU0E4WVNCb2NtVm1QU0pvZEhSd09pOHZkM2QzTG1sbAorZEdZdWIzSm5MM0ptWXk5eVptTXlNemsyTG5SNGRDSSthSFIwY0RvdkwzZDNkeTVwWlhSbUxtOXlaeTl5Wm1NdgorY21aak1qTTVOaTUwZUhROEwyRStMand2WkdRK0NnbzhaSFErQ2p4aElHNWhiV1U5SWxoTlRDSStXRTFNTVRBOAorTDJFK0Nqd3ZaSFErQ2p4a1pENVhiM0pzWkNCWGFXUmxJRmRsWWlCRGIyNXpiM0owYVhWdExpQThhVDVGZUhSbAorYm5OcFlteGxDazFoY210MWNDQk1ZVzVuZFdGblpTQW9XRTFNS1NBeExqQXVQQzlwUGlCWE0wTWdVbVZqYjIxdAorWlc1a1lYUnBiMjR1SUZObFpTQThZU0JvY21WbVBTSm9kSFJ3T2k4dmQzZDNMbmN6TG05eVp5OVVVaTh4T1RrNAorTDFKRlF5MTRiV3d0TVRrNU9EQXlNVEFpUG1oMGRIQTZMeTkzZDNjdWR6TXViM0puTDFSU0x6RTVPVGd2VWtWRAorTFhodGJDMHhPVGs0TURJeE1Ed3ZZVDRLUEM5a1pENEtDand2Wkd3K0Nnb0tDZ284YURJK0NqeGhJRzVoYldVOQorSW5KaGRHbHZibUZzWlNJK1BDOWhQa0lnVW1GMGFXOXVZV3hsUEM5b01qNEtDanh3UGxSb1pYSmxJSGRoY3lCaAorYmlCMWNtZGxiblFnY21WeGRXbHlaVzFsYm5RZ1ptOXlJR0VnYzNCbFkybG1hV05oZEdsdmJpQm1iM0lnYzNSNQorYkdVZ2MyaGxaWFFLYkdsdWEybHVaeUIwYUdGMElHTnZkV3hrSUdKbElHTnZiWEJzWlhSbFpDQnBiaUIwYVcxbAorSUdadmNpQjBhR1VnYm1WNGRDQnlaV3hsWVhObElHWnliMjBLYldGcWIzSWdZbkp2ZDNObGNpQjJaVzVrYjNKegorTGlBZ1QyNXNlU0JpZVNCamFHOXZjMmx1WnlCaElITnBiWEJzWlNCdFpXTm9ZVzVwYzIwZ1kyeHZjMlZzZVFwaQorWVhObFpDQnZiaUJoSUhCeWIzWmxiaUJsZUdsemRHbHVaeUJ0WldOb1lXNXBjMjBnWTI5MWJHUWdkR2hsSUhOdworWldOcFptbGpZWFJwYjI0Z1ltVUtZMjl0Y0d4bGRHVmtJR2x1SUhScGJXVWdkRzhnYldWbGRDQjBhR2x6SUhKbAorY1hWcGNtVnRaVzUwTGp3dmNENEtDanh3UGxWelpTQnZaaUJoSUhCeWIyTmxjM05wYm1jZ2FXNXpkSEoxWTNScAorYjI0Z1lYWnZhV1J6SUhCdmJHeDFkR2x1WnlCMGFHVWdiV0ZwYmlCa2IyTjFiV1Z1ZEFwemRISjFZM1IxY21VZworZDJsMGFDQmhjSEJzYVdOaGRHbHZiaUJ6Y0dWamFXWnBZeUJ3Y205alpYTnphVzVuSUdsdVptOXliV0YwYVc5dQorTGp3dmNENEtDanh3UGxSb1pTQnRaV05vWVc1cGMyMGdZMmh2YzJWdUlHWnZjaUIwYUdseklIWmxjbk5wYjI0ZworYjJZZ2RHaGxJSE53WldOcFptbGpZWFJwYjI0Z2FYTWdibTkwSUdFS1kyOXVjM1J5WVdsdWRDQnZiaUIwYUdVZworWVdSa2FYUnBiMjVoYkNCdFpXTm9ZVzVwYzIxeklIQnNZVzV1WldRZ1ptOXlJR1oxZEhWeVpTQjJaWEp6YVc5dQorY3k0S1ZHaGxjbVVnYVhNZ2JtOGdaWGh3WldOMFlYUnBiMjRnZEdoaGRDQjBhR1Z6WlNCM2FXeHNJSFZ6WlNCdworY205alpYTnphVzVuSUdsdWMzUnlkV04wYVc5dWN6c0thVzVrWldWa0lIUm9aWGtnYldGNUlHNXZkQ0JwYm1OcworZFdSbElIUm9aU0JzYVc1cmFXNW5JR2x1Wm05eWJXRjBhVzl1SUdsdUlIUm9aU0J6YjNWeVkyVUtaRzlqZFcxbAorYm5RdVBDOXdQZ29LQ2dvS1BDOWliMlI1UGdvOEwyaDBiV3crQ2c9PQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL2tleXN0b3JlLmprcyBiL3NhbXBsZXMvZGF0YS9rZXlzdG9yZS5qa3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFhMDIxNAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9rZXlzdG9yZS5qa3MKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAvZXh0ZW5zaW9uLnhzbCBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2V4dGVuc2lvbi54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxNmUwNgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2V4dGVuc2lvbi54c2wKQEAgLTAsMCArMSwxMyBAQAorPHhzbDpzdHlsZXNoZWV0IHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIg0KKwl4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSINCisJeG1sbnM6cGU9InhhbGFuOi8vb3JnLnhtbHNlY3VyaXR5LnRlbXAuVGVzdFByb3BlcnRpZXMiDQorCWV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPSJwZSINCisJdmVyc2lvbj0iMS4wIj4NCisNCisJPHhzbDpvdXRwdXQgaW5kZW50PSJ5ZXMiIG9taXQteG1sLWRlY2xhcmF0aW9uPSJ5ZXMiLz4NCisJPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLyI+DQorCQk8cGU6cHJvcGVydGllcz4NCisJCSAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQorCQk8L3BlOnByb3BlcnRpZXM+DQorCTwveHNsOnRlbXBsYXRlPg0KKzwveHNsOnN0eWxlc2hlZXQ+DQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAvaWQueG1sIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAvaWQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NGEyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9pZC54bWwKQEAgLTAsMCArMSwxMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+DQorDQorPCFET0NUWVBFIGRvYyBbDQorPCFBVFRMSVNUIGU5IElkIElEICNJTVBMSUVEPg0KK10+DQorDQorDQorPGRvYz4NCisgICA8ZTkgSWQ9Ik5PMyI+PC9lOT4NCisgICA8ZTkgSWQ9ImlkMiI+PC9lOT4NCis8L2RvYz4gDQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAvaWQyLnhtbCBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2lkMi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3ZDRiMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2lkMi54bWwKQEAgLTAsMCArMSw5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4NCis8IURPQ1RZUEUgZG9jIFsNCis8IUFUVExJU1QgZTkgSWQgSUQgI0lNUExJRUQ+DQorXT4NCis8ZG9jPg0KKyAgIDwhLS0gQSBjb21tZW50IC0tPg0KKyAgIDxlOSBJZD0nTjMnPjwhLS0gQSBjb21tZW50IC0tPkRhcyBOMyBFbGVtZW50PC9lOT4NCisgICA8ZTkgSWQ9J2lkMic+PCEtLSBBIGNvbW1lbnQgLS0+IERhcyBpZDIgRWxlbWVudDwvZTk+DQorPC9kb2M+IA0KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2tleS9kc2F2YWx1ZS54bWwgYi9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9rZXkvZHNhdmFsdWUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYTg4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9rZXkvZHNhdmFsdWUueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8RFNBS2V5VmFsdWUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICA8UD4KKyAgICByRnRvOHVQUU02eTM0RkxQbURoNDBCTEoxclZyQzhWZVJxdXVoUFo2allORmtRdXd4bnUvd0N2SUFNaHVrUEJMCisgICAgRkVUOGJKZi9iMmVmK29xeFphakViKzg4emxab3lHOGcvd01mREJIVHh6K0Nub3dMYWhuQ0NUWUJwNWt0N0c4cQorICAgIFVvYkp1dmp5bHdqMXN0N1Y5THN1MDNpWE1YdGJpcmlVakZhNWdVUmFzTjg9CisgIDwvUD4KKyAgPFE+CisgICAga0VqQUZwQ2U0bGNVT2R3cGhwemYrdEJhVWRzPQorICA8L1E+CisgIDxHPgorICAgIG9lMTRSMk90eUt4K3MrNjBPNUJSTk1PWXBJZzJUVS9mMTVOM2JzREVyS09XdEtYZU5LOUZTN2RXU3RyZUR4bzIKKyAgICBTU2dPb25xQWQ0RnVKLzR1dmE3R2dOTDRVTElxWTdFK21XNWl3SjduL1dURUxoOThtRW9jc0xYa05oMjRIY0g0CisgICAgQlpmU0NUcnV1em1DeWpkVjFLU3FYL0V1eDA0SGZDV1ltZHhOM1NRL3Fxdz0KKyAgPC9HPgorICA8WT4KKyAgICBwQTVOblp2Y2Q1NzRXUlh1T0E3WmZDLzdMcXQ0Y0IwTVJMV3RIdWJ0Sm9WT2FvOWliNXJ5NHJUazByNmRkbk92CisgICAgQUlHS2t0dXR6SzN5bXZLbGVTM0RPcndaUWdKKy9CRFdEVzhrTzlSNjZvNnJkamlTb2JCaS8wYzJWMStka3FPZworICAgIGpGbUt6Mzk1bXZDT1pHaEM3ZnFBVmhIYXQyRWpHUE1mZ1NaeUFCYTcrMWs9CisgIDwvWT4KKzwvRFNBS2V5VmFsdWU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9rZXkvcmV0cmlldmFsLWZyb20tc2FtZS1kb2Mta2V5LnhtbCBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2tleS9yZXRyaWV2YWwtZnJvbS1zYW1lLWRvYy1rZXkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NWU3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9rZXkvcmV0cmlldmFsLWZyb20tc2FtZS1kb2Mta2V5LnhtbApAQCAtMCwwICsxIEBACis8WDUwOURhdGEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxYNTA5Q2VydGlmaWNhdGU+PC9YNTA5Q2VydGlmaWNhdGU+PC9YNTA5RGF0YT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9rZXkvcmV0cmlldmFsLWZyb20tc2FtZS1kb2MueG1sIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAva2V5L3JldHJpZXZhbC1mcm9tLXNhbWUtZG9jLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTM5ZWNlCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAva2V5L3JldHJpZXZhbC1mcm9tLXNhbWUtZG9jLnhtbApAQCAtMCwwICsxLDYwIEBACis8RG9jdW1lbnQ+DQorICA8S2V5TWF0ZXJpYWxzIElkPSJ0aGVjZXJ0IiB4bWxucz0iaHR0cDovL3d3dy54bWxzZWN1cml0eS5vcmcvdGVtcC9teXRlbXBucyI+DQorICAgIDxYNTA5RGF0YSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQorICAgICAgICA8WDUwOUNlcnRpZmljYXRlPg0KKyAgICAgICAgICAgIE1JSUN3ekNDQWl5Z0F3SUJBZ0lHQU9aNzVRaEhNQTBHQ1NxR1NJYjNEUUVCQlFVQU1HNHhDekFKQmdOVkJBWVQNCisgICAgICAgICAgICBBa2xGTVE4d0RRWURWUVFJRXdaRWRXSnNhVzR4SlRBakJnTlZCQW9USEVKaGJIUnBiVzl5WlNCVVpXTm9ibTlzDQorICAgICAgICAgICAgYjJkcFpYTXNJRXgwWkM0eEVUQVBCZ05WQkFzVENGZ3ZVMlZqZFhKbE1SUXdFZ1lEVlFRREV3dFlMMU5sWTNWeQ0KKyAgICAgICAgICAgIFpTQkRRVEFlRncwd01UQTFNVFV4TURBME5EVmFGdzB3TWpBMU1UVXhNREEwTXpkYU1Ha3hDekFKQmdOVkJBWVQNCisgICAgICAgICAgICBBa2xGTVE4d0RRWURWUVFJRXdaRWRXSnNhVzR4SlRBakJnTlZCQW9USEVKaGJIUnBiVzl5WlNCVVpXTm9ibTlzDQorICAgICAgICAgICAgYjJkcFpYTXNJRXgwWkM0eEVUQVBCZ05WQkFzVENGZ3ZVMlZqZFhKbE1ROHdEUVlEVlFRREV3Wk5iM0pwWjNVdw0KKyAgICAgICAgICAgIGdaOHdEUVlKS29aSWh2Y05BUUVCQlFBRGdZMEFNSUdKQW9HQkFMVDRGSmt4dStiQjVsT3dZYStpckliN3NKVTcNCisgICAgICAgICAgICA5c1JRYllZbmZ3MzVEN05Ra2lnK0x2aTJMWFhvQTZBQnVsbDJiRitndStzZ1J6ZXp6T3M2VnNUTDh6NTdUSXoyDQorICAgICAgICAgICAgNDhIYU1JbkZqT2lxU0FObXpRS2xYdjFQalhTeFN5SFJpLzN4YzhnTWZtQ3hlU1BDWjVWcFVpUW9KNVpwV2NEeg0KKyAgICAgICAgICAgIC9MS3ZiMGw5WDBZQnpNWmxBZ01CQUFHamNUQnZNQTRHQTFVZER3RUIvd1FFQXdJSGdEQVJCZ05WSFE0RUNnUUkNCisgICAgICAgICAgICBoYmlzMzVsSWN1OHdOUVlEVlIwU0JDNHdMSVlxYUhSMGNEb3ZMM2QzZHk1aVlXeDBhVzF2Y21VdVkyOXRMM0J5DQorICAgICAgICAgICAgYjJSMVkzUnpMM2h6WldOMWNtVXZNQk1HQTFVZEl3UU1NQXFBQ0lYc0h3cVBmeHJSTUEwR0NTcUdTSWIzRFFFQg0KKyAgICAgICAgICAgIEJRVUFBNEdCQUdTQmRQb3U1Q1dBaXlTNS9mNDZtMDBtSUlxTzN4bDZaWE9jL0RSYmxGNGdXbmVzZDJGNXYvczYNCisgICAgICAgICAgICBsQWJxSzgrd0pNNkd4dnBPa1NwNk8xcTZoWlJ5ekY4NlFQbFhDZmhLQVhrZ3pIWHRiNlBmVDJtOXQwaWF3bmp5DQorICAgICAgICAgICAgUCtveVlvZm5GVTVGRlZPQ3VqU3JtRngzRkNVK1dnNlJUM3YxalJvTTNZZk1ZWllFemZUVA0KKyAgICAgICAgPC9YNTA5Q2VydGlmaWNhdGU+DQorICAgIDwvWDUwOURhdGE+DQorICA8L0tleU1hdGVyaWFscz4NCisgIDxLZXlNYXRlcmlhbHMgSWQ9ImhqZHNiYWRjcmV0IiB4bWxucz0iaHR0cDovL3d3dy54bWxzZWN1cml0eS5vcmcvdGVtcC9teXRlbXBucyI+DQorICAgIDxYNTA5RGF0YSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+DQorICAgICAgICA8WDUwOUNlcnRpZmljYXRlPg0KKyAgICAgICAgICAgIFRoaXMgaXMgbm8gdmFsaWQgYmFzZTY0IGVuY29kZWQgWDUwOSBDZXJ0aWZpY2F0ZSBzbyBpZiB0aGUgWFBhdGgNCisgICAgICAgICAgICAgICBhbmNlc3Rvcjo6bXk6S2V5TWF0ZXJpYWxzW0BJZD0iaGpkc2JhZGNyZXQiXQ0KKyAgICAgICAgICAgIHdvdWxkIGhhdmUgYmVlbiB1c2VkIHRoaXMgd291bGRuJ3QgcmVzb2x2ZSB0byBhIHZhbGlkIGtleQ0KKyAgICAgICAgPC9YNTA5Q2VydGlmaWNhdGU+DQorICAgIDwvWDUwOURhdGE+DQorICA8L0tleU1hdGVyaWFscz4NCisgIDxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KKyAgICA8U2lnbmVkSW5mbz4NCisgICAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1IiAvPg0KKyAgICAgIDxTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjcnNhLXNoYTEiIC8+DQorICAgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4NCisgICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz4NCisgICAgICAgIDxEaWdlc3RWYWx1ZT42ME52WnZ0ZFRCKzdVbmxMcC9IMjRwN2g0YnM9PC9EaWdlc3RWYWx1ZT4NCisgICAgICA8L1JlZmVyZW5jZT4NCisgICAgPC9TaWduZWRJbmZvPg0KKyAgICA8U2lnbmF0dXJlVmFsdWU+DQorICAgICAgRm53c1NDV1Q2UkVXLzhRbk9qdjBCSytyM0x5LzRhQisrcE5uWnA5cG56OGY3K2ozM2VLU2oxc295UUxxNXptTg0KKyAgICAgIEZ3eWVlUWhubFRiUjFrZnZlMDE0dWI5dUhWQzlBMWNmbUdaeFFGMURDK2VuSHQrQUFQSmFhMjc4L29jZ3BNYjUNCisgICAgICBHaWJsNHc3ZTNIQWRCbi9SSkNyRkpINzd3WTJvVTVPYjB6SVF0RUNWTkprPQ0KKyAgICA8L1NpZ25hdHVyZVZhbHVlPg0KKyAgICA8S2V5SW5mbz4NCisgICAgICA8UmV0cmlldmFsTWV0aG9kIFVSST0iIiBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjWDUwOURhdGEiPg0KKyAgICAgICAgPFRyYW5zZm9ybXM+DQorICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNiI+DQorICAgICAgICAgICAgPFhQYXRoIHhtbG5zOm15PSJodHRwOi8vd3d3LnhtbHNlY3VyaXR5Lm9yZy90ZW1wL215dGVtcG5zIiANCisgICAgICAgICAgICAgICAgICAgeG1sbnM6ZHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPg0KKyAgICAgICAgICAgICAgIGFuY2VzdG9yOjpteTpLZXlNYXRlcmlhbHNbQElkPSJ0aGVjZXJ0Il0NCisgICAgICAgICAgICA8L1hQYXRoPg0KKyAgICAgICAgICA8L1RyYW5zZm9ybT4NCisgICAgICAgIDwvVHJhbnNmb3Jtcz4NCisgICAgICA8L1JldHJpZXZhbE1ldGhvZD4NCisgICAgPC9LZXlJbmZvPg0KKyAgPC9TaWduYXR1cmU+DQorPC9Eb2N1bWVudD4NCisgIApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2tleS9zaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLWRzYXZhbHVlLnhtbCBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2tleS9zaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLWRzYXZhbHVlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjQ1NzVjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAva2V5L3NpZ25hdHVyZS1yZXRyaWV2YWxtZXRob2QtZHNhdmFsdWUueG1sCkBAIC0wLDAgKzEsMTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgPFNpZ25lZEluZm8+CisgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIgLz4KKyAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIiAvPgorICAgIDxSZWZlcmVuY2UgVVJJPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCI+CisgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiIC8+CisgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+CisgICAgPC9SZWZlcmVuY2U+CisgIDwvU2lnbmVkSW5mbz4KKyAgPFNpZ25hdHVyZVZhbHVlPgorICAgIEZqOU93U3hwSnBwRG5paG9oZHV4RVVxdTkvcDZUUjlQcGdOR2FwYWlCSEdjWTJRVURCYU9Fdz09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDxSZXRyaWV2YWxNZXRob2QgVHlwZT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI0RTQUtleVZhbHVlIiBVUkk9ImRzYXZhbHVlLnhtbCIgLz4KKyAgPC9LZXlJbmZvPgorPC9TaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9rZXkvc2lnbmF0dXJlLXJldHJpZXZhbG1ldGhvZC14NTA5ZGF0YS54bWwgYi9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9rZXkvc2lnbmF0dXJlLXJldHJpZXZhbG1ldGhvZC14NTA5ZGF0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwYmQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2tleS9zaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLXg1MDlkYXRhLnhtbApAQCAtMCwwICsxLDQxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgIDxTaWduZWRJbmZvPgorICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiIC8+CisgICAgPFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMSIgLz4KKyAgICA8UmVmZXJlbmNlIFVSST0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPgorICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiAvPgorICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICAgIDwvUmVmZXJlbmNlPgorICA8L1NpZ25lZEluZm8+CisgIDxTaWduYXR1cmVWYWx1ZT4KKyAgICBaclJPeEljT1NCdnQ1ejJrckVoUUdTVklvNG9Bd1RKd0dBb0ZpV3VjdnZFdFk5azBMMlI1UlZIQm5IQ3prNUdUCisgICAga0hHYVQ4U1VxdG5EZWlINlcvMkZOZmNpaVYvdzFweFVSdk5jeVc4Y1lDbjFCNVhGNjh2SUxYVWFwdFdmMERLdworICAgIER2Q0ZTK3VMaDBBQ3VFVWZwZTFEeDFmd0I4NWxwSzJpUWNweDlkUGFDNE09CisgIDwvU2lnbmF0dXJlVmFsdWU+CisgIDxLZXlJbmZvPgorICAgIDwhLS0KKyAgICA8WDUwOURhdGE+CisgICAgICA8WDUwOUNlcnRpZmljYXRlPgorICAgICAgICBNSUlDd3pDQ0FpeWdBd0lCQWdJR0FPWjc1UWhITUEwR0NTcUdTSWIzRFFFQkJRVUFNRzR4Q3pBSkJnTlZCQVlUCisgICAgICAgIEFrbEZNUTh3RFFZRFZRUUlFd1pFZFdKc2FXNHhKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXMKKyAgICAgICAgYjJkcFpYTXNJRXgwWkM0eEVUQVBCZ05WQkFzVENGZ3ZVMlZqZFhKbE1SUXdFZ1lEVlFRREV3dFlMMU5sWTNWeQorICAgICAgICBaU0JEUVRBZUZ3MHdNVEExTVRVeE1EQTBORFZhRncwd01qQTFNVFV4TURBME16ZGFNR2t4Q3pBSkJnTlZCQVlUCisgICAgICAgIEFrbEZNUTh3RFFZRFZRUUlFd1pFZFdKc2FXNHhKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXMKKyAgICAgICAgYjJkcFpYTXNJRXgwWkM0eEVUQVBCZ05WQkFzVENGZ3ZVMlZqZFhKbE1ROHdEUVlEVlFRREV3Wk5iM0pwWjNVdworICAgICAgICBnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTFQ0RkpreHUrYkI1bE93WWEraXJJYjdzSlU3CisgICAgICAgIDlzUlFiWVluZnczNUQ3TlFraWcrTHZpMkxYWG9BNkFCdWxsMmJGK2d1K3NnUnplenpPczZWc1RMOHo1N1RJejIKKyAgICAgICAgNDhIYU1JbkZqT2lxU0FObXpRS2xYdjFQalhTeFN5SFJpLzN4YzhnTWZtQ3hlU1BDWjVWcFVpUW9KNVpwV2NEegorICAgICAgICAvTEt2YjBsOVgwWUJ6TVpsQWdNQkFBR2pjVEJ2TUE0R0ExVWREd0VCL3dRRUF3SUhnREFSQmdOVkhRNEVDZ1FJCisgICAgICAgIGhiaXMzNWxJY3U4d05RWURWUjBTQkM0d0xJWXFhSFIwY0RvdkwzZDNkeTVpWVd4MGFXMXZjbVV1WTI5dEwzQnkKKyAgICAgICAgYjJSMVkzUnpMM2h6WldOMWNtVXZNQk1HQTFVZEl3UU1NQXFBQ0lYc0h3cVBmeHJSTUEwR0NTcUdTSWIzRFFFQgorICAgICAgICBCUVVBQTRHQkFHU0JkUG91NUNXQWl5UzUvZjQ2bTAwbUlJcU8zeGw2WlhPYy9EUmJsRjRnV25lc2QyRjV2L3M2CisgICAgICAgIGxBYnFLOCt3Sk02R3h2cE9rU3A2TzFxNmhaUnl6Rjg2UVBsWENmaEtBWGtnekhYdGI2UGZUMm05dDBpYXduankKKyAgICAgICAgUCtveVlvZm5GVTVGRlZPQ3VqU3JtRngzRkNVK1dnNlJUM3YxalJvTTNZZk1ZWllFemZUVAorICAgICAgPC9YNTA5Q2VydGlmaWNhdGU+CisgICAgPC9YNTA5RGF0YT4KKyAgICAtLT4KKyAgICA8UmV0cmlldmFsTWV0aG9kIFVSST0iLi94NTA5ZGF0YS54bWwiIC8+CisgICAgPCEtLSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjWDUwOURhdGEiICAtLT4KKyAgPC9LZXlJbmZvPgorPC9TaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9rZXkveDUwOWRhdGEueG1sIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAva2V5L3g1MDlkYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTczZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAva2V5L3g1MDlkYXRhLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFg1MDlEYXRhIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAgICA8WDUwOUNlcnRpZmljYXRlPgorICAgICAgICBNSUlDd3pDQ0FpeWdBd0lCQWdJR0FPWjc1UWhITUEwR0NTcUdTSWIzRFFFQkJRVUFNRzR4Q3pBSkJnTlZCQVlUCisgICAgICAgIEFrbEZNUTh3RFFZRFZRUUlFd1pFZFdKc2FXNHhKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXMKKyAgICAgICAgYjJkcFpYTXNJRXgwWkM0eEVUQVBCZ05WQkFzVENGZ3ZVMlZqZFhKbE1SUXdFZ1lEVlFRREV3dFlMMU5sWTNWeQorICAgICAgICBaU0JEUVRBZUZ3MHdNVEExTVRVeE1EQTBORFZhRncwd01qQTFNVFV4TURBME16ZGFNR2t4Q3pBSkJnTlZCQVlUCisgICAgICAgIEFrbEZNUTh3RFFZRFZRUUlFd1pFZFdKc2FXNHhKVEFqQmdOVkJBb1RIRUpoYkhScGJXOXlaU0JVWldOb2JtOXMKKyAgICAgICAgYjJkcFpYTXNJRXgwWkM0eEVUQVBCZ05WQkFzVENGZ3ZVMlZqZFhKbE1ROHdEUVlEVlFRREV3Wk5iM0pwWjNVdworICAgICAgICBnWjh3RFFZSktvWklodmNOQVFFQkJRQURnWTBBTUlHSkFvR0JBTFQ0RkpreHUrYkI1bE93WWEraXJJYjdzSlU3CisgICAgICAgIDlzUlFiWVluZnczNUQ3TlFraWcrTHZpMkxYWG9BNkFCdWxsMmJGK2d1K3NnUnplenpPczZWc1RMOHo1N1RJejIKKyAgICAgICAgNDhIYU1JbkZqT2lxU0FObXpRS2xYdjFQalhTeFN5SFJpLzN4YzhnTWZtQ3hlU1BDWjVWcFVpUW9KNVpwV2NEegorICAgICAgICAvTEt2YjBsOVgwWUJ6TVpsQWdNQkFBR2pjVEJ2TUE0R0ExVWREd0VCL3dRRUF3SUhnREFSQmdOVkhRNEVDZ1FJCisgICAgICAgIGhiaXMzNWxJY3U4d05RWURWUjBTQkM0d0xJWXFhSFIwY0RvdkwzZDNkeTVpWVd4MGFXMXZjbVV1WTI5dEwzQnkKKyAgICAgICAgYjJSMVkzUnpMM2h6WldOMWNtVXZNQk1HQTFVZEl3UU1NQXFBQ0lYc0h3cVBmeHJSTUEwR0NTcUdTSWIzRFFFQgorICAgICAgICBCUVVBQTRHQkFHU0JkUG91NUNXQWl5UzUvZjQ2bTAwbUlJcU8zeGw2WlhPYy9EUmJsRjRnV25lc2QyRjV2L3M2CisgICAgICAgIGxBYnFLOCt3Sk02R3h2cE9rU3A2TzFxNmhaUnl6Rjg2UVBsWENmaEtBWGtnekhYdGI2UGZUMm05dDBpYXduankKKyAgICAgICAgUCtveVlvZm5GVTVGRlZPQ3VqU3JtRngzRkNVK1dnNlJUM3YxalJvTTNZZk1ZWllFemZUVAorICAgIDwvWDUwOUNlcnRpZmljYXRlPgorPC9YNTA5RGF0YT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL251ZWhvbWVwYWdlIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAvbnVlaG9tZXBhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjZTdkZgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL251ZWhvbWVwYWdlCkBAIC0wLDAgKzEsMjkgQEAKKzxIVE1MPg0KKzxIRUFEPg0KKwk8IS0tIFN0eWxlIHNoZWV0IGFkZGVkICgyMS4wOS45OSktLT4NCisJPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iTlVFX1N0eWxlLmNzcyI+DQorPCEtLSBMYXN0IG1vZGlmaWNhdGlvbjogMTAuMTEuOTggYnkgTmlrbyBTY2h3ZWl0emVyIC0tPg0KKwk8TUVUQSBOYW1lPSJkZXNjcmlwdGlvbiIgQ29udGVudD0iSW5zdGl0dXQgZnVlciBOYWNocmljaHRlbnVlYmVybWl0dGx1bmcsIFVOSS1TaWVnZW4iPg0KKyAgIDxNRVRBIE5hbWU9ImtleXdvcmRzIiBDb250ZW50PSJVTkksU2llZ2VuLEluc3RpdHV0LE5hY2hyaWNodGVu/GJlcm1pdHRsdW5nLEluc3RpdHV0ZSxEYXRhLENvbW11bmljYXRpb25zLFNlY3VyaXR5LFNpY2hlcmhlaXQsS3J5cHRvZ3JhcGhpZSxDcnlwdG9ncmFwaHksRGlnaXRhbGUsTW9iaWxmdW5rc3lzdGVtZSxEaWdpdGFsLENvbW11bmljYXRpb24sSW5mb3JtYXRpb24sQVRNLEdTTSxQREgsU0RILFBLSSxBY2Nlc3MsUmlnaHRzLFByb2ZpbGUsQ2VydGlmaWNhdGUsTWFuYWdlbWVudCI+DQorICAgPE1FVEEgTkFNRT0iQ29udGVudC1MYW5ndWFnZSIgQ09OVEVOVD0iZGUiPiANCisNCis8IS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4NCis8dGl0bGU+SG9tZS1QYWdlIGRlcyBJbnN0aXR1dHMgZnVlciBOYWNocmljaHRlbnVlYmVybWl0dGx1bmc8L3RpdGxlPg0KKzwhLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPg0KKw0KKw0KKzxGUkFNRVNFVCBDT0xTPSIxNzAsKiIgQk9SREVSPTAgTUFSR0lOV0lEVEg9MCBNQVJHSU5IRUlHSFQ9MCBGUkFNRUJPUkRFUj0wIEZSQU1FU1BBQ0lORz0wPg0KKwk8RlJBTUUgTkFNRT0iY29udGVudHNfZnJhbWUiIFNSQz0iY29udGVudHMuaHRtbCIgU0NST0xMSU5HPSJBdXRvIiBCT1JERVI9MCBNQVJHSU5XSURUSD0wIE1BUkdJTkhFSUdIVD0wIEZSQU1FQk9SREVSPTAgRlJBTUVTUEFDSU5HPTA+DQorCTxGUkFNRVNFVCA+PCEtLVJPV1M9IjgwLCoiPiAtLT4NCisJCTwhLS0gPGZyYW1lIG5hbWU9ImhlYWRlcl9mcmFtZSIgc3JjPSJoZWFkZXIuaHRtbCIgc2Nyb2xsaW5nPSJObyIgRlJBTUVCT1JERVI9Ik5vIj4gLS0+DQorCQk8ZnJhbWUgbmFtZT0ibWFpbl9mcmFtZSIgc3JjPSJzdGFydC5odG1sIiBzY3JvbGxpbmc9IkF1dG8iIEZSQU1FQk9SREVSPSJObyI+DQorCTwvRlJBTUVTRVQ+DQorPC9GUkFNRVNFVD4NCisNCisNCis8L0hFQUQ+DQorDQorPEJPRFk+IA0KKw0KKzwvQk9EWT4NCis8L0hUTUw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAvc2lnbmF0dXJlL3NpZ25hdHVyZS1iYWQtYzE0bi1hbGdvLnhtbCBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL3NpZ25hdHVyZS9zaWduYXR1cmUtYmFkLWMxNG4tYWxnby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjMjk3YgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL3NpZ25hdHVyZS9zaWduYXR1cmUtYmFkLWMxNG4tYWxnby54bWwKQEAgLTAsMCArMSw1NSBAQAorPGRzOlNpZ25hdHVyZSB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+Cis8ZHM6U2lnbmVkSW5mbz4KKzxkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2JhZC1jMTRuLWFsZ28iPjwvZHM6Q2Fub25pY2FsaXphdGlvbk1ldGhvZD4KKzxkczpTaWduYXR1cmVNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZHNhLXNoYTEiPjwvZHM6U2lnbmF0dXJlTWV0aG9kPgorPGRzOlJlZmVyZW5jZSBVUkk9IiNUaGVGaXJzdE9iamVjdCI+Cis8ZHM6VHJhbnNmb3Jtcz4KKzxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMiPjwvZHM6VHJhbnNmb3JtPgorPC9kczpUcmFuc2Zvcm1zPgorPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIj48L2RzOkRpZ2VzdE1ldGhvZD4KKzxkczpEaWdlc3RWYWx1ZT5pcGJzMFV5YWZrZFJJY2ZJbzl6eVpMY2UrQ0U9PC9kczpEaWdlc3RWYWx1ZT4KKzwvZHM6UmVmZXJlbmNlPgorPC9kczpTaWduZWRJbmZvPgorPGRzOlNpZ25hdHVyZVZhbHVlPlcxQzVaVDJuUXdYZCt6SWVaMU5VRmp4NXFuMEVSeWlMblNlWVNTK0ZERzl5T3BLMUZLOEFWQT09PC9kczpTaWduYXR1cmVWYWx1ZT4KKzxkczpLZXlJbmZvPgorPGRzOlg1MDlEYXRhPgorPGRzOlg1MDlDZXJ0aWZpY2F0ZT4KK01JSUM5akNDQXJRQ0JEcnVxaW93Q3dZSEtvWkl6amdFQXdVQU1HRXhDekFKQmdOVkJBWVRBa1JGTVIwd0d3WURWUVFLRXhSVmJtbDIKK1pYSnphWFI1SUc5bUlGTnBaV2RsYmpFUU1BNEdBMVVFQ3hNSFJrSXhNazVWUlRFaE1COEdBMVVFQXhNWVEyaHlhWE4wYVdGdUlFZGwKK2RXVnlMVkJ2Ykd4dFlXNXVNQjRYRFRBeE1EVXdNVEV5TWpBMU9Gb1hEVEEyTVRBeU1qRXlNakExT0Zvd1lURUxNQWtHQTFVRUJoTUMKK1JFVXhIVEFiQmdOVkJBb1RGRlZ1YVhabGNuTnBkSGtnYjJZZ1UybGxaMlZ1TVJBd0RnWURWUVFMRXdkR1FqRXlUbFZGTVNFd0h3WUQKK1ZRUURFeGhEYUhKcGMzUnBZVzRnUjJWMVpYSXRVRzlzYkcxaGJtNHdnZ0czTUlJQkxBWUhLb1pJempnRUFUQ0NBUjhDZ1lFQS9YOVQKK2dSMTFFaWxTMzBxY0x1ems1L1lSdDFJODcwUUF3eDQvZ0xaUkptbEZYVUFpVWZ0WlBZMVkrci9GOWJvdzlzdWJWV3pYZ1R1QUhUUnYKKzhtWmd0MnVaVUtXa241L29CSHNRSXNKUHU2blgvcmZHRy9nN1YrZkdxS1lWRHdUN2cvYlR4UjdEQWpWVUUxb1drVEwyZGZPdUsySFgKK0t1L3lJZ01abmRGSUFjY0NGUUNYWUZDUEZTTUx6TEtTdVlLaTY0UUw4RmdjOVFLQmdRRDM0YUNGMXBzOTNzdThxMXcydUZlNWVaU3YKK3UvbzY2b0w1VjB3TFBRZUNaMUZaVjQ2NjFGbFA1bkVIRUlHQXRFa1djU1BvVENnV0U3ZlBDVEtNeUtiaFBCWjZpMVI4alNqZ282NGUKK0s3T21kWkZ1bzM4TCtpRTFZdkg3WW5vQkpEdk1wUEcrcUZHUWlhaUQzK0ZhNVo4R2tvdG1Yb0I3VlNWa0FVdzcvczlKS2dPQmhBQUMKK2dZQVNXZm4rRzFrL25XbnRqOWpYN05rNUpLYWlMWjlCTFIxNmVKSnhxZmYzM1RITGZkR3M5OFhtaDJvUldaVmg5UE1WOG9UUDNocFIKK2NSaXBqWlVaVkVJcXNCbE9HVFZMQ2c0SDVUSjgxSldPaXByaCtta2hDbE5xVXI4bDVIdTdGQlN2UUI2aW5yeWV2YTdqMGFLTmlJdksKKzh2ZkhUaVVacG55TlJoa3ZlQmxNMGpBTEJnY3Foa2pPT0FRREJRQURMd0F3TEFJVVBEZC9VbUI5R2VIcXZHam55MzBCdmp0MEFrVUMKK0ZBOWFiNzJrS3VCNWdlWUdlY2tiQnJjZ1BuWmsKKzwvZHM6WDUwOUNlcnRpZmljYXRlPgorPC9kczpYNTA5RGF0YT4KKzxkczpLZXlWYWx1ZT4KKzxkczpEU0FLZXlWYWx1ZT4KKzxkczpQPgorL1g5VGdSMTFFaWxTMzBxY0x1ems1L1lSdDFJODcwUUF3eDQvZ0xaUkptbEZYVUFpVWZ0WlBZMVkrci9GOWJvdzlzdWJWV3pYZ1R1QQorSFRSdjhtWmd0MnVaVUtXa241L29CSHNRSXNKUHU2blgvcmZHRy9nN1YrZkdxS1lWRHdUN2cvYlR4UjdEQWpWVUUxb1drVEwyZGZPdQorSzJIWEt1L3lJZ01abmRGSUFjYz0KKzwvZHM6UD4KKzxkczpRPmwyQlFqeFVqQzh5eWtybUNvdXVFQy9CWUhQVT08L2RzOlE+Cis8ZHM6Rz4KKzkrR2doZGFiUGQ3THZLdGNOcmhYdVhtVXI3djZPdXFDK1ZkTUN6MEhnbWRSV1ZlT3V0UlpUK1p4QnhDQmdMUkpGbkVqNkV3b0ZoTzMKK3p3a3lqTWltNFR3V2VvdFVmSTBvNEtPdUhpdXpwbldSYnFOL0Mvb2hOV0x4KzJKNkFTUTd6S1R4dnFoUmtJbW9nOS9oV3VXZkJwS0wKK1psNkFlMVVsWkFGTU8vN1BTU289Cis8L2RzOkc+Cis8ZHM6WT4KK0VsbjUvaHRaUDUxcDdZL1kxK3paT1NTbW9pMmZRUzBkZW5pU2NhbjM5OTB4eTMzUnJQZkY1b2RxRVZtVllmVHpGZktFejk0YVVYRVkKK3FZMlZHVlJDS3JBWlRoazFTd29PQitVeWZOU1Zqb3FhNGZwcElRcFRhbEsvSmVSN3V4UVVyMEFlb3A2OG5yMnU0OUdpallpTHl2TDMKK3gwNGxHYVo4alVZWkwzZ1pUTkk9Cis8L2RzOlk+Cis8L2RzOkRTQUtleVZhbHVlPgorPC9kczpLZXlWYWx1ZT4KKzwvZHM6S2V5SW5mbz4KKzxkczpPYmplY3QgSWQ9IlRoZUZpcnN0T2JqZWN0Ij48SW5zaWRlT2JqZWN0PkEgdGV4dCBpbiBhIGJveDwvSW5zaWRlT2JqZWN0PjwvZHM6T2JqZWN0PgorPC9kczpTaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9zaWduYXR1cmUvc2lnbmF0dXJlLWJhZC1zaWctYWxnby54bWwgYi9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9zaWduYXR1cmUvc2lnbmF0dXJlLWJhZC1zaWctYWxnby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhYmU1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL3NpZ25hdHVyZS9zaWduYXR1cmUtYmFkLXNpZy1hbGdvLnhtbApAQCAtMCwwICsxLDU1IEBACis8ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKzxkczpTaWduZWRJbmZvPgorPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSI+PC9kczpDYW5vbmljYWxpemF0aW9uTWV0aG9kPgorPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9iYWQtc2lnLWFsZ28iPjwvZHM6U2lnbmF0dXJlTWV0aG9kPgorPGRzOlJlZmVyZW5jZSBVUkk9IiNUaGVGaXJzdE9iamVjdCI+Cis8ZHM6VHJhbnNmb3Jtcz4KKzxkczpUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMiPjwvZHM6VHJhbnNmb3JtPgorPC9kczpUcmFuc2Zvcm1zPgorPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIj48L2RzOkRpZ2VzdE1ldGhvZD4KKzxkczpEaWdlc3RWYWx1ZT5pcGJzMFV5YWZrZFJJY2ZJbzl6eVpMY2UrQ0U9PC9kczpEaWdlc3RWYWx1ZT4KKzwvZHM6UmVmZXJlbmNlPgorPC9kczpTaWduZWRJbmZvPgorPGRzOlNpZ25hdHVyZVZhbHVlPlcxQzVaVDJuUXdYZCt6SWVaMU5VRmp4NXFuMEVSeWlMblNlWVNTK0ZERzl5T3BLMUZLOEFWQT09PC9kczpTaWduYXR1cmVWYWx1ZT4KKzxkczpLZXlJbmZvPgorPGRzOlg1MDlEYXRhPgorPGRzOlg1MDlDZXJ0aWZpY2F0ZT4KK01JSUM5akNDQXJRQ0JEcnVxaW93Q3dZSEtvWkl6amdFQXdVQU1HRXhDekFKQmdOVkJBWVRBa1JGTVIwd0d3WURWUVFLRXhSVmJtbDIKK1pYSnphWFI1SUc5bUlGTnBaV2RsYmpFUU1BNEdBMVVFQ3hNSFJrSXhNazVWUlRFaE1COEdBMVVFQXhNWVEyaHlhWE4wYVdGdUlFZGwKK2RXVnlMVkJ2Ykd4dFlXNXVNQjRYRFRBeE1EVXdNVEV5TWpBMU9Gb1hEVEEyTVRBeU1qRXlNakExT0Zvd1lURUxNQWtHQTFVRUJoTUMKK1JFVXhIVEFiQmdOVkJBb1RGRlZ1YVhabGNuTnBkSGtnYjJZZ1UybGxaMlZ1TVJBd0RnWURWUVFMRXdkR1FqRXlUbFZGTVNFd0h3WUQKK1ZRUURFeGhEYUhKcGMzUnBZVzRnUjJWMVpYSXRVRzlzYkcxaGJtNHdnZ0czTUlJQkxBWUhLb1pJempnRUFUQ0NBUjhDZ1lFQS9YOVQKK2dSMTFFaWxTMzBxY0x1ems1L1lSdDFJODcwUUF3eDQvZ0xaUkptbEZYVUFpVWZ0WlBZMVkrci9GOWJvdzlzdWJWV3pYZ1R1QUhUUnYKKzhtWmd0MnVaVUtXa241L29CSHNRSXNKUHU2blgvcmZHRy9nN1YrZkdxS1lWRHdUN2cvYlR4UjdEQWpWVUUxb1drVEwyZGZPdUsySFgKK0t1L3lJZ01abmRGSUFjY0NGUUNYWUZDUEZTTUx6TEtTdVlLaTY0UUw4RmdjOVFLQmdRRDM0YUNGMXBzOTNzdThxMXcydUZlNWVaU3YKK3UvbzY2b0w1VjB3TFBRZUNaMUZaVjQ2NjFGbFA1bkVIRUlHQXRFa1djU1BvVENnV0U3ZlBDVEtNeUtiaFBCWjZpMVI4alNqZ282NGUKK0s3T21kWkZ1bzM4TCtpRTFZdkg3WW5vQkpEdk1wUEcrcUZHUWlhaUQzK0ZhNVo4R2tvdG1Yb0I3VlNWa0FVdzcvczlKS2dPQmhBQUMKK2dZQVNXZm4rRzFrL25XbnRqOWpYN05rNUpLYWlMWjlCTFIxNmVKSnhxZmYzM1RITGZkR3M5OFhtaDJvUldaVmg5UE1WOG9UUDNocFIKK2NSaXBqWlVaVkVJcXNCbE9HVFZMQ2c0SDVUSjgxSldPaXByaCtta2hDbE5xVXI4bDVIdTdGQlN2UUI2aW5yeWV2YTdqMGFLTmlJdksKKzh2ZkhUaVVacG55TlJoa3ZlQmxNMGpBTEJnY3Foa2pPT0FRREJRQURMd0F3TEFJVVBEZC9VbUI5R2VIcXZHam55MzBCdmp0MEFrVUMKK0ZBOWFiNzJrS3VCNWdlWUdlY2tiQnJjZ1BuWmsKKzwvZHM6WDUwOUNlcnRpZmljYXRlPgorPC9kczpYNTA5RGF0YT4KKzxkczpLZXlWYWx1ZT4KKzxkczpEU0FLZXlWYWx1ZT4KKzxkczpQPgorL1g5VGdSMTFFaWxTMzBxY0x1ems1L1lSdDFJODcwUUF3eDQvZ0xaUkptbEZYVUFpVWZ0WlBZMVkrci9GOWJvdzlzdWJWV3pYZ1R1QQorSFRSdjhtWmd0MnVaVUtXa241L29CSHNRSXNKUHU2blgvcmZHRy9nN1YrZkdxS1lWRHdUN2cvYlR4UjdEQWpWVUUxb1drVEwyZGZPdQorSzJIWEt1L3lJZ01abmRGSUFjYz0KKzwvZHM6UD4KKzxkczpRPmwyQlFqeFVqQzh5eWtybUNvdXVFQy9CWUhQVT08L2RzOlE+Cis8ZHM6Rz4KKzkrR2doZGFiUGQ3THZLdGNOcmhYdVhtVXI3djZPdXFDK1ZkTUN6MEhnbWRSV1ZlT3V0UlpUK1p4QnhDQmdMUkpGbkVqNkV3b0ZoTzMKK3p3a3lqTWltNFR3V2VvdFVmSTBvNEtPdUhpdXpwbldSYnFOL0Mvb2hOV0x4KzJKNkFTUTd6S1R4dnFoUmtJbW9nOS9oV3VXZkJwS0wKK1psNkFlMVVsWkFGTU8vN1BTU289Cis8L2RzOkc+Cis8ZHM6WT4KK0VsbjUvaHRaUDUxcDdZL1kxK3paT1NTbW9pMmZRUzBkZW5pU2NhbjM5OTB4eTMzUnJQZkY1b2RxRVZtVllmVHpGZktFejk0YVVYRVkKK3FZMlZHVlJDS3JBWlRoazFTd29PQitVeWZOU1Zqb3FhNGZwcElRcFRhbEsvSmVSN3V4UVVyMEFlb3A2OG5yMnU0OUdpallpTHl2TDMKK3gwNGxHYVo4alVZWkwzZ1pUTkk9Cis8L2RzOlk+Cis8L2RzOkRTQUtleVZhbHVlPgorPC9kczpLZXlWYWx1ZT4KKzwvZHM6S2V5SW5mbz4KKzxkczpPYmplY3QgSWQ9IlRoZUZpcnN0T2JqZWN0Ij48SW5zaWRlT2JqZWN0PkEgdGV4dCBpbiBhIGJveDwvSW5zaWRlT2JqZWN0PjwvZHM6T2JqZWN0PgorPC9kczpTaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9zaWduYXR1cmUvc2lnbmF0dXJlLWJhZC10cmFuc2Zvcm0tYWxnby54bWwgYi9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9zaWduYXR1cmUvc2lnbmF0dXJlLWJhZC10cmFuc2Zvcm0tYWxnby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJjNDcxMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL3NpZ25hdHVyZS9zaWduYXR1cmUtYmFkLXRyYW5zZm9ybS1hbGdvLnhtbApAQCAtMCwwICsxLDU1IEBACis8ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKzxkczpTaWduZWRJbmZvPgorPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSI+PC9kczpDYW5vbmljYWxpemF0aW9uTWV0aG9kPgorPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSI+PC9kczpTaWduYXR1cmVNZXRob2Q+Cis8ZHM6UmVmZXJlbmNlIFVSST0iI1RoZUZpcnN0T2JqZWN0Ij4KKzxkczpUcmFuc2Zvcm1zPgorPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9iYWQtdHJhbnNmb3JtLWFsZ28iPjwvZHM6VHJhbnNmb3JtPgorPC9kczpUcmFuc2Zvcm1zPgorPGRzOkRpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIj48L2RzOkRpZ2VzdE1ldGhvZD4KKzxkczpEaWdlc3RWYWx1ZT5pcGJzMFV5YWZrZFJJY2ZJbzl6eVpMY2UrQ0U9PC9kczpEaWdlc3RWYWx1ZT4KKzwvZHM6UmVmZXJlbmNlPgorPC9kczpTaWduZWRJbmZvPgorPGRzOlNpZ25hdHVyZVZhbHVlPlcxQzVaVDJuUXdYZCt6SWVaMU5VRmp4NXFuMEVSeWlMblNlWVNTK0ZERzl5T3BLMUZLOEFWQT09PC9kczpTaWduYXR1cmVWYWx1ZT4KKzxkczpLZXlJbmZvPgorPGRzOlg1MDlEYXRhPgorPGRzOlg1MDlDZXJ0aWZpY2F0ZT4KK01JSUM5akNDQXJRQ0JEcnVxaW93Q3dZSEtvWkl6amdFQXdVQU1HRXhDekFKQmdOVkJBWVRBa1JGTVIwd0d3WURWUVFLRXhSVmJtbDIKK1pYSnphWFI1SUc5bUlGTnBaV2RsYmpFUU1BNEdBMVVFQ3hNSFJrSXhNazVWUlRFaE1COEdBMVVFQXhNWVEyaHlhWE4wYVdGdUlFZGwKK2RXVnlMVkJ2Ykd4dFlXNXVNQjRYRFRBeE1EVXdNVEV5TWpBMU9Gb1hEVEEyTVRBeU1qRXlNakExT0Zvd1lURUxNQWtHQTFVRUJoTUMKK1JFVXhIVEFiQmdOVkJBb1RGRlZ1YVhabGNuTnBkSGtnYjJZZ1UybGxaMlZ1TVJBd0RnWURWUVFMRXdkR1FqRXlUbFZGTVNFd0h3WUQKK1ZRUURFeGhEYUhKcGMzUnBZVzRnUjJWMVpYSXRVRzlzYkcxaGJtNHdnZ0czTUlJQkxBWUhLb1pJempnRUFUQ0NBUjhDZ1lFQS9YOVQKK2dSMTFFaWxTMzBxY0x1ems1L1lSdDFJODcwUUF3eDQvZ0xaUkptbEZYVUFpVWZ0WlBZMVkrci9GOWJvdzlzdWJWV3pYZ1R1QUhUUnYKKzhtWmd0MnVaVUtXa241L29CSHNRSXNKUHU2blgvcmZHRy9nN1YrZkdxS1lWRHdUN2cvYlR4UjdEQWpWVUUxb1drVEwyZGZPdUsySFgKK0t1L3lJZ01abmRGSUFjY0NGUUNYWUZDUEZTTUx6TEtTdVlLaTY0UUw4RmdjOVFLQmdRRDM0YUNGMXBzOTNzdThxMXcydUZlNWVaU3YKK3UvbzY2b0w1VjB3TFBRZUNaMUZaVjQ2NjFGbFA1bkVIRUlHQXRFa1djU1BvVENnV0U3ZlBDVEtNeUtiaFBCWjZpMVI4alNqZ282NGUKK0s3T21kWkZ1bzM4TCtpRTFZdkg3WW5vQkpEdk1wUEcrcUZHUWlhaUQzK0ZhNVo4R2tvdG1Yb0I3VlNWa0FVdzcvczlKS2dPQmhBQUMKK2dZQVNXZm4rRzFrL25XbnRqOWpYN05rNUpLYWlMWjlCTFIxNmVKSnhxZmYzM1RITGZkR3M5OFhtaDJvUldaVmg5UE1WOG9UUDNocFIKK2NSaXBqWlVaVkVJcXNCbE9HVFZMQ2c0SDVUSjgxSldPaXByaCtta2hDbE5xVXI4bDVIdTdGQlN2UUI2aW5yeWV2YTdqMGFLTmlJdksKKzh2ZkhUaVVacG55TlJoa3ZlQmxNMGpBTEJnY3Foa2pPT0FRREJRQURMd0F3TEFJVVBEZC9VbUI5R2VIcXZHam55MzBCdmp0MEFrVUMKK0ZBOWFiNzJrS3VCNWdlWUdlY2tiQnJjZ1BuWmsKKzwvZHM6WDUwOUNlcnRpZmljYXRlPgorPC9kczpYNTA5RGF0YT4KKzxkczpLZXlWYWx1ZT4KKzxkczpEU0FLZXlWYWx1ZT4KKzxkczpQPgorL1g5VGdSMTFFaWxTMzBxY0x1ems1L1lSdDFJODcwUUF3eDQvZ0xaUkptbEZYVUFpVWZ0WlBZMVkrci9GOWJvdzlzdWJWV3pYZ1R1QQorSFRSdjhtWmd0MnVaVUtXa241L29CSHNRSXNKUHU2blgvcmZHRy9nN1YrZkdxS1lWRHdUN2cvYlR4UjdEQWpWVUUxb1drVEwyZGZPdQorSzJIWEt1L3lJZ01abmRGSUFjYz0KKzwvZHM6UD4KKzxkczpRPmwyQlFqeFVqQzh5eWtybUNvdXVFQy9CWUhQVT08L2RzOlE+Cis8ZHM6Rz4KKzkrR2doZGFiUGQ3THZLdGNOcmhYdVhtVXI3djZPdXFDK1ZkTUN6MEhnbWRSV1ZlT3V0UlpUK1p4QnhDQmdMUkpGbkVqNkV3b0ZoTzMKK3p3a3lqTWltNFR3V2VvdFVmSTBvNEtPdUhpdXpwbldSYnFOL0Mvb2hOV0x4KzJKNkFTUTd6S1R4dnFoUmtJbW9nOS9oV3VXZkJwS0wKK1psNkFlMVVsWkFGTU8vN1BTU289Cis8L2RzOkc+Cis8ZHM6WT4KK0VsbjUvaHRaUDUxcDdZL1kxK3paT1NTbW9pMmZRUzBkZW5pU2NhbjM5OTB4eTMzUnJQZkY1b2RxRVZtVllmVHpGZktFejk0YVVYRVkKK3FZMlZHVlJDS3JBWlRoazFTd29PQitVeWZOU1Zqb3FhNGZwcElRcFRhbEsvSmVSN3V4UVVyMEFlb3A2OG5yMnU0OUdpallpTHl2TDMKK3gwNGxHYVo4alVZWkwzZ1pUTkk9Cis8L2RzOlk+Cis8L2RzOkRTQUtleVZhbHVlPgorPC9kczpLZXlWYWx1ZT4KKzwvZHM6S2V5SW5mbz4KKzxkczpPYmplY3QgSWQ9IlRoZUZpcnN0T2JqZWN0Ij48SW5zaWRlT2JqZWN0PkEgdGV4dCBpbiBhIGJveDwvSW5zaWRlT2JqZWN0PjwvZHM6T2JqZWN0PgorPC9kczpTaWduYXR1cmU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9zaWduYXR1cmUvc2lnbmF0dXJlLWdvb2QueG1sIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAvc2lnbmF0dXJlL3NpZ25hdHVyZS1nb29kLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2UzM2FjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAvc2lnbmF0dXJlL3NpZ25hdHVyZS1nb29kLnhtbApAQCAtMCwwICsxLDU1IEBACis8ZHM6U2lnbmF0dXJlIHhtbG5zOmRzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKzxkczpTaWduZWRJbmZvPgorPGRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSI+PC9kczpDYW5vbmljYWxpemF0aW9uTWV0aG9kPgorPGRzOlNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSI+PC9kczpTaWduYXR1cmVNZXRob2Q+Cis8ZHM6UmVmZXJlbmNlIFVSST0iI1RoZUZpcnN0T2JqZWN0Ij4KKzxkczpUcmFuc2Zvcm1zPgorPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1I1dpdGhDb21tZW50cyI+PC9kczpUcmFuc2Zvcm0+Cis8L2RzOlRyYW5zZm9ybXM+Cis8ZHM6RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiPjwvZHM6RGlnZXN0TWV0aG9kPgorPGRzOkRpZ2VzdFZhbHVlPmlwYnMwVXlhZmtkUkljZklvOXp5WkxjZStDRT08L2RzOkRpZ2VzdFZhbHVlPgorPC9kczpSZWZlcmVuY2U+Cis8L2RzOlNpZ25lZEluZm8+Cis8ZHM6U2lnbmF0dXJlVmFsdWU+VzFDNVpUMm5Rd1hkK3pJZVoxTlVGang1cW4wRVJ5aUxuU2VZU1MrRkRHOXlPcEsxRks4QVZBPT08L2RzOlNpZ25hdHVyZVZhbHVlPgorPGRzOktleUluZm8+Cis8ZHM6WDUwOURhdGE+Cis8ZHM6WDUwOUNlcnRpZmljYXRlPgorTUlJQzlqQ0NBclFDQkRydXFpb3dDd1lIS29aSXpqZ0VBd1VBTUdFeEN6QUpCZ05WQkFZVEFrUkZNUjB3R3dZRFZRUUtFeFJWYm1sMgorWlhKemFYUjVJRzltSUZOcFpXZGxiakVRTUE0R0ExVUVDeE1IUmtJeE1rNVZSVEVoTUI4R0ExVUVBeE1ZUTJoeWFYTjBhV0Z1SUVkbAorZFdWeUxWQnZiR3h0WVc1dU1CNFhEVEF4TURVd01URXlNakExT0ZvWERUQTJNVEF5TWpFeU1qQTFPRm93WVRFTE1Ba0dBMVVFQmhNQworUkVVeEhUQWJCZ05WQkFvVEZGVnVhWFpsY25OcGRIa2diMllnVTJsbFoyVnVNUkF3RGdZRFZRUUxFd2RHUWpFeVRsVkZNU0V3SHdZRAorVlFRREV4aERhSEpwYzNScFlXNGdSMlYxWlhJdFVHOXNiRzFoYm00d2dnRzNNSUlCTEFZSEtvWkl6amdFQVRDQ0FSOENnWUVBL1g5VAorZ1IxMUVpbFMzMHFjTHV6azUvWVJ0MUk4NzBRQXd4NC9nTFpSSm1sRlhVQWlVZnRaUFkxWStyL0Y5Ym93OXN1YlZXelhnVHVBSFRSdgorOG1aZ3QydVpVS1drbjUvb0JIc1FJc0pQdTZuWC9yZkdHL2c3VitmR3FLWVZEd1Q3Zy9iVHhSN0RBalZVRTFvV2tUTDJkZk91SzJIWAorS3UveUlnTVpuZEZJQWNjQ0ZRQ1hZRkNQRlNNTHpMS1N1WUtpNjRRTDhGZ2M5UUtCZ1FEMzRhQ0YxcHM5M3N1OHExdzJ1RmU1ZVpTdgordS9vNjZvTDVWMHdMUFFlQ1oxRlpWNDY2MUZsUDVuRUhFSUdBdEVrV2NTUG9UQ2dXRTdmUENUS015S2JoUEJaNmkxUjhqU2pnbzY0ZQorSzdPbWRaRnVvMzhMK2lFMVl2SDdZbm9CSkR2TXBQRytxRkdRaWFpRDMrRmE1WjhHa290bVhvQjdWU1ZrQVV3Ny9zOUpLZ09CaEFBQworZ1lBU1dmbitHMWsvbldudGo5alg3Tms1SkthaUxaOUJMUjE2ZUpKeHFmZjMzVEhMZmRHczk4WG1oMm9SV1pWaDlQTVY4b1RQM2hwUgorY1JpcGpaVVpWRUlxc0JsT0dUVkxDZzRINVRKODFKV09pcHJoK21raENsTnFVcjhsNUh1N0ZCU3ZRQjZpbnJ5ZXZhN2owYUtOaUl2SworOHZmSFRpVVpwbnlOUmhrdmVCbE0wakFMQmdjcWhrak9PQVFEQlFBREx3QXdMQUlVUERkL1VtQjlHZUhxdkdqbnkzMEJ2anQwQWtVQworRkE5YWI3MmtLdUI1Z2VZR2Vja2JCcmNnUG5aaworPC9kczpYNTA5Q2VydGlmaWNhdGU+Cis8L2RzOlg1MDlEYXRhPgorPGRzOktleVZhbHVlPgorPGRzOkRTQUtleVZhbHVlPgorPGRzOlA+CisvWDlUZ1IxMUVpbFMzMHFjTHV6azUvWVJ0MUk4NzBRQXd4NC9nTFpSSm1sRlhVQWlVZnRaUFkxWStyL0Y5Ym93OXN1YlZXelhnVHVBCitIVFJ2OG1aZ3QydVpVS1drbjUvb0JIc1FJc0pQdTZuWC9yZkdHL2c3VitmR3FLWVZEd1Q3Zy9iVHhSN0RBalZVRTFvV2tUTDJkZk91CitLMkhYS3UveUlnTVpuZEZJQWNjPQorPC9kczpQPgorPGRzOlE+bDJCUWp4VWpDOHl5a3JtQ291dUVDL0JZSFBVPTwvZHM6UT4KKzxkczpHPgorOStHZ2hkYWJQZDdMdkt0Y05yaFh1WG1Vcjd2Nk91cUMrVmRNQ3owSGdtZFJXVmVPdXRSWlQrWnhCeENCZ0xSSkZuRWo2RXdvRmhPMworendreWpNaW00VHdXZW90VWZJMG80S091SGl1enBuV1JicU4vQy9vaE5XTHgrMko2QVNRN3pLVHh2cWhSa0ltb2c5L2hXdVdmQnBLTAorWmw2QWUxVWxaQUZNTy83UFNTbz0KKzwvZHM6Rz4KKzxkczpZPgorRWxuNS9odFpQNTFwN1kvWTErelpPU1Ntb2kyZlFTMGRlbmlTY2FuMzk5MHh5MzNSclBmRjVvZHFFVm1WWWZUekZmS0V6OTRhVVhFWQorcVkyVkdWUkNLckFaVGhrMVN3b09CK1V5Zk5TVmpvcWE0ZnBwSVFwVGFsSy9KZVI3dXhRVXIwQWVvcDY4bnIydTQ5R2lqWWlMeXZMMworeDA0bEdhWjhqVVlaTDNnWlROST0KKzwvZHM6WT4KKzwvZHM6RFNBS2V5VmFsdWU+Cis8L2RzOktleVZhbHVlPgorPC9kczpLZXlJbmZvPgorPGRzOk9iamVjdCBJZD0iVGhlRmlyc3RPYmplY3QiPjxJbnNpZGVPYmplY3Q+QSB0ZXh0IGluIGEgYm94PC9JbnNpZGVPYmplY3Q+PC9kczpPYmplY3Q+Cis8L2RzOlNpZ25hdHVyZT4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS9vcmcvdzNjL3d3dy9UUi8yMDAwL1JFQy14bWwtMjAwMDEwMDYgYi9zYW1wbGVzL2RhdGEvb3JnL3czYy93d3cvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzYzYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2RhdGEvb3JnL3czYy93d3cvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2CkBAIC0wLDAgKzEsMzE1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pg0KKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iDQorICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCis8IS0tQXJib3JUZXh0LCBJbmMuLCAxOTg4LTIwMDAsIHYuNDAwMi0tPg0KKzxodG1sIGxhbmc9IkVOIj4NCis8aGVhZD4NCis8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1JU08tODg1OS0xIi8+DQorPHRpdGxlPkV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMCAoU2Vjb25kIEVkaXRpb24pPC90aXRsZT4NCis8bGluayBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9TdHlsZVNoZWV0cy9UUi9XM0MtUkVDLmNzcyIgdHlwZT0idGV4dC9jc3MiDQorcmVsPSJzdHlsZXNoZWV0Ii8+DQorPHN0eWxlIHR5cGU9InRleHQvY3NzIj4gY29kZSAgICAgICAgICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyB9ICBkaXYuY29uc3RyYWludCwNCitkaXYuaXNzdWUsIGRpdi5ub3RlLCBkaXYubm90aWNlICAgICB7IG1hcmdpbi1sZWZ0OiAyZW07IH0gIGR0LmxhYmVsICAgICAgDQoreyBkaXNwbGF5OiBydW4taW47IH0gIGxpIHAgICAgICAgICAgIHsgbWFyZ2luLXRvcDogMC4zZW07ICAgICAgICAgICAgICAgIA0KKyBtYXJnaW4tYm90dG9tOiAwLjNlbTsgfSA8L3N0eWxlPg0KKzwvaGVhZD4NCis8Ym9keT4gIDxkaXYgY2xhc3M9ImhlYWQiPjxwPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+PGltZyBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL3czY19ob21lIg0KK2FsdD0iVzNDIiBoZWlnaHQ9IjQ4IiB3aWR0aD0iNzIiLz48L2E+PC9wPjxoMT5FeHRlbnNpYmxlIE1hcmt1cCBMYW5ndWFnZSAoWE1MKQ0KKzEuMCAoU2Vjb25kIEVkaXRpb24pPC9oMT4NCis8aDI+VzNDIFJlY29tbWVuZGF0aW9uIDYgT2N0b2JlciAyMDAwPC9oMj48ZGw+DQorPGR0PlRoaXMgdmVyc2lvbjo8L2R0Pg0KKzxkZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy14bWwtMjAwMDEwMDYiPmh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLXhtbC0yMDAwMTAwNjwvYT4NCisoPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2Lmh0bWwiPlhIVE1MPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMteG1sLTIwMDAxMDA2LnhtbCI+WE1MPC9hPiwgPGENCitocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy14bWwtMjAwMDEwMDYucGRmIj5QREY8L2E+LCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy14bWwtMjAwMDEwMDYtcmV2aWV3Lmh0bWwiPlhIVE1MDQorcmV2aWV3IHZlcnNpb248L2E+IHdpdGggY29sb3ItY29kZWQgcmV2aXNpb24gaW5kaWNhdG9ycyk8L2RkPg0KKzxkdD5MYXRlc3QgdmVyc2lvbjo8L2R0Pg0KKzxkZD48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sIj5odHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sPC9hPjwvZGQ+DQorPGR0PlByZXZpb3VzIHZlcnNpb25zOjwvZHQ+DQorPGRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvV0QteG1sLTJlLTIwMDAwODE0Ij4gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9XRC14bWwtMmUtMjAwMDA4MTQ8L2E+IDwvZGQ+DQorPGRkPjxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCI+IGh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMDwvYT4gPC9kZD4NCis8ZHQ+RWRpdG9yczo8L2R0Pg0KKzxkZD5UaW0gQnJheSwgVGV4dHVhbGl0eSBhbmQgTmV0c2NhcGUgIDxhIGhyZWY9Im1haWx0bzp0YnJheUB0ZXh0dWFsaXR5LmNvbSI+Jmx0O3RicmF5QHRleHR1YWxpdHkuY29tPjwvYT48L2RkPg0KKzxkZD5KZWFuIFBhb2xpLCBNaWNyb3NvZnQgIDxhIGhyZWY9Im1haWx0bzpqZWFucGFAbWljcm9zb2Z0LmNvbSI+Jmx0O2plYW5wYUBtaWNyb3NvZnQuY29tPjwvYT48L2RkPg0KKzxkZD5DLiBNLiBTcGVyYmVyZy1NY1F1ZWVuLCBVbml2ZXJzaXR5IG9mIElsbGlub2lzIGF0IENoaWNhZ28gYW5kIFRleHQgRW5jb2RpbmcNCitJbml0aWF0aXZlIDxhIGhyZWY9Im1haWx0bzpjbXNtY3FAdWljLmVkdSI+Jmx0O2Ntc21jcUB1aWMuZWR1PjwvYT4gPC9kZD4NCis8ZGQ+RXZlIE1hbGVyLCBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIDxhIGhyZWY9Im1haWx0bzplbG1AZWFzdC5zdW4uY29tIj4mbHQ7ZXZlLm1hbGVyQGVhc3Quc3VuLmNvbT48L2E+DQorIC0gU2Vjb25kIEVkaXRpb248L2RkPg0KKzwvZGw+PHAgY2xhc3M9ImNvcHlyaWdodCI+PGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9pcHItbm90aWNlI0NvcHlyaWdodCI+Q29weXJpZ2h0PC9hPiZuYnNwOyZjb3B5OyZuYnNwOzIwMDAmbmJzcDs8YQ0KK2hyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+PGFiYnIgdGl0bGU9IldvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0iPlczQzwvYWJicj48L2E+PHN1cD4mcmVnOzwvc3VwPg0KKyg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1LyI+PGFiYnIgdGl0bGU9Ik1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kiPk1JVDwvYWJicj48L2E+LCA8YQ0KK2hyZWY9Imh0dHA6Ly93d3cuaW5yaWEuZnIvIj48YWJiciB0aXRsZT0iSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBBdXRvbWF0aXF1ZSINCitsYW5nPSJmciI+SU5SSUE8L2FiYnI+PC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5rZWlvLmFjLmpwLyI+S2VpbzwvYT4pLCBBbGwNCitSaWdodHMgUmVzZXJ2ZWQuIFczQyA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2lwci1ub3RpY2UjTGVnYWxfRGlzY2xhaW1lciI+bGlhYmlsaXR5PC9hPiwgPGENCitocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2lwci1ub3RpY2UjVzNDX1RyYWRlbWFya3MiPnRyYWRlbWFyazwvYT4sIDxhDQoraHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtZG9jdW1lbnRzLTE5OTkwNDA1Ij5kb2N1bWVudA0KK3VzZTwvYT4sIGFuZCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMCI+c29mdHdhcmUNCitsaWNlbnNpbmc8L2E+IHJ1bGVzIGFwcGx5LjwvcD48L2Rpdj48aHIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+PGRpdj48aDI+PGENCituYW1lPSJhYnN0cmFjdCI+QWJzdHJhY3Q8L2E+PC9oMj4gPHA+VGhlIEV4dGVuc2libGUgTWFya3VwIExhbmd1YWdlIChYTUwpDQoraXMgYSBzdWJzZXQgb2YgU0dNTCB0aGF0IGlzIGNvbXBsZXRlbHkgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQuIEl0cyBnb2FsDQoraXMgdG8gZW5hYmxlIGdlbmVyaWMgU0dNTCB0byBiZSBzZXJ2ZWQsIHJlY2VpdmVkLCBhbmQgcHJvY2Vzc2VkIG9uIHRoZSBXZWINCitpbiB0aGUgd2F5IHRoYXQgaXMgbm93IHBvc3NpYmxlIHdpdGggSFRNTC4gWE1MIGhhcyBiZWVuIGRlc2lnbmVkIGZvciBlYXNlDQorb2YgaW1wbGVtZW50YXRpb24gYW5kIGZvciBpbnRlcm9wZXJhYmlsaXR5IHdpdGggYm90aCBTR01MIGFuZCBIVE1MLjwvcD4gPC9kaXY+PGRpdj4NCis8aDI+PGEgbmFtZT0ic3RhdHVzIj5TdGF0dXMgb2YgdGhpcyBEb2N1bWVudDwvYT48L2gyPiA8cD5UaGlzDQorZG9jdW1lbnQgaGFzIGJlZW4gcmV2aWV3ZWQgYnkgVzNDIE1lbWJlcnMgYW5kIG90aGVyIGludGVyZXN0ZWQgcGFydGllcyBhbmQNCitoYXMgYmVlbiBlbmRvcnNlZCBieSB0aGUgRGlyZWN0b3IgYXMgYSBXM0MgUmVjb21tZW5kYXRpb24uIEl0IGlzIGEgc3RhYmxlDQorZG9jdW1lbnQgYW5kIG1heSBiZSB1c2VkIGFzIHJlZmVyZW5jZSBtYXRlcmlhbCBvciBjaXRlZCBhcyBhIG5vcm1hdGl2ZSByZWZlcmVuY2UNCitmcm9tIGFub3RoZXIgZG9jdW1lbnQuIFczQydzIHJvbGUgaW4gbWFraW5nIHRoZSBSZWNvbW1lbmRhdGlvbiBpcyB0byBkcmF3DQorYXR0ZW50aW9uIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGFuZCB0byBwcm9tb3RlIGl0cyB3aWRlc3ByZWFkIGRlcGxveW1lbnQuIFRoaXMNCitlbmhhbmNlcyB0aGUgZnVuY3Rpb25hbGl0eSBhbmQgaW50ZXJvcGVyYWJpbGl0eSBvZiB0aGUgV2ViLjwvcD4gPHA+VGhpcyBkb2N1bWVudA0KK3NwZWNpZmllcyBhIHN5bnRheCBjcmVhdGVkIGJ5IHN1YnNldHRpbmcgYW4gZXhpc3RpbmcsIHdpZGVseSB1c2VkIGludGVybmF0aW9uYWwNCit0ZXh0IHByb2Nlc3Npbmcgc3RhbmRhcmQgKFN0YW5kYXJkIEdlbmVyYWxpemVkIE1hcmt1cCBMYW5ndWFnZSwgSVNPIDg4Nzk6MTk4NihFKQ0KK2FzIGFtZW5kZWQgYW5kIGNvcnJlY3RlZCkgZm9yIHVzZSBvbiB0aGUgV29ybGQgV2lkZSBXZWIuIEl0IGlzIGEgcHJvZHVjdCBvZg0KK3RoZSBXM0MgWE1MIEFjdGl2aXR5LCBkZXRhaWxzIG9mIHdoaWNoIGNhbiBiZSBmb3VuZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvIj5odHRwOi8vd3d3LnczLm9yZy9YTUw8L2E+Lg0KKyBUaGUgRW5nbGlzaCB2ZXJzaW9uIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBpcyB0aGUgb25seSBub3JtYXRpdmUgdmVyc2lvbi4NCitIb3dldmVyLCBmb3IgdHJhbnNsYXRpb25zIG9mIHRoaXMgZG9jdW1lbnQsIHNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvI3RyYW5zIj5odHRwOi8vd3d3LnczLm9yZy9YTUwvI3RyYW5zPC9hPi4NCitBIGxpc3Qgb2YgY3VycmVudCBXM0MgUmVjb21tZW5kYXRpb25zIGFuZCBvdGhlciB0ZWNobmljYWwgZG9jdW1lbnRzIGNhbiBiZQ0KK2ZvdW5kIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLyI+aHR0cDovL3d3dy53My5vcmcvVFI8L2E+LjwvcD4gIDxwPlRoaXMNCitzZWNvbmQgZWRpdGlvbiBpcyA8ZW0+bm90PC9lbT4gYSBuZXcgdmVyc2lvbiBvZiBYTUwgKGZpcnN0IHB1Ymxpc2hlZCAxMCBGZWJydWFyeSAxOTk4KTsgaXQgbWVyZWx5IGluY29ycG9yYXRlcw0KK3RoZSBjaGFuZ2VzIGRpY3RhdGVkIGJ5IHRoZSBmaXJzdC1lZGl0aW9uIGVycmF0YSAoYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1hNTC94bWwtMTk5ODAyMTAtZXJyYXRhIj5odHRwOi8vd3d3LnczLm9yZy9YTUwveG1sLTE5OTgwMjEwLWVycmF0YTwvYQ0KKz4pIGFzIGEgY29udmVuaWVuY2UgdG8gcmVhZGVycy4gVGhlIGVycmF0YSBsaXN0IGZvciB0aGlzIHNlY29uZCBlZGl0aW9uIGlzDQorYXZhaWxhYmxlIGF0IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1hNTC94bWwtVjEwLTJlLWVycmF0YSI+aHR0cDovL3d3dy53My5vcmcvWE1ML3htbC1WMTAtMmUtZXJyYXRhPC9hPi48L3A+IDxwPlBsZWFzZQ0KK3JlcG9ydCBlcnJvcnMgaW4gdGhpcyBkb2N1bWVudCB0byA8YSBocmVmPSJtYWlsdG86eG1sLWVkaXRvckB3My5vcmciPnhtbC1lZGl0b3JAdzMub3JnPC9hPjsgPGENCitocmVmPSJodHRwOi8vbGlzdHMudzMub3JnL0FyY2hpdmVzL1B1YmxpYy94bWwtZWRpdG9yIj5hcmNoaXZlczwvYT4gYXJlIGF2YWlsYWJsZS48L3A+IDxkaXYNCitjbGFzcz0ibm90ZSI+PHAgY2xhc3M9InByZWZpeCI+PGI+Tm90ZTo8L2I+PC9wPiA8cD5DLiBNLiBTcGVyYmVyZy1NY1F1ZWVuJ3MNCithZmZpbGlhdGlvbiBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgcHVibGljYXRpb24gb2YgdGhlIGZpcnN0IGVkaXRpb24uIEhlIGlzDQorbm93IGF0IHRoZSBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCBhbmQgY2FuIGJlIGNvbnRhY3RlZCBhdCA8YSBocmVmPSJtYWlsdG86Y21zbWNxQHczLm9yZyI+Y21zbWNxQHczLm9yZzwvYT4uPC9wPiA8L2Rpdj4gPC9kaXY+IDxkaXYNCitjbGFzcz0idG9jIj48aDI+PGEgbmFtZT0iY29udGVudHMiPlRhYmxlIG9mIENvbnRlbnRzPC9hPjwvaDI+PHAgY2xhc3M9InRvYyI+MSA8YQ0KK2hyZWY9IiNzZWMtaW50cm8iPkludHJvZHVjdGlvbjwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7MS4xIDxhDQoraHJlZj0iI3NlYy1vcmlnaW4tZ29hbHMiPk9yaWdpbiBhbmQgR29hbHM8L2E+PGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzEuMiA8YQ0KK2hyZWY9IiNzZWMtdGVybWlub2xvZ3kiPlRlcm1pbm9sb2d5PC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4yIDxhIGhyZWY9IiNzZWMtZG9jdW1lbnRzIj5Eb2N1bWVudHM8L2E+PGJyDQorY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4xIDxhIGhyZWY9IiNzZWMtd2VsbC1mb3JtZWQiPldlbGwtRm9ybWVkDQorWE1MIERvY3VtZW50czwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4yIDxhIGhyZWY9IiNjaGFyc2V0cyI+Q2hhcmFjdGVyczwvYT48YnINCitjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyLjMgPGEgaHJlZj0iI3NlYy1jb21tb24tc3luIj5Db21tb24NCitTeW50YWN0aWMgQ29uc3RydWN0czwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi40IDxhDQoraHJlZj0iI3N5bnRheCI+Q2hhcmFjdGVyIERhdGEgYW5kIE1hcmt1cDwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi41IDxhDQoraHJlZj0iI3NlYy1jb21tZW50cyI+Q29tbWVudHM8L2E+PGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzIuNiA8YQ0KK2hyZWY9IiNzZWMtcGkiPlByb2Nlc3NpbmcgSW5zdHJ1Y3Rpb25zPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyLjcgPGENCitocmVmPSIjc2VjLWNkYXRhLXNlY3QiPkNEQVRBIFNlY3Rpb25zPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsyLjggPGENCitocmVmPSIjc2VjLXByb2xvZy1kdGQiPlByb2xvZyBhbmQgRG9jdW1lbnQgVHlwZSBEZWNsYXJhdGlvbjwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi45IDxhDQoraHJlZj0iI3NlYy1ybWQiPlN0YW5kYWxvbmUgRG9jdW1lbnQgRGVjbGFyYXRpb248L2E+PGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzIuMTAgPGENCitocmVmPSIjc2VjLXdoaXRlLXNwYWNlIj5XaGl0ZSBTcGFjZSBIYW5kbGluZzwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4xMSA8YQ0KK2hyZWY9IiNzZWMtbGluZS1lbmRzIj5FbmQtb2YtTGluZSBIYW5kbGluZzwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Mi4xMiA8YQ0KK2hyZWY9IiNzZWMtbGFuZy10YWciPkxhbmd1YWdlIElkZW50aWZpY2F0aW9uPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4zIDxhDQoraHJlZj0iI3NlYy1sb2dpY2FsLXN0cnVjdCI+TG9naWNhbCBTdHJ1Y3R1cmVzPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDszLjEgPGENCitocmVmPSIjc2VjLXN0YXJ0dGFncyI+U3RhcnQtVGFncywgRW5kLVRhZ3MsIGFuZCBFbXB0eS1FbGVtZW50IFRhZ3M8L2E+PGJyDQorY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7My4yIDxhIGhyZWY9IiNlbGVtZGVjbHMiPkVsZW1lbnQNCitUeXBlIERlY2xhcmF0aW9uczwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7My4yLjEgPGENCitocmVmPSIjc2VjLWVsZW1lbnQtY29udGVudCI+RWxlbWVudCBDb250ZW50PC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDszLjIuMiA8YQ0KK2hyZWY9IiNzZWMtbWl4ZWQtY29udGVudCI+TWl4ZWQgQ29udGVudDwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7My4zIDxhDQoraHJlZj0iI2F0dGRlY2xzIj5BdHRyaWJ1dGUtTGlzdCBEZWNsYXJhdGlvbnM8L2E+PGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzMuMy4xIDxhDQoraHJlZj0iI3NlYy1hdHRyaWJ1dGUtdHlwZXMiPkF0dHJpYnV0ZSBUeXBlczwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7My4zLjIgPGENCitocmVmPSIjc2VjLWF0dHItZGVmYXVsdHMiPkF0dHJpYnV0ZSBEZWZhdWx0czwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7My4zLjMgPGENCitocmVmPSIjQVZOb3JtYWxpemUiPkF0dHJpYnV0ZS1WYWx1ZSBOb3JtYWxpemF0aW9uPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDszLjQgPGENCitocmVmPSIjc2VjLWNvbmRpdGlvbi1zZWN0Ij5Db25kaXRpb25hbCBTZWN0aW9uczwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+NCA8YQ0KK2hyZWY9IiNzZWMtcGh5c2ljYWwtc3RydWN0Ij5QaHlzaWNhbCBTdHJ1Y3R1cmVzPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjEgPGENCitocmVmPSIjc2VjLXJlZmVyZW5jZXMiPkNoYXJhY3RlciBhbmQgRW50aXR5IFJlZmVyZW5jZXM8L2E+PGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzQuMiA8YQ0KK2hyZWY9IiNzZWMtZW50aXR5LWRlY2wiPkVudGl0eSBEZWNsYXJhdGlvbnM8L2E+PGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzQuMi4xIDxhDQoraHJlZj0iI3NlYy1pbnRlcm5hbC1lbnQiPkludGVybmFsIEVudGl0aWVzPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjIuMiA8YQ0KK2hyZWY9IiNzZWMtZXh0ZXJuYWwtZW50Ij5FeHRlcm5hbCBFbnRpdGllczwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NC4zIDxhDQoraHJlZj0iI1RleHRFbnRpdGllcyI+UGFyc2VkIEVudGl0aWVzPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjMuMSA8YQ0KK2hyZWY9IiNzZWMtVGV4dERlY2wiPlRoZSBUZXh0IERlY2xhcmF0aW9uPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjMuMiA8YQ0KK2hyZWY9IiN3Zi1lbnRpdGllcyI+V2VsbC1Gb3JtZWQgUGFyc2VkIEVudGl0aWVzPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjMuMyA8YQ0KK2hyZWY9IiNjaGFyZW5jb2RpbmciPkNoYXJhY3RlciBFbmNvZGluZyBpbiBFbnRpdGllczwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NC40IDxhDQoraHJlZj0iI2VudHByb2MiPlhNTCBQcm9jZXNzb3IgVHJlYXRtZW50IG9mIEVudGl0aWVzIGFuZCBSZWZlcmVuY2VzPC9hPjxicg0KK2NsYXNzPSJodG1sX2NvbXBhdCIvPiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOzQuNC4xIDxhDQoraHJlZj0iI25vdC1yZWNvZ25pemVkIj5Ob3QgUmVjb2duaXplZDwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NC40LjIgPGENCitocmVmPSIjaW5jbHVkZWQiPkluY2x1ZGVkPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjQuMyA8YQ0KK2hyZWY9IiNpbmNsdWRlLWlmLXZhbGlkIj5JbmNsdWRlZCBJZiBWYWxpZGF0aW5nPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjQuNCA8YQ0KK2hyZWY9IiNmb3JiaWRkZW4iPkZvcmJpZGRlbjwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NC40LjUgPGENCitocmVmPSIjaW5saXRlcmFsIj5JbmNsdWRlZCBpbiBMaXRlcmFsPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjQuNiA8YQ0KK2hyZWY9IiNub3RpZnkiPk5vdGlmeTwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NC40LjcgPGENCitocmVmPSIjYnlwYXNzIj5CeXBhc3NlZDwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NC40LjggPGENCitocmVmPSIjYXMtUEUiPkluY2x1ZGVkIGFzIFBFPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjUgPGENCitocmVmPSIjaW50ZXJuLXJlcGxhY2VtZW50Ij5Db25zdHJ1Y3Rpb24gb2YgSW50ZXJuYWwgRW50aXR5IFJlcGxhY2VtZW50IFRleHQ8L2E+PGJyDQorY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NC42IDxhIGhyZWY9IiNzZWMtcHJlZGVmaW5lZC1lbnQiPlByZWRlZmluZWQNCitFbnRpdGllczwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NC43IDxhIGhyZWY9IiNOb3RhdGlvbnMiPk5vdGF0aW9uDQorRGVjbGFyYXRpb25zPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs0LjggPGEgaHJlZj0iI3NlYy1kb2MtZW50aXR5Ij5Eb2N1bWVudA0KK0VudGl0eTwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+NSA8YSBocmVmPSIjc2VjLWNvbmZvcm1hbmNlIj5Db25mb3JtYW5jZTwvYT48YnINCitjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDs1LjEgPGEgaHJlZj0iI3Byb2MtdHlwZXMiPlZhbGlkYXRpbmcNCithbmQgTm9uLVZhbGlkYXRpbmcgUHJvY2Vzc29yczwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7NS4yIDxhDQoraHJlZj0iI3NhZmUtYmVoYXZpb3IiPlVzaW5nIFhNTCBQcm9jZXNzb3JzPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz42IDxhDQoraHJlZj0iI3NlYy1ub3RhdGlvbiI+Tm90YXRpb248L2E+PGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPjwvcD48aDM+QXBwZW5kaWNlczwvaDM+PHANCitjbGFzcz0idG9jIj5BIDxhIGhyZWY9IiNzZWMtYmlibGlvZ3JhcGh5Ij5SZWZlcmVuY2VzPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBLjEgPGENCitocmVmPSIjc2VjLWV4aXN0aW5nLXN0ZHMiPk5vcm1hdGl2ZSBSZWZlcmVuY2VzPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtBLjIgPGENCitocmVmPSIjbnVsbCI+T3RoZXIgUmVmZXJlbmNlczwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+QiA8YSBocmVmPSIjQ2hhckNsYXNzZXMiPkNoYXJhY3Rlcg0KK0NsYXNzZXM8L2E+PGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPkMgPGEgaHJlZj0iI3NlYy14bWwtYW5kLXNnbWwiPlhNTCBhbmQNCitTR01MPC9hPiAoTm9uLU5vcm1hdGl2ZSk8YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+RCA8YSBocmVmPSIjc2VjLWVudGV4cGFuZCI+RXhwYW5zaW9uDQorb2YgRW50aXR5IGFuZCBDaGFyYWN0ZXIgUmVmZXJlbmNlczwvYT4gKE5vbi1Ob3JtYXRpdmUpPGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPkUgPGENCitocmVmPSIjZGV0ZXJtaW5pc20iPkRldGVybWluaXN0aWMgQ29udGVudCBNb2RlbHM8L2E+IChOb24tTm9ybWF0aXZlKTxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz5GIDxhDQoraHJlZj0iI3NlYy1ndWVzc2luZyI+QXV0b2RldGVjdGlvbiBvZiBDaGFyYWN0ZXIgRW5jb2RpbmdzPC9hPiAoTm9uLU5vcm1hdGl2ZSk8YnINCitjbGFzcz0iaHRtbF9jb21wYXQiLz4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtGLjEgPGEgaHJlZj0iI3NlYy1ndWVzc2luZy1uby1leHQtaW5mbyI+RGV0ZWN0aW9uDQorV2l0aG91dCBFeHRlcm5hbCBFbmNvZGluZyBJbmZvcm1hdGlvbjwvYT48YnIgY2xhc3M9Imh0bWxfY29tcGF0Ii8+Jm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ri4yIDxhDQoraHJlZj0iI3NlYy1ndWVzc2luZy13aXRoLWV4dC1pbmZvIj5Qcmlvcml0aWVzIGluIHRoZSBQcmVzZW5jZSBvZiBFeHRlcm5hbA0KK0VuY29kaW5nIEluZm9ybWF0aW9uPC9hPjxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz5HIDxhIGhyZWY9IiNzZWMteG1sLXdnIj5XM0MNCitYTUwgV29ya2luZyBHcm91cDwvYT4gKE5vbi1Ob3JtYXRpdmUpPGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPkggPGEgaHJlZj0iI3NlYy1jb3JlLXdnIj5XM0MNCitYTUwgQ29yZSBHcm91cDwvYT4gKE5vbi1Ob3JtYXRpdmUpPGJyIGNsYXNzPSJodG1sX2NvbXBhdCIvPkkgPGEgaHJlZj0iI2I0ZDI1MGI2YzIxIj5Qcm9kdWN0aW9uDQorTm90ZXM8L2E+IChOb24tTm9ybWF0aXZlKTxiciBjbGFzcz0iaHRtbF9jb21wYXQiLz48L3A+PC9kaXY+PGhyIGNsYXNzPSJodG1sX2NvbXBhdCIvPjxkaXYNCitjbGFzcz0iYm9keSI+IDxkaXYgY2xhc3M9ImRpdjEiPiA8aDI+PGEgbmFtZT0ic2VjLWludHJvIj48L2E+MSBJbnRyb2R1Y3Rpb248L2gyPiA8cD5FeHRlbnNpYmxlDQorTWFya3VwIExhbmd1YWdlLCBhYmJyZXZpYXRlZCBYTUwsIGRlc2NyaWJlcyBhIGNsYXNzIG9mIGRhdGEgb2JqZWN0cyBjYWxsZWQgPGENCit0aXRsZT0iWE1MIERvY3VtZW50IiBocmVmPSIjZHQteG1sLWRvYyI+WE1MIGRvY3VtZW50czwvYT4gYW5kIHBhcnRpYWxseSBkZXNjcmliZXMNCit0aGUgYmVoYXZpb3Igb2YgY29tcHV0ZXIgcHJvZ3JhbXMgd2hpY2ggcHJvY2VzcyB0aGVtLiBYTUwgaXMgYW4gYXBwbGljYXRpb24NCitwcm9maWxlIG9yIHJlc3RyaWN0ZWQgZm9ybSBvZiBTR01MLCB0aGUgU3RhbmRhcmQgR2VuZXJhbGl6ZWQgTWFya3VwIExhbmd1YWdlIDxhDQoraHJlZj0iI0lTTzg4NzkiPltJU08gODg3OV08L2E+LiBCeSBjb25zdHJ1Y3Rpb24sIFhNTCBkb2N1bWVudHMgYXJlIGNvbmZvcm1pbmcNCitTR01MIGRvY3VtZW50cy48L3A+IDxwPlhNTCBkb2N1bWVudHMgYXJlIG1hZGUgdXAgb2Ygc3RvcmFnZSB1bml0cyBjYWxsZWQgPGENCit0aXRsZT0iRW50aXR5IiBocmVmPSIjZHQtZW50aXR5Ij5lbnRpdGllczwvYT4sIHdoaWNoIGNvbnRhaW4gZWl0aGVyIHBhcnNlZA0KK29yIHVucGFyc2VkIGRhdGEuIFBhcnNlZCBkYXRhIGlzIG1hZGUgdXAgb2YgPGEgdGl0bGU9IkNoYXJhY3RlciIgaHJlZj0iI2R0LWNoYXJhY3RlciI+Y2hhcmFjdGVyczwvYT4sDQorc29tZSBvZiB3aGljaCBmb3JtIDxhIHRpdGxlPSJDaGFyYWN0ZXIgRGF0YSIgaHJlZj0iI2R0LWNoYXJkYXRhIj5jaGFyYWN0ZXINCitkYXRhPC9hPiwgYW5kIHNvbWUgb2Ygd2hpY2ggZm9ybSA8YSB0aXRsZT0iTWFya3VwIiBocmVmPSIjZHQtbWFya3VwIj5tYXJrdXA8L2E+Lg0KK01hcmt1cCBlbmNvZGVzIGEgZGVzY3JpcHRpb24gb2YgdGhlIGRvY3VtZW50J3Mgc3RvcmFnZSBsYXlvdXQgYW5kIGxvZ2ljYWwNCitzdHJ1Y3R1cmUuIFhNTCBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byBpbXBvc2UgY29uc3RyYWludHMgb24gdGhlIHN0b3JhZ2UgbGF5b3V0DQorYW5kIGxvZ2ljYWwgc3RydWN0dXJlLjwvcD4gPHA+WzxhIHRpdGxlPSJYTUwgUHJvY2Vzc29yIiBuYW1lPSJkdC14bWwtcHJvYyI+RGVmaW5pdGlvbjwvYT46DQorQSBzb2Z0d2FyZSBtb2R1bGUgY2FsbGVkIGFuIDxiPlhNTCBwcm9jZXNzb3I8L2I+IGlzIHVzZWQgdG8gcmVhZCBYTUwgZG9jdW1lbnRzDQorYW5kIHByb3ZpZGUgYWNjZXNzIHRvIHRoZWlyIGNvbnRlbnQgYW5kIHN0cnVjdHVyZS5dIFs8YSB0aXRsZT0iQXBwbGljYXRpb24iDQorbmFtZT0iZHQtYXBwIj5EZWZpbml0aW9uPC9hPjogSXQgaXMgYXNzdW1lZCB0aGF0IGFuIFhNTCBwcm9jZXNzb3IgaXMgZG9pbmcNCitpdHMgd29yayBvbiBiZWhhbGYgb2YgYW5vdGhlciBtb2R1bGUsIGNhbGxlZCB0aGUgPGI+YXBwbGljYXRpb248L2I+Ll0gVGhpcw0KK3NwZWNpZmljYXRpb24gZGVzY3JpYmVzIHRoZSByZXF1aXJlZCBiZWhhdmlvciBvZiBhbiBYTUwgcHJvY2Vzc29yIGluIHRlcm1zDQorb2YgaG93IGl0IG11c3QgcmVhZCBYTUwgZGF0YSBhbmQgdGhlIGluZm9ybWF0aW9uIGl0IG11c3QgcHJvdmlkZSB0byB0aGUgYXBwbGljYXRpb24uPC9wPiA8ZGl2DQorY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic2VjLW9yaWdpbi1nb2FscyI+PC9hPjEuMSBPcmlnaW4gYW5kIEdvYWxzPC9oMz4gPHA+WE1MDQord2FzIGRldmVsb3BlZCBieSBhbiBYTUwgV29ya2luZyBHcm91cCAob3JpZ2luYWxseSBrbm93biBhcyB0aGUgU0dNTCBFZGl0b3JpYWwNCitSZXZpZXcgQm9hcmQpIGZvcm1lZCB1bmRlciB0aGUgYXVzcGljZXMgb2YgdGhlIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0gKFczQykNCitpbiAxOTk2LiBJdCB3YXMgY2hhaXJlZCBieSBKb24gQm9zYWsgb2YgU3VuIE1pY3Jvc3lzdGVtcyB3aXRoIHRoZSBhY3RpdmUgcGFydGljaXBhdGlvbg0KK29mIGFuIFhNTCBTcGVjaWFsIEludGVyZXN0IEdyb3VwIChwcmV2aW91c2x5IGtub3duIGFzIHRoZSBTR01MIFdvcmtpbmcgR3JvdXApDQorYWxzbyBvcmdhbml6ZWQgYnkgdGhlIFczQy4gVGhlIG1lbWJlcnNoaXAgb2YgdGhlIFhNTCBXb3JraW5nIEdyb3VwIGlzIGdpdmVuDQoraW4gYW4gYXBwZW5kaXguIERhbiBDb25ub2xseSBzZXJ2ZWQgYXMgdGhlIFdHJ3MgY29udGFjdCB3aXRoIHRoZSBXM0MuPC9wPiA8cD5UaGUNCitkZXNpZ24gZ29hbHMgZm9yIFhNTCBhcmU6PC9wPiA8b2w+DQorPGxpPjxwPlhNTCBzaGFsbCBiZSBzdHJhaWdodGZvcndhcmRseSB1c2FibGUgb3ZlciB0aGUgSW50ZXJuZXQuPC9wPjwvbGk+DQorPGxpPjxwPlhNTCBzaGFsbCBzdXBwb3J0IGEgd2lkZSB2YXJpZXR5IG9mIGFwcGxpY2F0aW9ucy48L3A+PC9saT4NCis8bGk+PHA+WE1MIHNoYWxsIGJlIGNvbXBhdGlibGUgd2l0aCBTR01MLjwvcD48L2xpPg0KKzxsaT48cD5JdCBzaGFsbCBiZSBlYXN5IHRvIHdyaXRlIHByb2dyYW1zIHdoaWNoIHByb2Nlc3MgWE1MIGRvY3VtZW50cy48L3A+IDwvbGk+DQorPGxpPjxwPlRoZSBudW1iZXIgb2Ygb3B0aW9uYWwgZmVhdHVyZXMgaW4gWE1MIGlzIHRvIGJlIGtlcHQgdG8gdGhlIGFic29sdXRlDQorbWluaW11bSwgaWRlYWxseSB6ZXJvLjwvcD48L2xpPg0KKzxsaT48cD5YTUwgZG9jdW1lbnRzIHNob3VsZCBiZSBodW1hbi1sZWdpYmxlIGFuZCByZWFzb25hYmx5IGNsZWFyLjwvcD48L2xpPg0KKzxsaT48cD5UaGUgWE1MIGRlc2lnbiBzaG91bGQgYmUgcHJlcGFyZWQgcXVpY2tseS48L3A+PC9saT4NCis8bGk+PHA+VGhlIGRlc2lnbiBvZiBYTUwgc2hhbGwgYmUgZm9ybWFsIGFuZCBjb25jaXNlLjwvcD48L2xpPg0KKzxsaT48cD5YTUwgZG9jdW1lbnRzIHNoYWxsIGJlIGVhc3kgdG8gY3JlYXRlLjwvcD48L2xpPg0KKzxsaT48cD5UZXJzZW5lc3MgaW4gWE1MIG1hcmt1cCBpcyBvZiBtaW5pbWFsIGltcG9ydGFuY2UuPC9wPjwvbGk+DQorPC9vbD4gPHA+VGhpcyBzcGVjaWZpY2F0aW9uLCB0b2dldGhlciB3aXRoIGFzc29jaWF0ZWQgc3RhbmRhcmRzIChVbmljb2RlIGFuZA0KK0lTTy9JRUMgMTA2NDYgZm9yIGNoYXJhY3RlcnMsIEludGVybmV0IFJGQyAxNzY2IGZvciBsYW5ndWFnZSBpZGVudGlmaWNhdGlvbg0KK3RhZ3MsIElTTyA2MzkgZm9yIGxhbmd1YWdlIG5hbWUgY29kZXMsIGFuZCBJU08gMzE2NiBmb3IgY291bnRyeSBuYW1lIGNvZGVzKSwNCitwcm92aWRlcyBhbGwgdGhlIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byB1bmRlcnN0YW5kIFhNTCBWZXJzaW9uIDEuMCBhbmQgY29uc3RydWN0DQorY29tcHV0ZXIgcHJvZ3JhbXMgdG8gcHJvY2VzcyBpdC48L3A+IDxwPlRoaXMgdmVyc2lvbiBvZiB0aGUgWE1MIHNwZWNpZmljYXRpb24NCisgbWF5IGJlIGRpc3RyaWJ1dGVkIGZyZWVseSwgYXMgbG9uZyBhcyBhbGwgdGV4dCBhbmQgbGVnYWwgbm90aWNlcyByZW1haW4gaW50YWN0LjwvcD4gPC9kaXY+IDxkaXYNCitjbGFzcz0iZGl2MiI+IDxoMz48YSBuYW1lPSJzZWMtdGVybWlub2xvZ3kiPjwvYT4xLjIgVGVybWlub2xvZ3k8L2gzPiA8cD5UaGUNCit0ZXJtaW5vbG9neSB1c2VkIHRvIGRlc2NyaWJlIFhNTCBkb2N1bWVudHMgaXMgZGVmaW5lZCBpbiB0aGUgYm9keSBvZiB0aGlzDQorc3BlY2lmaWNhdGlvbi4gVGhlIHRlcm1zIGRlZmluZWQgaW4gdGhlIGZvbGxvd2luZyBsaXN0IGFyZSB1c2VkIGluIGJ1aWxkaW5nDQordGhvc2UgZGVmaW5pdGlvbnMgYW5kIGluIGRlc2NyaWJpbmcgdGhlIGFjdGlvbnMgb2YgYW4gWE1MIHByb2Nlc3NvcjogPC9wPjxkbD4NCis8ZHQgY2xhc3M9ImxhYmVsIj5tYXk8L2R0Pg0KKzxkZD4gPHA+WzxhIHRpdGxlPSJNYXkiIG5hbWU9ImR0LW1heSI+RGVmaW5pdGlvbjwvYT46IENvbmZvcm1pbmcgZG9jdW1lbnRzDQorYW5kIFhNTCBwcm9jZXNzb3JzIGFyZSBwZXJtaXR0ZWQgdG8gYnV0IG5lZWQgbm90IGJlaGF2ZSBhcyBkZXNjcmliZWQuXTwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj5tdXN0PC9kdD4NCis8ZGQ+IDxwPls8YSB0aXRsZT0iTXVzdCIgbmFtZT0iZHQtbXVzdCI+RGVmaW5pdGlvbjwvYT46IENvbmZvcm1pbmcgZG9jdW1lbnRzDQorYW5kIFhNTCBwcm9jZXNzb3JzIGFyZSByZXF1aXJlZCB0byBiZWhhdmUgYXMgZGVzY3JpYmVkOyBvdGhlcndpc2UgdGhleSBhcmUNCitpbiBlcnJvci4gXTwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj5lcnJvcjwvZHQ+DQorPGRkPiA8cD5bPGEgdGl0bGU9IkVycm9yIiBuYW1lPSJkdC1lcnJvciI+RGVmaW5pdGlvbjwvYT46IEEgdmlvbGF0aW9uIG9mIHRoZQ0KK3J1bGVzIG9mIHRoaXMgc3BlY2lmaWNhdGlvbjsgcmVzdWx0cyBhcmUgdW5kZWZpbmVkLiBDb25mb3JtaW5nIHNvZnR3YXJlIG1heQ0KK2RldGVjdCBhbmQgcmVwb3J0IGFuIGVycm9yIGFuZCBtYXkgcmVjb3ZlciBmcm9tIGl0Ll08L3A+IDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+ZmF0YWwgZXJyb3I8L2R0Pg0KKzxkZD4gPHA+WzxhIHRpdGxlPSJGYXRhbCBFcnJvciIgbmFtZT0iZHQtZmF0YWwiPkRlZmluaXRpb248L2E+OiBBbiBlcnJvciB3aGljaA0KK2EgY29uZm9ybWluZyA8YSB0aXRsZT0iWE1MIFByb2Nlc3NvciIgaHJlZj0iI2R0LXhtbC1wcm9jIj5YTUwgcHJvY2Vzc29yPC9hPg0KK211c3QgZGV0ZWN0IGFuZCByZXBvcnQgdG8gdGhlIGFwcGxpY2F0aW9uLiBBZnRlciBlbmNvdW50ZXJpbmcgYSBmYXRhbCBlcnJvciwNCit0aGUgcHJvY2Vzc29yIG1heSBjb250aW51ZSBwcm9jZXNzaW5nIHRoZSBkYXRhIHRvIHNlYXJjaCBmb3IgZnVydGhlciBlcnJvcnMNCithbmQgbWF5IHJlcG9ydCBzdWNoIGVycm9ycyB0byB0aGUgYXBwbGljYXRpb24uIEluIG9yZGVyIHRvIHN1cHBvcnQgY29ycmVjdGlvbg0KK29mIGVycm9ycywgdGhlIHByb2Nlc3NvciBtYXkgbWFrZSB1bnByb2Nlc3NlZCBkYXRhIGZyb20gdGhlIGRvY3VtZW50ICh3aXRoDQoraW50ZXJtaW5nbGVkIGNoYXJhY3RlciBkYXRhIGFuZCBtYXJrdXApIGF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24uIE9uY2UNCithIGZhdGFsIGVycm9yIGlzIGRldGVjdGVkLCBob3dldmVyLCB0aGUgcHJvY2Vzc29yIG11c3Qgbm90IGNvbnRpbnVlIG5vcm1hbA0KK3Byb2Nlc3NpbmcgKGkuZS4sIGl0IG11c3Qgbm90IGNvbnRpbnVlIHRvIHBhc3MgY2hhcmFjdGVyIGRhdGEgYW5kIGluZm9ybWF0aW9uDQorYWJvdXQgdGhlIGRvY3VtZW50J3MgbG9naWNhbCBzdHJ1Y3R1cmUgdG8gdGhlIGFwcGxpY2F0aW9uIGluIHRoZSBub3JtYWwgd2F5KS5dPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPmF0IHVzZXIgb3B0aW9uPC9kdD4NCis8ZGQ+IDxwPls8YSB0aXRsZT0iQXQgdXNlciBvcHRpb24iIG5hbWU9ImR0LWF0dXNlcm9wdGlvbiI+RGVmaW5pdGlvbjwvYT46DQorQ29uZm9ybWluZyBzb2Z0d2FyZSBtYXkgb3IgbXVzdCAoZGVwZW5kaW5nIG9uIHRoZSBtb2RhbCB2ZXJiIGluIHRoZSBzZW50ZW5jZSkNCitiZWhhdmUgYXMgZGVzY3JpYmVkOyBpZiBpdCBkb2VzLCBpdCBtdXN0IHByb3ZpZGUgdXNlcnMgYSBtZWFucyB0byBlbmFibGUgb3INCitkaXNhYmxlIHRoZSBiZWhhdmlvciBkZXNjcmliZWQuXTwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj52YWxpZGl0eSBjb25zdHJhaW50PC9kdD4NCis8ZGQ+IDxwPls8YSB0aXRsZT0iVmFsaWRpdHkgY29uc3RyYWludCIgbmFtZT0iZHQtdmMiPkRlZmluaXRpb248L2E+OiBBIHJ1bGUNCit3aGljaCBhcHBsaWVzIHRvIGFsbCA8YSB0aXRsZT0iVmFsaWRpdHkiIGhyZWY9IiNkdC12YWxpZCI+dmFsaWQ8L2E+IFhNTCBkb2N1bWVudHMuDQorVmlvbGF0aW9ucyBvZiB2YWxpZGl0eSBjb25zdHJhaW50cyBhcmUgZXJyb3JzOyB0aGV5IG11c3QsIGF0IHVzZXIgb3B0aW9uLA0KK2JlIHJlcG9ydGVkIGJ5IDxhIHRpdGxlPSJWYWxpZGF0aW5nIFByb2Nlc3NvciIgaHJlZj0iI2R0LXZhbGlkYXRpbmciPnZhbGlkYXRpbmcNCitYTUwgcHJvY2Vzc29yczwvYT4uXTwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj53ZWxsLWZvcm1lZG5lc3MgY29uc3RyYWludDwvZHQ+DQorPGRkPiA8cD5bPGEgdGl0bGU9IldlbGwtZm9ybWVkbmVzcyBjb25zdHJhaW50IiBuYW1lPSJkdC13ZmMiPkRlZmluaXRpb248L2E+Og0KK0EgcnVsZSB3aGljaCBhcHBsaWVzIHRvIGFsbCA8YSB0aXRsZT0iV2VsbC1Gb3JtZWQiIGhyZWY9IiNkdC13ZWxsZm9ybWVkIj53ZWxsLWZvcm1lZDwvYT4NCitYTUwgZG9jdW1lbnRzLiBWaW9sYXRpb25zIG9mIHdlbGwtZm9ybWVkbmVzcyBjb25zdHJhaW50cyBhcmUgPGEgdGl0bGU9IkZhdGFsIEVycm9yIg0KK2hyZWY9IiNkdC1mYXRhbCI+ZmF0YWwgZXJyb3JzPC9hPi5dPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPm1hdGNoPC9kdD4NCis8ZGQ+IDxwPls8YSB0aXRsZT0ibWF0Y2giIG5hbWU9ImR0LW1hdGNoIj5EZWZpbml0aW9uPC9hPjogKE9mIHN0cmluZ3Mgb3IgbmFtZXM6KQ0KK1R3byBzdHJpbmdzIG9yIG5hbWVzIGJlaW5nIGNvbXBhcmVkIG11c3QgYmUgaWRlbnRpY2FsLiBDaGFyYWN0ZXJzIHdpdGggbXVsdGlwbGUNCitwb3NzaWJsZSByZXByZXNlbnRhdGlvbnMgaW4gSVNPL0lFQyAxMDY0NiAoZS5nLiBjaGFyYWN0ZXJzIHdpdGggYm90aCBwcmVjb21wb3NlZA0KK2FuZCBiYXNlK2RpYWNyaXRpYyBmb3JtcykgbWF0Y2ggb25seSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgcmVwcmVzZW50YXRpb24NCitpbiBib3RoIHN0cmluZ3MuIE5vIGNhc2UgZm9sZGluZyBpcyBwZXJmb3JtZWQuIChPZiBzdHJpbmdzIGFuZCBydWxlcyBpbiB0aGUNCitncmFtbWFyOikgQSBzdHJpbmcgbWF0Y2hlcyBhIGdyYW1tYXRpY2FsIHByb2R1Y3Rpb24gaWYgaXQgYmVsb25ncyB0byB0aGUgbGFuZ3VhZ2UNCitnZW5lcmF0ZWQgYnkgdGhhdCBwcm9kdWN0aW9uLiAoT2YgY29udGVudCBhbmQgY29udGVudCBtb2RlbHM6KSBBbiBlbGVtZW50DQorbWF0Y2hlcyBpdHMgZGVjbGFyYXRpb24gd2hlbiBpdCBjb25mb3JtcyBpbiB0aGUgZmFzaGlvbiBkZXNjcmliZWQgaW4gdGhlIGNvbnN0cmFpbnQgPGENCitocmVmPSIjZWxlbWVudHZhbGlkIj48Yj5bVkM6IEVsZW1lbnQgVmFsaWRdPC9iPjwvYT4uXTwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj5mb3IgY29tcGF0aWJpbGl0eTwvZHQ+DQorPGRkPiA8cD5bPGEgdGl0bGU9IkZvciBDb21wYXRpYmlsaXR5IiBuYW1lPSJkdC1jb21wYXQiPkRlZmluaXRpb248L2E+OiBNYXJrcw0KK2Egc2VudGVuY2UgZGVzY3JpYmluZyBhIGZlYXR1cmUgb2YgWE1MIGluY2x1ZGVkIHNvbGVseSB0byBlbnN1cmUgdGhhdCBYTUwNCityZW1haW5zIGNvbXBhdGlibGUgd2l0aCBTR01MLl08L3A+IDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+Zm9yIGludGVyb3BlcmFiaWxpdHk8L2R0Pg0KKzxkZD4gPHA+WzxhIHRpdGxlPSJGb3IgaW50ZXJvcGVyYWJpbGl0eSIgbmFtZT0iZHQtaW50ZXJvcCI+RGVmaW5pdGlvbjwvYT46DQorTWFya3MgYSBzZW50ZW5jZSBkZXNjcmliaW5nIGEgbm9uLWJpbmRpbmcgcmVjb21tZW5kYXRpb24gaW5jbHVkZWQgdG8gaW5jcmVhc2UNCit0aGUgY2hhbmNlcyB0aGF0IFhNTCBkb2N1bWVudHMgY2FuIGJlIHByb2Nlc3NlZCBieSB0aGUgZXhpc3RpbmcgaW5zdGFsbGVkDQorYmFzZSBvZiBTR01MIHByb2Nlc3NvcnMgd2hpY2ggcHJlZGF0ZSB0aGUgV2ViU0dNTCBBZGFwdGF0aW9ucyBBbm5leCB0byBJU08NCis4ODc5Ll08L3A+IDwvZGQ+DQorPC9kbD48cD48L3A+IDwvZGl2PiA8L2Rpdj4gIDxkaXYgY2xhc3M9ImRpdjEiPiA8aDI+PGEgbmFtZT0ic2VjLWRvY3VtZW50cyI+PC9hPjINCitEb2N1bWVudHM8L2gyPiA8cD5bPGEgdGl0bGU9IlhNTCBEb2N1bWVudCIgbmFtZT0iZHQteG1sLWRvYyI+RGVmaW5pdGlvbjwvYT46DQorIEEgZGF0YSBvYmplY3QgaXMgYW4gPGI+WE1MIGRvY3VtZW50PC9iPiBpZiBpdCBpcyA8YSB0aXRsZT0iV2VsbC1Gb3JtZWQiIGhyZWY9IiNkdC13ZWxsZm9ybWVkIj53ZWxsLWZvcm1lZDwvYT4sDQorYXMgZGVmaW5lZCBpbiB0aGlzIHNwZWNpZmljYXRpb24uIEEgd2VsbC1mb3JtZWQgWE1MIGRvY3VtZW50IG1heSBpbiBhZGRpdGlvbg0KK2JlIDxhIHRpdGxlPSJWYWxpZGl0eSIgaHJlZj0iI2R0LXZhbGlkIj52YWxpZDwvYT4gaWYgaXQgbWVldHMgY2VydGFpbiBmdXJ0aGVyDQorY29uc3RyYWludHMuXTwvcD4gPHA+RWFjaCBYTUwgZG9jdW1lbnQgaGFzIGJvdGggYSBsb2dpY2FsIGFuZCBhIHBoeXNpY2FsIHN0cnVjdHVyZS4NCitQaHlzaWNhbGx5LCB0aGUgZG9jdW1lbnQgaXMgY29tcG9zZWQgb2YgdW5pdHMgY2FsbGVkIDxhIHRpdGxlPSJFbnRpdHkiIGhyZWY9IiNkdC1lbnRpdHkiPmVudGl0aWVzPC9hPi4NCitBbiBlbnRpdHkgbWF5IDxhIHRpdGxlPSJFbnRpdHkgUmVmZXJlbmNlIiBocmVmPSIjZHQtZW50cmVmIj5yZWZlcjwvYT4gdG8gb3RoZXINCitlbnRpdGllcyB0byBjYXVzZSB0aGVpciBpbmNsdXNpb24gaW4gdGhlIGRvY3VtZW50LiBBIGRvY3VtZW50IGJlZ2lucyBpbiBhDQorInJvb3QiIG9yIDxhIHRpdGxlPSJEb2N1bWVudCBFbnRpdHkiIGhyZWY9IiNkdC1kb2NlbnQiPmRvY3VtZW50IGVudGl0eTwvYT4uDQorTG9naWNhbGx5LCB0aGUgZG9jdW1lbnQgaXMgY29tcG9zZWQgb2YgZGVjbGFyYXRpb25zLCBlbGVtZW50cywgY29tbWVudHMsIGNoYXJhY3Rlcg0KK3JlZmVyZW5jZXMsIGFuZCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgYWxsIG9mIHdoaWNoIGFyZSBpbmRpY2F0ZWQgaW4gdGhlDQorZG9jdW1lbnQgYnkgZXhwbGljaXQgbWFya3VwLiBUaGUgbG9naWNhbCBhbmQgcGh5c2ljYWwgc3RydWN0dXJlcyBtdXN0IG5lc3QNCitwcm9wZXJseSwgYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9IiN3Zi1lbnRpdGllcyI+PGI+NC4zLjIgV2VsbC1Gb3JtZWQgUGFyc2VkDQorRW50aXRpZXM8L2I+PC9hPi48L3A+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic2VjLXdlbGwtZm9ybWVkIj48L2E+Mi4xDQorV2VsbC1Gb3JtZWQgWE1MIERvY3VtZW50czwvaDM+IDxwPls8YSB0aXRsZT0iV2VsbC1Gb3JtZWQiIG5hbWU9ImR0LXdlbGxmb3JtZWQiPkRlZmluaXRpb248L2E+Og0KKyBBIHRleHR1YWwgb2JqZWN0IGlzIGEgPGI+d2VsbC1mb3JtZWQ8L2I+IFhNTCBkb2N1bWVudCBpZjpdPC9wPiA8b2w+DQorPGxpPjxwPlRha2VuIGFzIGEgd2hvbGUsIGl0IG1hdGNoZXMgdGhlIHByb2R1Y3Rpb24gbGFiZWxlZCA8YSBocmVmPSIjTlQtZG9jdW1lbnQiPmRvY3VtZW50PC9hPi48L3A+IDwvbGk+DQorPGxpPjxwPkl0IG1lZXRzIGFsbCB0aGUgd2VsbC1mb3JtZWRuZXNzIGNvbnN0cmFpbnRzIGdpdmVuIGluIHRoaXMgc3BlY2lmaWNhdGlvbi48L3A+IDwvbGk+DQorPGxpPjxwPkVhY2ggb2YgdGhlIDxhIHRpdGxlPSJUZXh0IEVudGl0eSIgaHJlZj0iI2R0LXBhcnNlZGVudCI+cGFyc2VkIGVudGl0aWVzPC9hPg0KK3doaWNoIGlzIHJlZmVyZW5jZWQgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB3aXRoaW4gdGhlIGRvY3VtZW50IGlzIDxhIHRpdGxlPSJXZWxsLUZvcm1lZCINCitocmVmPSIjZHQtd2VsbGZvcm1lZCI+d2VsbC1mb3JtZWQ8L2E+LjwvcD48L2xpPg0KKzwvb2w+IDxoNT5Eb2N1bWVudDwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtZG9jdW1lbnQiPjwvYT5bMV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5kb2N1bWVudDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtcHJvbG9nIj5wcm9sb2c8L2E+IDxhIGhyZWY9IiNOVC1lbGVtZW50Ij5lbGVtZW50PC9hPiA8YQ0KK2hyZWY9IiNOVC1NaXNjIj5NaXNjPC9hPio8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+TWF0Y2hpbmcgdGhlIDxhIGhyZWY9IiNOVC1kb2N1bWVudCI+ZG9jdW1lbnQ8L2E+IHByb2R1Y3Rpb24NCitpbXBsaWVzIHRoYXQ6PC9wPiA8b2w+DQorPGxpPjxwPkl0IGNvbnRhaW5zIG9uZSBvciBtb3JlIDxhIHRpdGxlPSJFbGVtZW50IiBocmVmPSIjZHQtZWxlbWVudCI+ZWxlbWVudHM8L2E+LjwvcD4gPC9saT4NCis8bGk+PHA+WzxhIHRpdGxlPSJSb290IEVsZW1lbnQiIG5hbWU9ImR0LXJvb3QiPkRlZmluaXRpb248L2E+OiBUaGVyZSBpcyBleGFjdGx5DQorb25lIGVsZW1lbnQsIGNhbGxlZCB0aGUgPGI+cm9vdDwvYj4sIG9yIGRvY3VtZW50IGVsZW1lbnQsIG5vIHBhcnQgb2Ygd2hpY2gNCithcHBlYXJzIGluIHRoZSA8YSB0aXRsZT0iQ29udGVudCIgaHJlZj0iI2R0LWNvbnRlbnQiPmNvbnRlbnQ8L2E+IG9mIGFueSBvdGhlcg0KK2VsZW1lbnQuXSBGb3IgYWxsIG90aGVyIGVsZW1lbnRzLCBpZiB0aGUgPGEgdGl0bGU9IlN0YXJ0LVRhZyIgaHJlZj0iI2R0LXN0YWciPnN0YXJ0LXRhZzwvYT4NCitpcyBpbiB0aGUgY29udGVudCBvZiBhbm90aGVyIGVsZW1lbnQsIHRoZSA8YSB0aXRsZT0iRW5kIFRhZyIgaHJlZj0iI2R0LWV0YWciPmVuZC10YWc8L2E+DQoraXMgaW4gdGhlIGNvbnRlbnQgb2YgdGhlIHNhbWUgZWxlbWVudC4gTW9yZSBzaW1wbHkgc3RhdGVkLCB0aGUgZWxlbWVudHMsIGRlbGltaXRlZA0KK2J5IHN0YXJ0LSBhbmQgZW5kLXRhZ3MsIG5lc3QgcHJvcGVybHkgd2l0aGluIGVhY2ggb3RoZXIuPC9wPjwvbGk+DQorPC9vbD4gPHA+WzxhIHRpdGxlPSJQYXJlbnQvQ2hpbGQiIG5hbWU9ImR0LXBhcmVudGNoaWxkIj5EZWZpbml0aW9uPC9hPjogQXMNCithIGNvbnNlcXVlbmNlIG9mIHRoaXMsIGZvciBlYWNoIG5vbi1yb290IGVsZW1lbnQgPGNvZGU+QzwvY29kZT4gaW4gdGhlIGRvY3VtZW50LA0KK3RoZXJlIGlzIG9uZSBvdGhlciBlbGVtZW50IDxjb2RlPlA8L2NvZGU+IGluIHRoZSBkb2N1bWVudCBzdWNoIHRoYXQgPGNvZGU+QzwvY29kZT4NCitpcyBpbiB0aGUgY29udGVudCBvZiA8Y29kZT5QPC9jb2RlPiwgYnV0IGlzIG5vdCBpbiB0aGUgY29udGVudCBvZiBhbnkgb3RoZXINCitlbGVtZW50IHRoYXQgaXMgaW4gdGhlIGNvbnRlbnQgb2YgPGNvZGU+UDwvY29kZT4uIDxjb2RlPlA8L2NvZGU+IGlzIHJlZmVycmVkDQordG8gYXMgdGhlIDxiPnBhcmVudDwvYj4gb2YgPGNvZGU+QzwvY29kZT4sIGFuZCA8Y29kZT5DPC9jb2RlPiBhcyBhIDxiPmNoaWxkPC9iPg0KK29mIDxjb2RlPlA8L2NvZGU+Ll08L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9ImNoYXJzZXRzIj48L2E+Mi4yDQorQ2hhcmFjdGVyczwvaDM+IDxwPls8YSB0aXRsZT0iVGV4dCIgbmFtZT0iZHQtdGV4dCI+RGVmaW5pdGlvbjwvYT46IEEgcGFyc2VkDQorZW50aXR5IGNvbnRhaW5zIDxiPnRleHQ8L2I+LCBhIHNlcXVlbmNlIG9mIDxhIHRpdGxlPSJDaGFyYWN0ZXIiIGhyZWY9IiNkdC1jaGFyYWN0ZXIiPmNoYXJhY3RlcnM8L2E+LA0KK3doaWNoIG1heSByZXByZXNlbnQgbWFya3VwIG9yIGNoYXJhY3RlciBkYXRhLl0gWzxhIHRpdGxlPSJDaGFyYWN0ZXIiIG5hbWU9ImR0LWNoYXJhY3RlciI+RGVmaW5pdGlvbjwvYT46DQorQSA8Yj5jaGFyYWN0ZXI8L2I+IGlzIGFuIGF0b21pYyB1bml0IG9mIHRleHQgYXMgc3BlY2lmaWVkIGJ5IElTTy9JRUMgMTA2NDYgPGENCitocmVmPSIjSVNPMTA2NDYiPltJU08vSUVDIDEwNjQ2XTwvYT4gKHNlZSBhbHNvIDxhIGhyZWY9IiNJU08xMDY0Ni0yMDAwIj5bSVNPL0lFQw0KKzEwNjQ2LTIwMDBdPC9hPikuIExlZ2FsIGNoYXJhY3RlcnMgYXJlIHRhYiwgY2FycmlhZ2UgcmV0dXJuLCBsaW5lIGZlZWQsIGFuZA0KK3RoZSBsZWdhbCBjaGFyYWN0ZXJzIG9mIFVuaWNvZGUgYW5kIElTTy9JRUMgMTA2NDYuIFRoZSB2ZXJzaW9ucyBvZiB0aGVzZSBzdGFuZGFyZHMNCitjaXRlZCBpbiA8YSBocmVmPSIjc2VjLWV4aXN0aW5nLXN0ZHMiPjxiPkEuMSBOb3JtYXRpdmUgUmVmZXJlbmNlczwvYj48L2E+DQord2VyZSBjdXJyZW50IGF0IHRoZSB0aW1lIHRoaXMgZG9jdW1lbnQgd2FzIHByZXBhcmVkLiBOZXcgY2hhcmFjdGVycyBtYXkgYmUNCithZGRlZCB0byB0aGVzZSBzdGFuZGFyZHMgYnkgYW1lbmRtZW50cyBvciBuZXcgZWRpdGlvbnMuIENvbnNlcXVlbnRseSwgWE1MDQorcHJvY2Vzc29ycyBtdXN0IGFjY2VwdCBhbnkgY2hhcmFjdGVyIGluIHRoZSByYW5nZSBzcGVjaWZpZWQgZm9yIDxhIGhyZWY9IiNOVC1DaGFyIj5DaGFyPC9hPi4NCitUaGUgdXNlIG9mICJjb21wYXRpYmlsaXR5IGNoYXJhY3RlcnMiLCBhcyBkZWZpbmVkIGluIHNlY3Rpb24gNi44IG9mIDxhIGhyZWY9IiNVbmljb2RlIj5bVW5pY29kZV08L2E+DQorKHNlZSBhbHNvIEQyMSBpbiBzZWN0aW9uIDMuNiBvZiA8YSBocmVmPSIjVW5pY29kZTMiPltVbmljb2RlM108L2E+KSwgaXMgZGlzY291cmFnZWQuXTwvcD4gPGg1PkNoYXJhY3Rlcg0KK1JhbmdlPC9oNT48dGFibGUgY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1DaGFyIj48L2E+WzJdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+Q2hhcjwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4jeDkgfCAjeEEgfCAjeEQgfCBbI3gyMC0jeEQ3RkZdIHwgWyN4RTAwMC0jeEZGRkRdIHwgWyN4MTAwMDAtI3gxMEZGRkZdPC9jb2RlPjwvdGQ+DQorPHRkPjxpPi8qIGFueSBVbmljb2RlIGNoYXJhY3RlciwgZXhjbHVkaW5nIHRoZSBzdXJyb2dhdGUgYmxvY2tzLCBGRkZFLCBhbmQNCitGRkZGLiAqLzwvaT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5UaGUgbWVjaGFuaXNtIGZvciBlbmNvZGluZyBjaGFyYWN0ZXIgY29kZSBwb2ludHMgaW50bw0KK2JpdCBwYXR0ZXJucyBtYXkgdmFyeSBmcm9tIGVudGl0eSB0byBlbnRpdHkuIEFsbCBYTUwgcHJvY2Vzc29ycyBtdXN0IGFjY2VwdA0KK3RoZSBVVEYtOCBhbmQgVVRGLTE2IGVuY29kaW5ncyBvZiAxMDY0NjsgdGhlIG1lY2hhbmlzbXMgZm9yIHNpZ25hbGluZyB3aGljaA0KK29mIHRoZSB0d28gaXMgaW4gdXNlLCBvciBmb3IgYnJpbmdpbmcgb3RoZXIgZW5jb2RpbmdzIGludG8gcGxheSwgYXJlIGRpc2N1c3NlZA0KK2xhdGVyLCBpbiA8YSBocmVmPSIjY2hhcmVuY29kaW5nIj48Yj40LjMuMyBDaGFyYWN0ZXIgRW5jb2RpbmcgaW4gRW50aXRpZXM8L2I+PC9hPi48L3A+DQorIDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9InNlYy1jb21tb24tc3luIj48L2E+Mi4zIENvbW1vbiBTeW50YWN0aWMNCitDb25zdHJ1Y3RzPC9oMz4gPHA+VGhpcyBzZWN0aW9uIGRlZmluZXMgc29tZSBzeW1ib2xzIHVzZWQgd2lkZWx5IGluIHRoZSBncmFtbWFyLjwvcD4gPHA+PGENCitocmVmPSIjTlQtUyI+UzwvYT4gKHdoaXRlIHNwYWNlKSBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBzcGFjZSAoI3gyMCkgY2hhcmFjdGVycywNCitjYXJyaWFnZSByZXR1cm5zLCBsaW5lIGZlZWRzLCBvciB0YWJzLjwvcD4gPGg1PldoaXRlIFNwYWNlPC9oNT48dGFibGUgY2xhc3M9InNjcmFwIj4NCis8dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1TIj48L2E+WzNdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+UzwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4oI3gyMCB8ICN4OSB8ICN4RCB8ICN4QSkrPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxwPkNoYXJhY3RlcnMgYXJlIGNsYXNzaWZpZWQgZm9yIGNvbnZlbmllbmNlIGFzIGxldHRlcnMsDQorZGlnaXRzLCBvciBvdGhlciBjaGFyYWN0ZXJzLiBBIGxldHRlciBjb25zaXN0cyBvZiBhbiBhbHBoYWJldGljIG9yIHN5bGxhYmljDQorYmFzZSBjaGFyYWN0ZXIgb3IgYW4gaWRlb2dyYXBoaWMgY2hhcmFjdGVyLiBGdWxsIGRlZmluaXRpb25zIG9mIHRoZSBzcGVjaWZpYw0KK2NoYXJhY3RlcnMgaW4gZWFjaCBjbGFzcyBhcmUgZ2l2ZW4gaW4gPGEgaHJlZj0iI0NoYXJDbGFzc2VzIj48Yj5CIENoYXJhY3Rlcg0KK0NsYXNzZXM8L2I+PC9hPi48L3A+IDxwPls8YSB0aXRsZT0iTmFtZSIgbmFtZT0iZHQtbmFtZSI+RGVmaW5pdGlvbjwvYT46IEEgPGI+TmFtZTwvYj4NCitpcyBhIHRva2VuIGJlZ2lubmluZyB3aXRoIGEgbGV0dGVyIG9yIG9uZSBvZiBhIGZldyBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzLA0KK2FuZCBjb250aW51aW5nIHdpdGggbGV0dGVycywgZGlnaXRzLCBoeXBoZW5zLCB1bmRlcnNjb3JlcywgY29sb25zLCBvciBmdWxsDQorc3RvcHMsIHRvZ2V0aGVyIGtub3duIGFzIG5hbWUgY2hhcmFjdGVycy5dIE5hbWVzIGJlZ2lubmluZyB3aXRoIHRoZSBzdHJpbmcNCisiPGNvZGU+eG1sPC9jb2RlPiIsIG9yIGFueSBzdHJpbmcgd2hpY2ggd291bGQgbWF0Y2ggPGNvZGU+KCgnWCd8J3gnKSAoJ00nfCdtJykNCisoJ0wnfCdsJykpPC9jb2RlPiwgYXJlIHJlc2VydmVkIGZvciBzdGFuZGFyZGl6YXRpb24gaW4gdGhpcyBvciBmdXR1cmUgdmVyc2lvbnMNCitvZiB0aGlzIHNwZWNpZmljYXRpb24uPC9wPiA8ZGl2IGNsYXNzPSJub3RlIj48cCBjbGFzcz0icHJlZml4Ij48Yj5Ob3RlOjwvYj48L3A+IDxwPlRoZQ0KK05hbWVzcGFjZXMgaW4gWE1MIFJlY29tbWVuZGF0aW9uIDxhIGhyZWY9IiN4bWwtbmFtZXMiPltYTUwgTmFtZXNdPC9hPiBhc3NpZ25zDQorYSBtZWFuaW5nIHRvIG5hbWVzIGNvbnRhaW5pbmcgY29sb24gY2hhcmFjdGVycy4gVGhlcmVmb3JlLCBhdXRob3JzIHNob3VsZA0KK25vdCB1c2UgdGhlIGNvbG9uIGluIFhNTCBuYW1lcyBleGNlcHQgZm9yIG5hbWVzcGFjZSBwdXJwb3NlcywgYnV0IFhNTCBwcm9jZXNzb3JzDQorbXVzdCBhY2NlcHQgdGhlIGNvbG9uIGFzIGEgbmFtZSBjaGFyYWN0ZXIuPC9wPiA8L2Rpdj4gPHA+QW4gPGEgaHJlZj0iI05ULU5tdG9rZW4iPk5tdG9rZW48L2E+DQorKG5hbWUgdG9rZW4pIGlzIGFueSBtaXh0dXJlIG9mIG5hbWUgY2hhcmFjdGVycy48L3A+IDxoNT5OYW1lcyBhbmQgVG9rZW5zPC9oNT48dGFibGUNCitjbGFzcz0ic2NyYXAiPjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULU5hbWVDaGFyIj48L2E+WzRdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+TmFtZUNoYXI8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULUxldHRlciI+TGV0dGVyPC9hPiB8IDxhIGhyZWY9IiNOVC1EaWdpdCI+RGlnaXQ8L2E+DQorfCAnLicgfCAnLScgfCAnXycgfCAnOicgfCA8YSBocmVmPSIjTlQtQ29tYmluaW5nQ2hhciI+Q29tYmluaW5nQ2hhcjwvYT4gfCA8YQ0KK2hyZWY9IiNOVC1FeHRlbmRlciI+RXh0ZW5kZXI8L2E+PC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULU5hbWUiPjwvYT5bNV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5OYW1lPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPig8YSBocmVmPSIjTlQtTGV0dGVyIj5MZXR0ZXI8L2E+IHwgJ18nIHwgJzonKSAoPGEgaHJlZj0iI05ULU5hbWVDaGFyIj5OYW1lQ2hhcjwvYT4pKjwvY29kZT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1OYW1lcyI+PC9hPls2XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPk5hbWVzPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiAoPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPikqPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULU5tdG9rZW4iPjwvYT5bN10mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5ObXRva2VuPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPig8YSBocmVmPSIjTlQtTmFtZUNoYXIiPk5hbWVDaGFyPC9hPikrPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULU5tdG9rZW5zIj48L2E+WzhdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+Tm10b2tlbnM8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULU5tdG9rZW4iPk5tdG9rZW48L2E+ICg8YSBocmVmPSIjTlQtUyI+UzwvYT4gPGEgaHJlZj0iI05ULU5tdG9rZW4iPk5tdG9rZW48L2E+KSo8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+TGl0ZXJhbCBkYXRhIGlzIGFueSBxdW90ZWQgc3RyaW5nIG5vdCBjb250YWluaW5nIHRoZSBxdW90YXRpb24NCittYXJrIHVzZWQgYXMgYSBkZWxpbWl0ZXIgZm9yIHRoYXQgc3RyaW5nLiBMaXRlcmFscyBhcmUgdXNlZCBmb3Igc3BlY2lmeWluZw0KK3RoZSBjb250ZW50IG9mIGludGVybmFsIGVudGl0aWVzICg8YSBocmVmPSIjTlQtRW50aXR5VmFsdWUiPkVudGl0eVZhbHVlPC9hPiksDQordGhlIHZhbHVlcyBvZiBhdHRyaWJ1dGVzICg8YSBocmVmPSIjTlQtQXR0VmFsdWUiPkF0dFZhbHVlPC9hPiksIGFuZCBleHRlcm5hbA0KK2lkZW50aWZpZXJzICg8YSBocmVmPSIjTlQtU3lzdGVtTGl0ZXJhbCI+U3lzdGVtTGl0ZXJhbDwvYT4pLiBOb3RlIHRoYXQgYSA8YQ0KK2hyZWY9IiNOVC1TeXN0ZW1MaXRlcmFsIj5TeXN0ZW1MaXRlcmFsPC9hPiBjYW4gYmUgcGFyc2VkIHdpdGhvdXQgc2Nhbm5pbmcNCitmb3IgbWFya3VwLjwvcD4gPGg1PkxpdGVyYWxzPC9oNT48dGFibGUgY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1FbnRpdHlWYWx1ZSI+PC9hPls5XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkVudGl0eVZhbHVlPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPiciJyAoW14lJmFtcDsiXSB8IDxhIGhyZWY9IiNOVC1QRVJlZmVyZW5jZSI+UEVSZWZlcmVuY2U8L2E+IHwgPGENCitocmVmPSIjTlQtUmVmZXJlbmNlIj5SZWZlcmVuY2U8L2E+KSogJyInIDwvY29kZT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48Y29kZT58Jm5ic3A7ICInIiAoW14lJmFtcDsnXSB8IDxhIGhyZWY9IiNOVC1QRVJlZmVyZW5jZSI+UEVSZWZlcmVuY2U8L2E+DQorfCA8YSBocmVmPSIjTlQtUmVmZXJlbmNlIj5SZWZlcmVuY2U8L2E+KSogIiciPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUF0dFZhbHVlIj48L2E+WzEwXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkF0dFZhbHVlPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPiciJyAoW14mbHQ7JmFtcDsiXSB8IDxhIGhyZWY9IiNOVC1SZWZlcmVuY2UiPlJlZmVyZW5jZTwvYT4pKiAnIicgPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxjb2RlPnwmbmJzcDsgIiciIChbXiZsdDsmYW1wOyddIHwgPGEgaHJlZj0iI05ULVJlZmVyZW5jZSI+UmVmZXJlbmNlPC9hPikqDQorIiciPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULVN5c3RlbUxpdGVyYWwiPjwvYT5bMTFdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+U3lzdGVtTGl0ZXJhbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4oJyInIFteIl0qICciJykgfCZuYnNwOygiJyIgW14nXSogIiciKSA8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtUHViaWRMaXRlcmFsIj48L2E+WzEyXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlB1YmlkTGl0ZXJhbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nIicgPGEgaHJlZj0iI05ULVB1YmlkQ2hhciI+UHViaWRDaGFyPC9hPiogJyInIHwgIiciICg8YSBocmVmPSIjTlQtUHViaWRDaGFyIj5QdWJpZENoYXI8L2E+DQorLSAiJyIpKiAiJyI8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtUHViaWRDaGFyIj48L2E+WzEzXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlB1YmlkQ2hhcjwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4jeDIwIHwgI3hEIHwgI3hBIHwmbmJzcDtbYS16QS1aMC05XSB8Jm5ic3A7Wy0nKCkrLC4vOj0/OyEqI0AkXyVdPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxkaXYgY2xhc3M9Im5vdGUiPjxwIGNsYXNzPSJwcmVmaXgiPjxiPk5vdGU6PC9iPjwvcD4gPHA+QWx0aG91Z2gNCit0aGUgPGEgaHJlZj0iI05ULUVudGl0eVZhbHVlIj5FbnRpdHlWYWx1ZTwvYT4gcHJvZHVjdGlvbiBhbGxvd3MgdGhlIGRlZmluaXRpb24NCitvZiBhbiBlbnRpdHkgY29uc2lzdGluZyBvZiBhIHNpbmdsZSBleHBsaWNpdCA8Y29kZT4mbHQ7PC9jb2RlPiBpbiB0aGUgbGl0ZXJhbA0KKyhlLmcuLCA8Y29kZT4mbHQ7IUVOVElUWSBteWx0ICImbHQ7Ij48L2NvZGU+KSwgaXQgaXMgc3Ryb25nbHkgYWR2aXNlZCB0byBhdm9pZA0KK3RoaXMgcHJhY3RpY2Ugc2luY2UgYW55IHJlZmVyZW5jZSB0byB0aGF0IGVudGl0eSB3aWxsIGNhdXNlIGEgd2VsbC1mb3JtZWRuZXNzDQorZXJyb3IuPC9wPiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic3ludGF4Ij48L2E+Mi40IENoYXJhY3Rlcg0KK0RhdGEgYW5kIE1hcmt1cDwvaDM+IDxwPjxhIHRpdGxlPSJUZXh0IiBocmVmPSIjZHQtdGV4dCI+VGV4dDwvYT4gY29uc2lzdHMNCitvZiBpbnRlcm1pbmdsZWQgPGEgdGl0bGU9IkNoYXJhY3RlciBEYXRhIiBocmVmPSIjZHQtY2hhcmRhdGEiPmNoYXJhY3RlciBkYXRhPC9hPg0KK2FuZCBtYXJrdXAuIFs8YSB0aXRsZT0iTWFya3VwIiBuYW1lPSJkdC1tYXJrdXAiPkRlZmluaXRpb248L2E+OiA8Yj5NYXJrdXA8L2I+DQordGFrZXMgdGhlIGZvcm0gb2YgPGEgdGl0bGU9IlN0YXJ0LVRhZyIgaHJlZj0iI2R0LXN0YWciPnN0YXJ0LXRhZ3M8L2E+LCA8YQ0KK3RpdGxlPSJFbmQgVGFnIiBocmVmPSIjZHQtZXRhZyI+ZW5kLXRhZ3M8L2E+LCA8YSB0aXRsZT0iRW1wdHkiIGhyZWY9IiNkdC1lbXB0eSI+ZW1wdHktZWxlbWVudA0KK3RhZ3M8L2E+LCA8YSB0aXRsZT0iRW50aXR5IFJlZmVyZW5jZSIgaHJlZj0iI2R0LWVudHJlZiI+ZW50aXR5IHJlZmVyZW5jZXM8L2E+LCA8YQ0KK3RpdGxlPSJDaGFyYWN0ZXIgUmVmZXJlbmNlIiBocmVmPSIjZHQtY2hhcnJlZiI+Y2hhcmFjdGVyIHJlZmVyZW5jZXM8L2E+LCA8YQ0KK3RpdGxlPSJDb21tZW50IiBocmVmPSIjZHQtY29tbWVudCI+Y29tbWVudHM8L2E+LCA8YSB0aXRsZT0iQ0RBVEEgU2VjdGlvbiINCitocmVmPSIjZHQtY2RzZWN0aW9uIj5DREFUQSBzZWN0aW9uPC9hPiBkZWxpbWl0ZXJzLCA8YSB0aXRsZT0iRG9jdW1lbnQgVHlwZSBEZWNsYXJhdGlvbiINCitocmVmPSIjZHQtZG9jdHlwZSI+ZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbnM8L2E+LCA8YSB0aXRsZT0iUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiINCitocmVmPSIjZHQtcGkiPnByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9hPiwgPGEgaHJlZj0iI05ULVhNTERlY2wiPlhNTCBkZWNsYXJhdGlvbnM8L2E+LCA8YQ0KK2hyZWY9IiNOVC1UZXh0RGVjbCI+dGV4dCBkZWNsYXJhdGlvbnM8L2E+LCBhbmQgYW55IHdoaXRlIHNwYWNlIHRoYXQgaXMgYXQNCit0aGUgdG9wIGxldmVsIG9mIHRoZSBkb2N1bWVudCBlbnRpdHkgKHRoYXQgaXMsIG91dHNpZGUgdGhlIGRvY3VtZW50IGVsZW1lbnQNCithbmQgbm90IGluc2lkZSBhbnkgb3RoZXIgbWFya3VwKS5dPC9wPiA8cD5bPGEgdGl0bGU9IkNoYXJhY3RlciBEYXRhIiBuYW1lPSJkdC1jaGFyZGF0YSI+RGVmaW5pdGlvbjwvYT46DQorQWxsIHRleHQgdGhhdCBpcyBub3QgbWFya3VwIGNvbnN0aXR1dGVzIHRoZSA8Yj5jaGFyYWN0ZXIgZGF0YTwvYj4gb2YgdGhlIGRvY3VtZW50Ll08L3A+IDxwPlRoZQ0KK2FtcGVyc2FuZCBjaGFyYWN0ZXIgKCZhbXA7KSBhbmQgdGhlIGxlZnQgYW5nbGUgYnJhY2tldCAoJmx0OykgbWF5IGFwcGVhciBpbg0KK3RoZWlyIGxpdGVyYWwgZm9ybSA8ZW0+b25seTwvZW0+IHdoZW4gdXNlZCBhcyBtYXJrdXAgZGVsaW1pdGVycywgb3Igd2l0aGluDQorYSA8YSB0aXRsZT0iQ29tbWVudCIgaHJlZj0iI2R0LWNvbW1lbnQiPmNvbW1lbnQ8L2E+LCBhIDxhIHRpdGxlPSJQcm9jZXNzaW5nIGluc3RydWN0aW9uIg0KK2hyZWY9IiNkdC1waSI+cHJvY2Vzc2luZyBpbnN0cnVjdGlvbjwvYT4sIG9yIGEgPGEgdGl0bGU9IkNEQVRBIFNlY3Rpb24iIGhyZWY9IiNkdC1jZHNlY3Rpb24iPkNEQVRBDQorc2VjdGlvbjwvYT4uICBJZiB0aGV5IGFyZSBuZWVkZWQgZWxzZXdoZXJlLCB0aGV5IG11c3QgYmUgPGEgdGl0bGU9ImVzY2FwZSINCitocmVmPSIjZHQtZXNjYXBlIj5lc2NhcGVkPC9hPiB1c2luZyBlaXRoZXIgPGEgdGl0bGU9IkNoYXJhY3RlciBSZWZlcmVuY2UiDQoraHJlZj0iI2R0LWNoYXJyZWYiPm51bWVyaWMgY2hhcmFjdGVyIHJlZmVyZW5jZXM8L2E+IG9yIHRoZSBzdHJpbmdzICI8Y29kZT4mYW1wO2FtcDs8L2NvZGU+Ig0KK2FuZCAiPGNvZGU+JmFtcDtsdDs8L2NvZGU+IiByZXNwZWN0aXZlbHkuIFRoZSByaWdodCBhbmdsZSBicmFja2V0ICg+KSBtYXkNCitiZSByZXByZXNlbnRlZCB1c2luZyB0aGUgc3RyaW5nICI8Y29kZT4mYW1wO2d0OzwvY29kZT4iLCBhbmQgbXVzdCwgPGEgdGl0bGU9IkZvciBDb21wYXRpYmlsaXR5Ig0KK2hyZWY9IiNkdC1jb21wYXQiPmZvciBjb21wYXRpYmlsaXR5PC9hPiwgYmUgZXNjYXBlZCB1c2luZyAiPGNvZGU+JmFtcDtndDs8L2NvZGU+Ig0KK29yIGEgY2hhcmFjdGVyIHJlZmVyZW5jZSB3aGVuIGl0IGFwcGVhcnMgaW4gdGhlIHN0cmluZyAiPGNvZGU+XV0mZ3Q7PC9jb2RlPiINCitpbiBjb250ZW50LCB3aGVuIHRoYXQgc3RyaW5nIGlzIG5vdCBtYXJraW5nIHRoZSBlbmQgb2YgYSA8YSB0aXRsZT0iQ0RBVEEgU2VjdGlvbiINCitocmVmPSIjZHQtY2RzZWN0aW9uIj5DREFUQSBzZWN0aW9uPC9hPi48L3A+IDxwPkluIHRoZSBjb250ZW50IG9mIGVsZW1lbnRzLA0KK2NoYXJhY3RlciBkYXRhIGlzIGFueSBzdHJpbmcgb2YgY2hhcmFjdGVycyB3aGljaCBkb2VzIG5vdCBjb250YWluIHRoZSBzdGFydC1kZWxpbWl0ZXINCitvZiBhbnkgbWFya3VwLiBJbiBhIENEQVRBIHNlY3Rpb24sIGNoYXJhY3RlciBkYXRhIGlzIGFueSBzdHJpbmcgb2YgY2hhcmFjdGVycw0KK25vdCBpbmNsdWRpbmcgdGhlIENEQVRBLXNlY3Rpb24tY2xvc2UgZGVsaW1pdGVyLCAiPGNvZGU+XV0mZ3Q7PC9jb2RlPiIuPC9wPiA8cD5Ubw0KK2FsbG93IGF0dHJpYnV0ZSB2YWx1ZXMgdG8gY29udGFpbiBib3RoIHNpbmdsZSBhbmQgZG91YmxlIHF1b3RlcywgdGhlIGFwb3N0cm9waGUNCitvciBzaW5nbGUtcXVvdGUgY2hhcmFjdGVyICgnKSBtYXkgYmUgcmVwcmVzZW50ZWQgYXMgIjxjb2RlPiZhbXA7YXBvczs8L2NvZGU+IiwNCithbmQgdGhlIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXIgKCIpIGFzICI8Y29kZT4mYW1wO3F1b3Q7PC9jb2RlPiIuPC9wPiA8aDU+Q2hhcmFjdGVyDQorRGF0YTwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtQ2hhckRhdGEiPjwvYT5bMTRdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+Q2hhckRhdGE8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+W14mbHQ7JmFtcDtdKiAtIChbXiZsdDsmYW1wO10qICddXSZndDsnIFteJmx0OyZhbXA7XSopPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9InNlYy1jb21tZW50cyI+PC9hPjIuNQ0KK0NvbW1lbnRzPC9oMz4gPHA+WzxhIHRpdGxlPSJDb21tZW50IiBuYW1lPSJkdC1jb21tZW50Ij5EZWZpbml0aW9uPC9hPjogPGI+Q29tbWVudHM8L2I+DQorbWF5IGFwcGVhciBhbnl3aGVyZSBpbiBhIGRvY3VtZW50IG91dHNpZGUgb3RoZXIgPGEgdGl0bGU9Ik1hcmt1cCIgaHJlZj0iI2R0LW1hcmt1cCI+bWFya3VwPC9hPjsNCitpbiBhZGRpdGlvbiwgdGhleSBtYXkgYXBwZWFyIHdpdGhpbiB0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBhdCBwbGFjZXMNCithbGxvd2VkIGJ5IHRoZSBncmFtbWFyLiBUaGV5IGFyZSBub3QgcGFydCBvZiB0aGUgZG9jdW1lbnQncyA8YSB0aXRsZT0iQ2hhcmFjdGVyIERhdGEiDQoraHJlZj0iI2R0LWNoYXJkYXRhIj5jaGFyYWN0ZXIgZGF0YTwvYT47IGFuIFhNTCBwcm9jZXNzb3IgbWF5LCBidXQgbmVlZCBub3QsDQorbWFrZSBpdCBwb3NzaWJsZSBmb3IgYW4gYXBwbGljYXRpb24gdG8gcmV0cmlldmUgdGhlIHRleHQgb2YgY29tbWVudHMuIDxhIHRpdGxlPSJGb3IgQ29tcGF0aWJpbGl0eSINCitocmVmPSIjZHQtY29tcGF0Ij5Gb3IgY29tcGF0aWJpbGl0eTwvYT4sIHRoZSBzdHJpbmcgIjxjb2RlPi0tPC9jb2RlPiIgKGRvdWJsZS1oeXBoZW4pDQorbXVzdCBub3Qgb2NjdXIgd2l0aGluIGNvbW1lbnRzLl0gUGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2VzIGFyZSBub3QgcmVjb2duaXplZA0KK3dpdGhpbiBjb21tZW50cy48L3A+IDxoNT5Db21tZW50czwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtQ29tbWVudCI+PC9hPlsxNV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5Db21tZW50PC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicmbHQ7IS0tJyAoKDxhIGhyZWY9IiNOVC1DaGFyIj5DaGFyPC9hPiAtICctJykgfCAoJy0nICg8YSBocmVmPSIjTlQtQ2hhciI+Q2hhcjwvYT4NCistICctJykpKSogJy0tPic8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+QW4gZXhhbXBsZSBvZiBhIGNvbW1lbnQ6PC9wPiA8dGFibGUgY2xhc3M9ImVnIiB3aWR0aD0iMTAwJSINCitib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0OyEtLSBkZWNsYXJhdGlvbnMgZm9yICZsdDtoZWFkPiAmYW1wOyAmbHQ7Ym9keT4gLS0+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDxwPk5vdGUgdGhhdCB0aGUgZ3JhbW1hciBkb2VzIG5vdCBhbGxvdyBhIGNvbW1lbnQgZW5kaW5nIGluIDxjb2RlPi0tLT48L2NvZGU+Lg0KK1RoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyA8ZW0+bm90PC9lbT4gd2VsbC1mb3JtZWQuPC9wPiA8dGFibGUgY2xhc3M9ImVnIiB3aWR0aD0iMTAwJSINCitib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0OyEtLSBCKywgQiwgb3IgQi0tLT48L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic2VjLXBpIj48L2E+Mi42IFByb2Nlc3NpbmcNCitJbnN0cnVjdGlvbnM8L2gzPiA8cD5bPGEgdGl0bGU9IlByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24iIG5hbWU9ImR0LXBpIj5EZWZpbml0aW9uPC9hPjogPGI+UHJvY2Vzc2luZw0KK2luc3RydWN0aW9uczwvYj4gKFBJcykgYWxsb3cgZG9jdW1lbnRzIHRvIGNvbnRhaW4gaW5zdHJ1Y3Rpb25zIGZvciBhcHBsaWNhdGlvbnMuXTwvcD4gPGg1PlByb2Nlc3NpbmcNCitJbnN0cnVjdGlvbnM8L2g1Pjx0YWJsZSBjbGFzcz0ic2NyYXAiPjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULVBJIj48L2E+WzE2XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlBJPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicmbHQ7PycgPGEgaHJlZj0iI05ULVBJVGFyZ2V0Ij5QSVRhcmdldDwvYT4gKDxhIGhyZWY9IiNOVC1TIj5TPC9hPg0KKyg8YSBocmVmPSIjTlQtQ2hhciI+Q2hhcjwvYT4qIC0gKDxhIGhyZWY9IiNOVC1DaGFyIj5DaGFyPC9hPiogJz8+JyA8YSBocmVmPSIjTlQtQ2hhciI+Q2hhcjwvYT4qKSkpPw0KKyc/Pic8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtUElUYXJnZXQiPjwvYT5bMTddJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+UElUYXJnZXQ8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IC0gKCgnWCcgfCAneCcpICgnTScgfCAnbScpICgnTCcgfCAnbCcpKTwvY29kZT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5QSXMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBkb2N1bWVudCdzIDxhIHRpdGxlPSJDaGFyYWN0ZXIgRGF0YSINCitocmVmPSIjZHQtY2hhcmRhdGEiPmNoYXJhY3RlciBkYXRhPC9hPiwgYnV0IG11c3QgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlDQorYXBwbGljYXRpb24uIFRoZSBQSSBiZWdpbnMgd2l0aCBhIHRhcmdldCAoPGEgaHJlZj0iI05ULVBJVGFyZ2V0Ij5QSVRhcmdldDwvYT4pDQordXNlZCB0byBpZGVudGlmeSB0aGUgYXBwbGljYXRpb24gdG8gd2hpY2ggdGhlIGluc3RydWN0aW9uIGlzIGRpcmVjdGVkLiBUaGUNCit0YXJnZXQgbmFtZXMgIjxjb2RlPlhNTDwvY29kZT4iLCAiPGNvZGU+eG1sPC9jb2RlPiIsIGFuZCBzbyBvbiBhcmUgcmVzZXJ2ZWQNCitmb3Igc3RhbmRhcmRpemF0aW9uIGluIHRoaXMgb3IgZnV0dXJlIHZlcnNpb25zIG9mIHRoaXMgc3BlY2lmaWNhdGlvbi4gVGhlDQorWE1MIDxhIHRpdGxlPSJOb3RhdGlvbiIgaHJlZj0iI2R0LW5vdGF0aW9uIj5Ob3RhdGlvbjwvYT4gbWVjaGFuaXNtIG1heSBiZQ0KK3VzZWQgZm9yIGZvcm1hbCBkZWNsYXJhdGlvbiBvZiBQSSB0YXJnZXRzLiBQYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZXMgYXJlDQorbm90IHJlY29nbml6ZWQgd2l0aGluIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGENCituYW1lPSJzZWMtY2RhdGEtc2VjdCI+PC9hPjIuNyBDREFUQSBTZWN0aW9uczwvaDM+IDxwPls8YSB0aXRsZT0iQ0RBVEEgU2VjdGlvbiINCituYW1lPSJkdC1jZHNlY3Rpb24iPkRlZmluaXRpb248L2E+OiA8Yj5DREFUQSBzZWN0aW9uczwvYj4gbWF5IG9jY3VyIGFueXdoZXJlDQorY2hhcmFjdGVyIGRhdGEgbWF5IG9jY3VyOyB0aGV5IGFyZSB1c2VkIHRvIGVzY2FwZSBibG9ja3Mgb2YgdGV4dCBjb250YWluaW5nDQorY2hhcmFjdGVycyB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUgcmVjb2duaXplZCBhcyBtYXJrdXAuIENEQVRBIHNlY3Rpb25zIGJlZ2luDQord2l0aCB0aGUgc3RyaW5nICI8Y29kZT4mbHQ7IVtDREFUQVs8L2NvZGU+IiBhbmQgZW5kIHdpdGggdGhlIHN0cmluZyAiPGNvZGU+XV0mZ3Q7PC9jb2RlPiI6XTwvcD4gPGg1PkNEQVRBDQorU2VjdGlvbnM8L2g1Pjx0YWJsZSBjbGFzcz0ic2NyYXAiPjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUNEU2VjdCI+PC9hPlsxOF0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5DRFNlY3Q8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULUNEU3RhcnQiPkNEU3RhcnQ8L2E+IDxhIGhyZWY9IiNOVC1DRGF0YSI+Q0RhdGE8L2E+IDxhDQoraHJlZj0iI05ULUNERW5kIj5DREVuZDwvYT48L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtQ0RTdGFydCI+PC9hPlsxOV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5DRFN0YXJ0PC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicmbHQ7IVtDREFUQVsnPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUNEYXRhIj48L2E+WzIwXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkNEYXRhPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPig8YSBocmVmPSIjTlQtQ2hhciI+Q2hhcjwvYT4qIC0gKDxhIGhyZWY9IiNOVC1DaGFyIj5DaGFyPC9hPiogJ11dJmd0OycgPGENCitocmVmPSIjTlQtQ2hhciI+Q2hhcjwvYT4qKSkgPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUNERW5kIj48L2E+WzIxXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkNERW5kPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPiddXSZndDsnPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxwPldpdGhpbiBhIENEQVRBIHNlY3Rpb24sIG9ubHkgdGhlIDxhIGhyZWY9IiNOVC1DREVuZCI+Q0RFbmQ8L2E+DQorc3RyaW5nIGlzIHJlY29nbml6ZWQgYXMgbWFya3VwLCBzbyB0aGF0IGxlZnQgYW5nbGUgYnJhY2tldHMgYW5kIGFtcGVyc2FuZHMNCittYXkgb2NjdXIgaW4gdGhlaXIgbGl0ZXJhbCBmb3JtOyB0aGV5IG5lZWQgbm90IChhbmQgY2Fubm90KSBiZSBlc2NhcGVkIHVzaW5nDQorIjxjb2RlPiZhbXA7bHQ7PC9jb2RlPiIgYW5kICI8Y29kZT4mYW1wO2FtcDs8L2NvZGU+Ii4gQ0RBVEEgc2VjdGlvbnMgY2Fubm90DQorbmVzdC48L3A+IDxwPkFuIGV4YW1wbGUgb2YgYSBDREFUQSBzZWN0aW9uLCBpbiB3aGljaCAiPGNvZGU+Jmx0O2dyZWV0aW5nPjwvY29kZT4iDQorYW5kICI8Y29kZT4mbHQ7L2dyZWV0aW5nPjwvY29kZT4iIGFyZSByZWNvZ25pemVkIGFzIDxhIHRpdGxlPSJDaGFyYWN0ZXIgRGF0YSINCitocmVmPSIjZHQtY2hhcmRhdGEiPmNoYXJhY3RlciBkYXRhPC9hPiwgbm90IDxhIHRpdGxlPSJNYXJrdXAiIGhyZWY9IiNkdC1tYXJrdXAiPm1hcmt1cDwvYT46PC9wPiA8dGFibGUNCitjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0OyFbQ0RBVEFbJmx0O2dyZWV0aW5nPkhlbGxvLCB3b3JsZCEmbHQ7L2dyZWV0aW5nPl1dJmd0OyA8L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic2VjLXByb2xvZy1kdGQiPjwvYT4yLjggUHJvbG9nDQorYW5kIERvY3VtZW50IFR5cGUgRGVjbGFyYXRpb248L2gzPiA8cD5bPGEgdGl0bGU9IlhNTCBEZWNsYXJhdGlvbiIgbmFtZT0iZHQteG1sZGVjbCI+RGVmaW5pdGlvbjwvYT46DQorWE1MIGRvY3VtZW50cyBzaG91bGQgYmVnaW4gd2l0aCBhbiA8Yj5YTUwgZGVjbGFyYXRpb248L2I+IHdoaWNoIHNwZWNpZmllcw0KK3RoZSB2ZXJzaW9uIG9mIFhNTCBiZWluZyB1c2VkLl0gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgaXMgYSBjb21wbGV0ZSBYTUwNCitkb2N1bWVudCwgPGEgdGl0bGU9IldlbGwtRm9ybWVkIiBocmVmPSIjZHQtd2VsbGZvcm1lZCI+d2VsbC1mb3JtZWQ8L2E+IGJ1dA0KK25vdCA8YSB0aXRsZT0iVmFsaWRpdHkiIGhyZWY9IiNkdC12YWxpZCI+dmFsaWQ8L2E+OjwvcD4gPHRhYmxlIGNsYXNzPSJlZyINCit3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDs/eG1sIHZlcnNpb249IjEuMCI/PiAmbHQ7Z3JlZXRpbmc+SGVsbG8sIHdvcmxkISZsdDsvZ3JlZXRpbmc+IDwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8cD5hbmQgc28gaXMgdGhpczo8L3A+IDx0YWJsZSBjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiDQorY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7Z3JlZXRpbmc+SGVsbG8sIHdvcmxkISZsdDsvZ3JlZXRpbmc+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDxwPlRoZSB2ZXJzaW9uIG51bWJlciAiPGNvZGU+MS4wPC9jb2RlPiIgc2hvdWxkIGJlIHVzZWQgdG8gaW5kaWNhdGUNCitjb25mb3JtYW5jZSB0byB0aGlzIHZlcnNpb24gb2YgdGhpcyBzcGVjaWZpY2F0aW9uOyBpdCBpcyBhbiBlcnJvciBmb3IgYSBkb2N1bWVudA0KK3RvIHVzZSB0aGUgdmFsdWUgIjxjb2RlPjEuMDwvY29kZT4iIGlmIGl0IGRvZXMgbm90IGNvbmZvcm0gdG8gdGhpcyB2ZXJzaW9uDQorb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiBJdCBpcyB0aGUgaW50ZW50IG9mIHRoZSBYTUwgd29ya2luZyBncm91cCB0byBnaXZlIGxhdGVyDQordmVyc2lvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uIG51bWJlcnMgb3RoZXIgdGhhbiAiPGNvZGU+MS4wPC9jb2RlPiIsIGJ1dA0KK3RoaXMgaW50ZW50IGRvZXMgbm90IGluZGljYXRlIGEgY29tbWl0bWVudCB0byBwcm9kdWNlIGFueSBmdXR1cmUgdmVyc2lvbnMNCitvZiBYTUwsIG5vciBpZiBhbnkgYXJlIHByb2R1Y2VkLCB0byB1c2UgYW55IHBhcnRpY3VsYXIgbnVtYmVyaW5nIHNjaGVtZS4gU2luY2UNCitmdXR1cmUgdmVyc2lvbnMgYXJlIG5vdCBydWxlZCBvdXQsIHRoaXMgY29uc3RydWN0IGlzIHByb3ZpZGVkIGFzIGEgbWVhbnMgdG8NCithbGxvdyB0aGUgcG9zc2liaWxpdHkgb2YgYXV0b21hdGljIHZlcnNpb24gcmVjb2duaXRpb24sIHNob3VsZCBpdCBiZWNvbWUgbmVjZXNzYXJ5Lg0KK1Byb2Nlc3NvcnMgbWF5IHNpZ25hbCBhbiBlcnJvciBpZiB0aGV5IHJlY2VpdmUgZG9jdW1lbnRzIGxhYmVsZWQgd2l0aCB2ZXJzaW9ucw0KK3RoZXkgZG8gbm90IHN1cHBvcnQuPC9wPiA8cD5UaGUgZnVuY3Rpb24gb2YgdGhlIG1hcmt1cCBpbiBhbiBYTUwgZG9jdW1lbnQNCitpcyB0byBkZXNjcmliZSBpdHMgc3RvcmFnZSBhbmQgbG9naWNhbCBzdHJ1Y3R1cmUgYW5kIHRvIGFzc29jaWF0ZSBhdHRyaWJ1dGUtdmFsdWUNCitwYWlycyB3aXRoIGl0cyBsb2dpY2FsIHN0cnVjdHVyZXMuIFhNTCBwcm92aWRlcyBhIG1lY2hhbmlzbSwgdGhlIDxhIHRpdGxlPSJEb2N1bWVudCBUeXBlIERlY2xhcmF0aW9uIg0KK2hyZWY9IiNkdC1kb2N0eXBlIj5kb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uPC9hPiwgdG8gZGVmaW5lIGNvbnN0cmFpbnRzIG9uDQordGhlIGxvZ2ljYWwgc3RydWN0dXJlIGFuZCB0byBzdXBwb3J0IHRoZSB1c2Ugb2YgcHJlZGVmaW5lZCBzdG9yYWdlIHVuaXRzLg0KK1s8YSB0aXRsZT0iVmFsaWRpdHkiIG5hbWU9ImR0LXZhbGlkIj5EZWZpbml0aW9uPC9hPjogQW4gWE1MIGRvY3VtZW50IGlzIDxiPnZhbGlkPC9iPg0KK2lmIGl0IGhhcyBhbiBhc3NvY2lhdGVkIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gYW5kIGlmIHRoZSBkb2N1bWVudCBjb21wbGllcw0KK3dpdGggdGhlIGNvbnN0cmFpbnRzIGV4cHJlc3NlZCBpbiBpdC5dPC9wPiA8cD5UaGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbg0KK211c3QgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3QgPGEgdGl0bGU9IkVsZW1lbnQiIGhyZWY9IiNkdC1lbGVtZW50Ij5lbGVtZW50PC9hPg0KK2luIHRoZSBkb2N1bWVudC48L3A+IDxoNT5Qcm9sb2c8L2g1Pjx0YWJsZSBjbGFzcz0ic2NyYXAiPjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULXByb2xvZyI+PC9hPlsyMl0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5wcm9sb2c8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULVhNTERlY2wiPlhNTERlY2w8L2E+PyA8YSBocmVmPSIjTlQtTWlzYyI+TWlzYzwvYT4qDQorKDxhIGhyZWY9IiNOVC1kb2N0eXBlZGVjbCI+ZG9jdHlwZWRlY2w8L2E+IDxhIGhyZWY9IiNOVC1NaXNjIj5NaXNjPC9hPiopPzwvY29kZT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1YTUxEZWNsIj48L2E+WzIzXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlhNTERlY2w8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+JyZsdDs/eG1sJyA8YSBocmVmPSIjTlQtVmVyc2lvbkluZm8iPlZlcnNpb25JbmZvPC9hPiA8YSBocmVmPSIjTlQtRW5jb2RpbmdEZWNsIj5FbmNvZGluZ0RlY2w8L2E+PyA8YQ0KK2hyZWY9IiNOVC1TRERlY2wiPlNERGVjbDwvYT4/IDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gJz8+JzwvY29kZT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1WZXJzaW9uSW5mbyI+PC9hPlsyNF0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5WZXJzaW9uSW5mbzwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtUyI+UzwvYT4gJ3ZlcnNpb24nIDxhIGhyZWY9IiNOVC1FcSI+RXE8L2E+ICgiJyIgPGENCitocmVmPSIjTlQtVmVyc2lvbk51bSI+VmVyc2lvbk51bTwvYT4gIiciIHwgJyInIDxhIGhyZWY9IiNOVC1WZXJzaW9uTnVtIj5WZXJzaW9uTnVtPC9hPg0KKyciJyk8aT4vKiAgKi88L2k+PC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUVxIj48L2E+WzI1XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkVxPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gJz0nIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj88L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtVmVyc2lvbk51bSI+PC9hPlsyNl0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5WZXJzaW9uTnVtPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPihbYS16QS1aMC05Xy46XSB8ICctJykrPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULU1pc2MiPjwvYT5bMjddJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+TWlzYzwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtQ29tbWVudCI+Q29tbWVudDwvYT4gfCA8YSBocmVmPSIjTlQtUEkiPlBJPC9hPiB8IDxhDQoraHJlZj0iI05ULVMiPlM8L2E+PC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxwPls8YSB0aXRsZT0iRG9jdW1lbnQgVHlwZSBEZWNsYXJhdGlvbiIgbmFtZT0iZHQtZG9jdHlwZSI+RGVmaW5pdGlvbjwvYT46DQorVGhlIFhNTCA8Yj5kb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uPC9iPiBjb250YWlucyBvciBwb2ludHMgdG8gPGEgdGl0bGU9Im1hcmt1cCBkZWNsYXJhdGlvbiINCitocmVmPSIjZHQtbWFya3VwZGVjbCI+bWFya3VwIGRlY2xhcmF0aW9uczwvYT4gdGhhdCBwcm92aWRlIGEgZ3JhbW1hciBmb3IgYQ0KK2NsYXNzIG9mIGRvY3VtZW50cy4gVGhpcyBncmFtbWFyIGlzIGtub3duIGFzIGEgZG9jdW1lbnQgdHlwZSBkZWZpbml0aW9uLCBvciA8Yj5EVEQ8L2I+Lg0KK1RoZSBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uIGNhbiBwb2ludCB0byBhbiBleHRlcm5hbCBzdWJzZXQgKGEgc3BlY2lhbCBraW5kDQorb2YgPGEgdGl0bGU9IkV4dGVybmFsIEVudGl0eSIgaHJlZj0iI2R0LWV4dGVudCI+ZXh0ZXJuYWwgZW50aXR5PC9hPikgY29udGFpbmluZw0KK21hcmt1cCBkZWNsYXJhdGlvbnMsIG9yIGNhbiBjb250YWluIHRoZSBtYXJrdXAgZGVjbGFyYXRpb25zIGRpcmVjdGx5IGluIGFuDQoraW50ZXJuYWwgc3Vic2V0LCBvciBjYW4gZG8gYm90aC4gVGhlIERURCBmb3IgYSBkb2N1bWVudCBjb25zaXN0cyBvZiBib3RoIHN1YnNldHMNCit0YWtlbiB0b2dldGhlci5dPC9wPiA8cD5bPGEgdGl0bGU9Im1hcmt1cCBkZWNsYXJhdGlvbiIgbmFtZT0iZHQtbWFya3VwZGVjbCI+RGVmaW5pdGlvbjwvYT46DQorIEEgPGI+bWFya3VwIGRlY2xhcmF0aW9uPC9iPiBpcyBhbiA8YSB0aXRsZT0iRWxlbWVudCBUeXBlIGRlY2xhcmF0aW9uIiBocmVmPSIjZHQtZWxkZWNsIj5lbGVtZW50DQordHlwZSBkZWNsYXJhdGlvbjwvYT4sIGFuIDxhIHRpdGxlPSJBdHRyaWJ1dGUtTGlzdCBEZWNsYXJhdGlvbiIgaHJlZj0iI2R0LWF0dGRlY2wiPmF0dHJpYnV0ZS1saXN0DQorZGVjbGFyYXRpb248L2E+LCBhbiA8YSB0aXRsZT0iZW50aXR5IGRlY2xhcmF0aW9uIiBocmVmPSIjZHQtZW50ZGVjbCI+ZW50aXR5DQorZGVjbGFyYXRpb248L2E+LCBvciBhIDxhIHRpdGxlPSJOb3RhdGlvbiBEZWNsYXJhdGlvbiIgaHJlZj0iI2R0LW5vdGRlY2wiPm5vdGF0aW9uDQorZGVjbGFyYXRpb248L2E+Ll0gVGhlc2UgZGVjbGFyYXRpb25zIG1heSBiZSBjb250YWluZWQgaW4gd2hvbGUgb3IgaW4gcGFydA0KK3dpdGhpbiA8YSB0aXRsZT0iUGFyYW1ldGVyIGVudGl0eSIgaHJlZj0iI2R0LVBFIj5wYXJhbWV0ZXIgZW50aXRpZXM8L2E+LCBhcw0KK2Rlc2NyaWJlZCBpbiB0aGUgd2VsbC1mb3JtZWRuZXNzIGFuZCB2YWxpZGl0eSBjb25zdHJhaW50cyBiZWxvdy4gRm9yIGZ1cnRoZXINCitpbmZvcm1hdGlvbiwgc2VlIDxhIGhyZWY9IiNzZWMtcGh5c2ljYWwtc3RydWN0Ij48Yj40IFBoeXNpY2FsIFN0cnVjdHVyZXM8L2I+PC9hPi48L3A+IDxoNT5Eb2N1bWVudA0KK1R5cGUgRGVmaW5pdGlvbjwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtZG9jdHlwZWRlY2wiPjwvYT5bMjhdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+ZG9jdHlwZWRlY2w8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+JyZsdDshRE9DVFlQRScgPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPg0KKyg8YSBocmVmPSIjTlQtUyI+UzwvYT4gPGEgaHJlZj0iI05ULUV4dGVybmFsSUQiPkV4dGVybmFsSUQ8L2E+KT8gPGEgaHJlZj0iI05ULVMiPlM8L2E+Pw0KKygnWycgKDxhIGhyZWY9IiNOVC1tYXJrdXBkZWNsIj5tYXJrdXBkZWNsPC9hPiB8IDxhIGhyZWY9IiNOVC1EZWNsU2VwIj5EZWNsU2VwPC9hPikqDQorJ10nIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8pPyAnPic8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI3ZjLXJvb3R0eXBlIj5bVkM6IFJvb3QgRWxlbWVudCBUeXBlXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjRXh0U3Vic2V0Ij5bV0ZDOiBFeHRlcm5hbCBTdWJzZXRdPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxpPi8qICAqLzwvaT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1EZWNsU2VwIj48L2E+WzI4YV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5EZWNsU2VwPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1QRVJlZmVyZW5jZSI+UEVSZWZlcmVuY2U8L2E+IHwgPGEgaHJlZj0iI05ULVMiPlM8L2E+PC9jb2RlPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiNQRS1iZXR3ZWVuLURlY2xzIj5bV0ZDOiBQRSBCZXR3ZWVuIERlY2xhcmF0aW9uc108L2E+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGk+LyogICovPC9pPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULW1hcmt1cGRlY2wiPjwvYT5bMjldJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+bWFya3VwZGVjbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtZWxlbWVudGRlY2wiPmVsZW1lbnRkZWNsPC9hPiB8IDxhIGhyZWY9IiNOVC1BdHRsaXN0RGVjbCI+QXR0bGlzdERlY2w8L2E+DQorfCA8YSBocmVmPSIjTlQtRW50aXR5RGVjbCI+RW50aXR5RGVjbDwvYT4gfCA8YSBocmVmPSIjTlQtTm90YXRpb25EZWNsIj5Ob3RhdGlvbkRlY2w8L2E+DQorfCA8YSBocmVmPSIjTlQtUEkiPlBJPC9hPiB8IDxhIGhyZWY9IiNOVC1Db21tZW50Ij5Db21tZW50PC9hPiA8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI3ZjLVBFaW5NYXJrdXBEZWNsIj5bVkM6IFByb3BlciBEZWNsYXJhdGlvbi9QRSBOZXN0aW5nXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjd2ZjLVBFaW5JbnRlcm5hbFN1YnNldCI+W1dGQzogUEVzIGluIEludGVybmFsIFN1YnNldF08L2E+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+Tm90ZSB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGNvbnN0cnVjdCBhIHdlbGwtZm9ybWVkIGRvY3VtZW50DQorY29udGFpbmluZyBhIDxhIGhyZWY9IiNOVC1kb2N0eXBlZGVjbCI+ZG9jdHlwZWRlY2w8L2E+IHRoYXQgbmVpdGhlciBwb2ludHMNCit0byBhbiBleHRlcm5hbCBzdWJzZXQgbm9yIGNvbnRhaW5zIGFuIGludGVybmFsIHN1YnNldC48L3A+IDxwPlRoZSBtYXJrdXAgZGVjbGFyYXRpb25zDQorbWF5IGJlIG1hZGUgdXAgaW4gd2hvbGUgb3IgaW4gcGFydCBvZiB0aGUgPGEgdGl0bGU9IlJlcGxhY2VtZW50IFRleHQiIGhyZWY9IiNkdC1yZXBsdGV4dCI+cmVwbGFjZW1lbnQNCit0ZXh0PC9hPiBvZiA8YSB0aXRsZT0iUGFyYW1ldGVyIGVudGl0eSIgaHJlZj0iI2R0LVBFIj5wYXJhbWV0ZXIgZW50aXRpZXM8L2E+Lg0KK1RoZSBwcm9kdWN0aW9ucyBsYXRlciBpbiB0aGlzIHNwZWNpZmljYXRpb24gZm9yIGluZGl2aWR1YWwgbm9udGVybWluYWxzICg8YQ0KK2hyZWY9IiNOVC1lbGVtZW50ZGVjbCI+ZWxlbWVudGRlY2w8L2E+LCA8YSBocmVmPSIjTlQtQXR0bGlzdERlY2wiPkF0dGxpc3REZWNsPC9hPiwNCithbmQgc28gb24pIGRlc2NyaWJlIHRoZSBkZWNsYXJhdGlvbnMgPGVtPmFmdGVyPC9lbT4gYWxsIHRoZSBwYXJhbWV0ZXIgZW50aXRpZXMNCitoYXZlIGJlZW4gPGEgdGl0bGU9IkluY2x1ZGUiIGhyZWY9IiNkdC1pbmNsdWRlIj5pbmNsdWRlZDwvYT4uPC9wPiA8cD5QYXJhbWV0ZXINCitlbnRpdHkgcmVmZXJlbmNlcyBhcmUgcmVjb2duaXplZCBhbnl3aGVyZSBpbiB0aGUgRFREIChpbnRlcm5hbCBhbmQgZXh0ZXJuYWwNCitzdWJzZXRzIGFuZCBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMpLCBleGNlcHQgaW4gbGl0ZXJhbHMsIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zLA0KK2NvbW1lbnRzLCBhbmQgdGhlIGNvbnRlbnRzIG9mIGlnbm9yZWQgY29uZGl0aW9uYWwgc2VjdGlvbnMgKHNlZSA8YSBocmVmPSIjc2VjLWNvbmRpdGlvbi1zZWN0Ij48Yj4zLjQNCitDb25kaXRpb25hbCBTZWN0aW9uczwvYj48L2E+KS4gVGhleSBhcmUgYWxzbyByZWNvZ25pemVkIGluIGVudGl0eSB2YWx1ZSBsaXRlcmFscy4NCitUaGUgdXNlIG9mIHBhcmFtZXRlciBlbnRpdGllcyBpbiB0aGUgaW50ZXJuYWwgc3Vic2V0IGlzIHJlc3RyaWN0ZWQgYXMgZGVzY3JpYmVkDQorYmVsb3cuPC9wPiA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJ2Yy1yb290dHlwZSI+PC9hPjxiPlZhbGlkaXR5DQorY29uc3RyYWludDogUm9vdCBFbGVtZW50IFR5cGU8L2I+PC9wPjxwPlRoZSA8YSBocmVmPSIjTlQtTmFtZSI+TmFtZTwvYT4gaW4NCit0aGUgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbiBtdXN0IG1hdGNoIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIDxhIHRpdGxlPSJSb290IEVsZW1lbnQiDQoraHJlZj0iI2R0LXJvb3QiPnJvb3QgZWxlbWVudDwvYT4uPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz0iY29uc3RyYWludCI+PHAgY2xhc3M9InByZWZpeCI+PGENCituYW1lPSJ2Yy1QRWluTWFya3VwRGVjbCI+PC9hPjxiPlZhbGlkaXR5IGNvbnN0cmFpbnQ6IFByb3BlciBEZWNsYXJhdGlvbi9QRQ0KK05lc3Rpbmc8L2I+PC9wPiA8cD5QYXJhbWV0ZXItZW50aXR5IDxhIHRpdGxlPSJSZXBsYWNlbWVudCBUZXh0IiBocmVmPSIjZHQtcmVwbHRleHQiPnJlcGxhY2VtZW50DQordGV4dDwvYT4gbXVzdCBiZSBwcm9wZXJseSBuZXN0ZWQgd2l0aCBtYXJrdXAgZGVjbGFyYXRpb25zLiBUaGF0IGlzIHRvIHNheSwNCitpZiBlaXRoZXIgdGhlIGZpcnN0IGNoYXJhY3RlciBvciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgYSBtYXJrdXAgZGVjbGFyYXRpb24NCisoPGEgaHJlZj0iI05ULW1hcmt1cGRlY2wiPm1hcmt1cGRlY2w8L2E+IGFib3ZlKSBpcyBjb250YWluZWQgaW4gdGhlIHJlcGxhY2VtZW50DQordGV4dCBmb3IgYSA8YSB0aXRsZT0iUGFyYW1ldGVyLWVudGl0eSByZWZlcmVuY2UiIGhyZWY9IiNkdC1QRVJlZiI+cGFyYW1ldGVyLWVudGl0eQ0KK3JlZmVyZW5jZTwvYT4sIGJvdGggbXVzdCBiZSBjb250YWluZWQgaW4gdGhlIHNhbWUgcmVwbGFjZW1lbnQgdGV4dC48L3A+IDwvZGl2PiA8ZGl2DQorY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhIG5hbWU9IndmYy1QRWluSW50ZXJuYWxTdWJzZXQiPjwvYT48Yj5XZWxsLWZvcm1lZG5lc3MNCitjb25zdHJhaW50OiBQRXMgaW4gSW50ZXJuYWwgU3Vic2V0PC9iPjwvcD48cD5JbiB0aGUgaW50ZXJuYWwgRFREIHN1YnNldCwgPGENCit0aXRsZT0iUGFyYW1ldGVyLWVudGl0eSByZWZlcmVuY2UiIGhyZWY9IiNkdC1QRVJlZiI+cGFyYW1ldGVyLWVudGl0eSByZWZlcmVuY2VzPC9hPg0KK2NhbiBvY2N1ciBvbmx5IHdoZXJlIG1hcmt1cCBkZWNsYXJhdGlvbnMgY2FuIG9jY3VyLCBub3Qgd2l0aGluIG1hcmt1cCBkZWNsYXJhdGlvbnMuDQorKFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gcmVmZXJlbmNlcyB0aGF0IG9jY3VyIGluIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdGllcw0KK29yIHRvIHRoZSBleHRlcm5hbCBzdWJzZXQuKTwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhDQorbmFtZT0iRXh0U3Vic2V0Ij48L2E+PGI+V2VsbC1mb3JtZWRuZXNzIGNvbnN0cmFpbnQ6IEV4dGVybmFsIFN1YnNldDwvYj48L3A+PHA+VGhlDQorZXh0ZXJuYWwgc3Vic2V0LCBpZiBhbnksIG11c3QgbWF0Y2ggdGhlIHByb2R1Y3Rpb24gZm9yIDxhIGhyZWY9IiNOVC1leHRTdWJzZXQiPmV4dFN1YnNldDwvYT4uPC9wPiA8L2Rpdj4gPGRpdg0KK2NsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJQRS1iZXR3ZWVuLURlY2xzIj48L2E+PGI+V2VsbC1mb3JtZWRuZXNzDQorY29uc3RyYWludDogUEUgQmV0d2VlbiBEZWNsYXJhdGlvbnM8L2I+PC9wPjxwPlRoZSByZXBsYWNlbWVudCB0ZXh0IG9mIGEgcGFyYW1ldGVyDQorZW50aXR5IHJlZmVyZW5jZSBpbiBhIDxhIGhyZWY9IiNOVC1EZWNsU2VwIj5EZWNsU2VwPC9hPiBtdXN0IG1hdGNoIHRoZSBwcm9kdWN0aW9uIDxhDQoraHJlZj0iI05ULWV4dFN1YnNldERlY2wiPmV4dFN1YnNldERlY2w8L2E+LjwvcD4gPC9kaXY+IDxwPkxpa2UgdGhlIGludGVybmFsDQorc3Vic2V0LCB0aGUgZXh0ZXJuYWwgc3Vic2V0IGFuZCBhbnkgZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzIHJlZmVyZW5jZWQNCitpbiBhIDxhIGhyZWY9IiNOVC1EZWNsU2VwIj5EZWNsU2VwPC9hPiBtdXN0IGNvbnNpc3Qgb2YgYSBzZXJpZXMgb2YgY29tcGxldGUNCittYXJrdXAgZGVjbGFyYXRpb25zIG9mIHRoZSB0eXBlcyBhbGxvd2VkIGJ5IHRoZSBub24tdGVybWluYWwgc3ltYm9sIDxhIGhyZWY9IiNOVC1tYXJrdXBkZWNsIj5tYXJrdXBkZWNsPC9hPiwNCitpbnRlcnNwZXJzZWQgd2l0aCB3aGl0ZSBzcGFjZSBvciA8YSB0aXRsZT0iUGFyYW1ldGVyLWVudGl0eSByZWZlcmVuY2UiIGhyZWY9IiNkdC1QRVJlZiI+cGFyYW1ldGVyLWVudGl0eQ0KK3JlZmVyZW5jZXM8L2E+LiBIb3dldmVyLCBwb3J0aW9ucyBvZiB0aGUgY29udGVudHMgb2YgdGhlIGV4dGVybmFsIHN1YnNldCBvcg0KK29mIHRoZXNlICBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMgbWF5IGNvbmRpdGlvbmFsbHkgYmUgaWdub3JlZCBieSB1c2luZw0KK3RoZSA8YSB0aXRsZT0iY29uZGl0aW9uYWwgc2VjdGlvbiIgaHJlZj0iI2R0LWNvbmQtc2VjdGlvbiI+Y29uZGl0aW9uYWwgc2VjdGlvbjwvYT4NCitjb25zdHJ1Y3Q7IHRoaXMgaXMgbm90IGFsbG93ZWQgaW4gdGhlIGludGVybmFsIHN1YnNldC48L3A+IDxoNT5FeHRlcm5hbCBTdWJzZXQ8L2g1Pjx0YWJsZQ0KK2NsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtZXh0U3Vic2V0Ij48L2E+WzMwXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPmV4dFN1YnNldDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtVGV4dERlY2wiPlRleHREZWNsPC9hPj8gPGEgaHJlZj0iI05ULWV4dFN1YnNldERlY2wiPmV4dFN1YnNldERlY2w8L2E+PC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULWV4dFN1YnNldERlY2wiPjwvYT5bMzFdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+ZXh0U3Vic2V0RGVjbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4oIDxhIGhyZWY9IiNOVC1tYXJrdXBkZWNsIj5tYXJrdXBkZWNsPC9hPiB8IDxhIGhyZWY9IiNOVC1jb25kaXRpb25hbFNlY3QiPmNvbmRpdGlvbmFsU2VjdDwvYT4NCit8IDxhIGhyZWY9IiNOVC1EZWNsU2VwIj5EZWNsU2VwPC9hPikqPC9jb2RlPjwvdGQ+DQorPHRkPjxpPi8qICAqLzwvaT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5UaGUgZXh0ZXJuYWwgc3Vic2V0IGFuZCBleHRlcm5hbCBwYXJhbWV0ZXIgZW50aXRpZXMgYWxzbw0KK2RpZmZlciBmcm9tIHRoZSBpbnRlcm5hbCBzdWJzZXQgaW4gdGhhdCBpbiB0aGVtLCA8YSB0aXRsZT0iUGFyYW1ldGVyLWVudGl0eSByZWZlcmVuY2UiDQoraHJlZj0iI2R0LVBFUmVmIj5wYXJhbWV0ZXItZW50aXR5IHJlZmVyZW5jZXM8L2E+IGFyZSBwZXJtaXR0ZWQgPGVtPndpdGhpbjwvZW0+DQorbWFya3VwIGRlY2xhcmF0aW9ucywgbm90IG9ubHkgPGVtPmJldHdlZW48L2VtPiBtYXJrdXAgZGVjbGFyYXRpb25zLjwvcD4gPHA+QW4NCitleGFtcGxlIG9mIGFuIFhNTCBkb2N1bWVudCB3aXRoIGEgZG9jdW1lbnQgdHlwZSBkZWNsYXJhdGlvbjo8L3A+IDx0YWJsZSBjbGFzcz0iZWciDQord2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPz4gJmx0OyFET0NUWVBFIGdyZWV0aW5nIFNZU1RFTSAiaGVsbG8uZHRkIj4gJmx0O2dyZWV0aW5nPkhlbGxvLCB3b3JsZCEmbHQ7L2dyZWV0aW5nPiA8L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPHA+VGhlIDxhIHRpdGxlPSJTeXN0ZW0gSWRlbnRpZmllciIgaHJlZj0iI2R0LXN5c2lkIj5zeXN0ZW0gaWRlbnRpZmllcjwvYT4NCisiPGNvZGU+aGVsbG8uZHRkPC9jb2RlPiIgZ2l2ZXMgdGhlIGFkZHJlc3MgKGEgVVJJIHJlZmVyZW5jZSkgb2YgYSBEVEQgZm9yDQordGhlIGRvY3VtZW50LjwvcD4gPHA+VGhlIGRlY2xhcmF0aW9ucyBjYW4gYWxzbyBiZSBnaXZlbiBsb2NhbGx5LCBhcyBpbiB0aGlzDQorZXhhbXBsZTo8L3A+IDx0YWJsZSBjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0Oz94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiID8+DQorJmx0OyFET0NUWVBFIGdyZWV0aW5nIFsNCisgICZsdDshRUxFTUVOVCBncmVldGluZyAoI1BDREFUQSk+DQorXT4NCismbHQ7Z3JlZXRpbmc+SGVsbG8sIHdvcmxkISZsdDsvZ3JlZXRpbmc+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDxwPklmIGJvdGggdGhlIGV4dGVybmFsIGFuZCBpbnRlcm5hbCBzdWJzZXRzIGFyZSB1c2VkLCB0aGUgaW50ZXJuYWwNCitzdWJzZXQgaXMgY29uc2lkZXJlZCB0byBvY2N1ciBiZWZvcmUgdGhlIGV4dGVybmFsIHN1YnNldC4gIFRoaXMgaGFzIHRoZSBlZmZlY3QNCit0aGF0IGVudGl0eSBhbmQgYXR0cmlidXRlLWxpc3QgZGVjbGFyYXRpb25zIGluIHRoZSBpbnRlcm5hbCBzdWJzZXQgdGFrZSBwcmVjZWRlbmNlDQorb3ZlciB0aG9zZSBpbiB0aGUgZXh0ZXJuYWwgc3Vic2V0LjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic2VjLXJtZCI+PC9hPjIuOQ0KK1N0YW5kYWxvbmUgRG9jdW1lbnQgRGVjbGFyYXRpb248L2gzPiA8cD5NYXJrdXAgZGVjbGFyYXRpb25zIGNhbiBhZmZlY3QgdGhlDQorY29udGVudCBvZiB0aGUgZG9jdW1lbnQsIGFzIHBhc3NlZCBmcm9tIGFuIDxhIHRpdGxlPSJYTUwgUHJvY2Vzc29yIiBocmVmPSIjZHQteG1sLXByb2MiPlhNTA0KK3Byb2Nlc3NvcjwvYT4gdG8gYW4gYXBwbGljYXRpb247IGV4YW1wbGVzIGFyZSBhdHRyaWJ1dGUgZGVmYXVsdHMgYW5kIGVudGl0eQ0KK2RlY2xhcmF0aW9ucy4gVGhlIHN0YW5kYWxvbmUgZG9jdW1lbnQgZGVjbGFyYXRpb24sIHdoaWNoIG1heSBhcHBlYXIgYXMgYSBjb21wb25lbnQNCitvZiB0aGUgWE1MIGRlY2xhcmF0aW9uLCBzaWduYWxzIHdoZXRoZXIgb3Igbm90IHRoZXJlIGFyZSBzdWNoIGRlY2xhcmF0aW9ucw0KK3doaWNoIGFwcGVhciBleHRlcm5hbCB0byB0aGUgPGEgdGl0bGU9IkRvY3VtZW50IEVudGl0eSIgaHJlZj0iI2R0LWRvY2VudCI+ZG9jdW1lbnQNCitlbnRpdHk8L2E+IG9yIGluIHBhcmFtZXRlciBlbnRpdGllcy4gWzxhIHRpdGxlPSJFeHRlcm5hbCBNYXJrdXAgRGVjbGFyYXRpb24iDQorbmFtZT0iZHQtZXh0bWtwZGVjbCI+RGVmaW5pdGlvbjwvYT46IEFuIDxiPmV4dGVybmFsIG1hcmt1cCBkZWNsYXJhdGlvbjwvYj4NCitpcyBkZWZpbmVkIGFzIGEgbWFya3VwIGRlY2xhcmF0aW9uIG9jY3VycmluZyBpbiB0aGUgZXh0ZXJuYWwgc3Vic2V0IG9yIGluDQorYSBwYXJhbWV0ZXIgZW50aXR5IChleHRlcm5hbCBvciBpbnRlcm5hbCwgdGhlIGxhdHRlciBiZWluZyBpbmNsdWRlZCBiZWNhdXNlDQorbm9uLXZhbGlkYXRpbmcgcHJvY2Vzc29ycyBhcmUgbm90IHJlcXVpcmVkIHRvIHJlYWQgdGhlbSkuXTwvcD4gPGg1PlN0YW5kYWxvbmUNCitEb2N1bWVudCBEZWNsYXJhdGlvbjwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtU0REZWNsIj48L2E+WzMyXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlNERGVjbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4gPGEgaHJlZj0iI05ULVMiPlM8L2E+ICdzdGFuZGFsb25lJyA8YSBocmVmPSIjTlQtRXEiPkVxPC9hPiAoKCInIg0KKygneWVzJyB8ICdubycpICInIikgfCAoJyInICgneWVzJyB8ICdubycpICciJykpIDwvY29kZT48L3RkPg0KKzx0ZD48YSBocmVmPSIjdmMtY2hlY2stcm1kIj5bVkM6IFN0YW5kYWxvbmUgRG9jdW1lbnQgRGVjbGFyYXRpb25dPC9hPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxwPkluIGEgc3RhbmRhbG9uZSBkb2N1bWVudCBkZWNsYXJhdGlvbiwgdGhlIHZhbHVlICJ5ZXMiDQoraW5kaWNhdGVzIHRoYXQgdGhlcmUgYXJlIG5vIDxhIHRpdGxlPSJFeHRlcm5hbCBNYXJrdXAgRGVjbGFyYXRpb24iIGhyZWY9IiNkdC1leHRta3BkZWNsIj5leHRlcm5hbA0KK21hcmt1cCBkZWNsYXJhdGlvbnM8L2E+IHdoaWNoIGFmZmVjdCB0aGUgaW5mb3JtYXRpb24gcGFzc2VkIGZyb20gdGhlIFhNTCBwcm9jZXNzb3INCit0byB0aGUgYXBwbGljYXRpb24uIFRoZSB2YWx1ZSAibm8iIGluZGljYXRlcyB0aGF0IHRoZXJlIGFyZSBvciBtYXkgYmUgc3VjaA0KK2V4dGVybmFsIG1hcmt1cCBkZWNsYXJhdGlvbnMuIE5vdGUgdGhhdCB0aGUgc3RhbmRhbG9uZSBkb2N1bWVudCBkZWNsYXJhdGlvbg0KK29ubHkgZGVub3RlcyB0aGUgcHJlc2VuY2Ugb2YgZXh0ZXJuYWwgPGVtPmRlY2xhcmF0aW9uczwvZW0+OyB0aGUgcHJlc2VuY2UsDQoraW4gYSBkb2N1bWVudCwgb2YgcmVmZXJlbmNlcyB0byBleHRlcm5hbCA8ZW0+ZW50aXRpZXM8L2VtPiwgd2hlbiB0aG9zZSBlbnRpdGllcw0KK2FyZSBpbnRlcm5hbGx5IGRlY2xhcmVkLCBkb2VzIG5vdCBjaGFuZ2UgaXRzIHN0YW5kYWxvbmUgc3RhdHVzLjwvcD4gPHA+SWYNCit0aGVyZSBhcmUgbm8gZXh0ZXJuYWwgbWFya3VwIGRlY2xhcmF0aW9ucywgdGhlIHN0YW5kYWxvbmUgZG9jdW1lbnQgZGVjbGFyYXRpb24NCitoYXMgbm8gbWVhbmluZy4gSWYgdGhlcmUgYXJlIGV4dGVybmFsIG1hcmt1cCBkZWNsYXJhdGlvbnMgYnV0IHRoZXJlIGlzIG5vDQorc3RhbmRhbG9uZSBkb2N1bWVudCBkZWNsYXJhdGlvbiwgdGhlIHZhbHVlICJubyIgaXMgYXNzdW1lZC48L3A+IDxwPkFueSBYTUwNCitkb2N1bWVudCBmb3Igd2hpY2ggPGNvZGU+c3RhbmRhbG9uZT0ibm8iPC9jb2RlPiBob2xkcyBjYW4gYmUgY29udmVydGVkIGFsZ29yaXRobWljYWxseQ0KK3RvIGEgc3RhbmRhbG9uZSBkb2N1bWVudCwgd2hpY2ggbWF5IGJlIGRlc2lyYWJsZSBmb3Igc29tZSBuZXR3b3JrIGRlbGl2ZXJ5DQorYXBwbGljYXRpb25zLjwvcD4gPGRpdiBjbGFzcz0iY29uc3RyYWludCI+PHAgY2xhc3M9InByZWZpeCI+PGEgbmFtZT0idmMtY2hlY2stcm1kIj48L2E+PGI+VmFsaWRpdHkNCitjb25zdHJhaW50OiBTdGFuZGFsb25lIERvY3VtZW50IERlY2xhcmF0aW9uPC9iPjwvcD48cD5UaGUgc3RhbmRhbG9uZSBkb2N1bWVudA0KK2RlY2xhcmF0aW9uIG11c3QgaGF2ZSB0aGUgdmFsdWUgIm5vIiBpZiBhbnkgZXh0ZXJuYWwgbWFya3VwIGRlY2xhcmF0aW9ucyBjb250YWluDQorZGVjbGFyYXRpb25zIG9mOjwvcD4gPHVsPg0KKzxsaT48cD5hdHRyaWJ1dGVzIHdpdGggPGEgdGl0bGU9IkF0dHJpYnV0ZSBEZWZhdWx0IiBocmVmPSIjZHQtZGVmYXVsdCI+ZGVmYXVsdDwvYT4NCit2YWx1ZXMsIGlmIGVsZW1lbnRzIHRvIHdoaWNoIHRoZXNlIGF0dHJpYnV0ZXMgYXBwbHkgYXBwZWFyIGluIHRoZSBkb2N1bWVudA0KK3dpdGhvdXQgc3BlY2lmaWNhdGlvbnMgb2YgdmFsdWVzIGZvciB0aGVzZSBhdHRyaWJ1dGVzLCBvcjwvcD48L2xpPg0KKzxsaT48cD5lbnRpdGllcyAob3RoZXIgdGhhbiA8Y29kZT5hbXA8L2NvZGU+LCA8Y29kZT5sdDwvY29kZT4sIDxjb2RlPmd0PC9jb2RlPiwgPGNvZGU+YXBvczwvY29kZT4sIDxjb2RlPnF1b3Q8L2NvZGU+KSwNCitpZiA8YSB0aXRsZT0iRW50aXR5IFJlZmVyZW5jZSIgaHJlZj0iI2R0LWVudHJlZiI+cmVmZXJlbmNlczwvYT4gdG8gdGhvc2UgZW50aXRpZXMNCithcHBlYXIgaW4gdGhlIGRvY3VtZW50LCBvcjwvcD48L2xpPg0KKzxsaT48cD5hdHRyaWJ1dGVzIHdpdGggdmFsdWVzIHN1YmplY3QgdG8gPGEgaHJlZj0iI0FWTm9ybWFsaXplIj48Y2l0ZT5ub3JtYWxpemF0aW9uPC9jaXRlPjwvYT4sDQord2hlcmUgdGhlIGF0dHJpYnV0ZSBhcHBlYXJzIGluIHRoZSBkb2N1bWVudCB3aXRoIGEgdmFsdWUgd2hpY2ggd2lsbCBjaGFuZ2UNCithcyBhIHJlc3VsdCBvZiBub3JtYWxpemF0aW9uLCBvcjwvcD48L2xpPg0KKzxsaT48cD5lbGVtZW50IHR5cGVzIHdpdGggPGEgdGl0bGU9IkVsZW1lbnQgY29udGVudCIgaHJlZj0iI2R0LWVsZW1jb250ZW50Ij5lbGVtZW50DQorY29udGVudDwvYT4sIGlmIHdoaXRlIHNwYWNlIG9jY3VycyBkaXJlY3RseSB3aXRoaW4gYW55IGluc3RhbmNlIG9mIHRob3NlIHR5cGVzLjwvcD48L2xpPg0KKzwvdWw+IDwvZGl2PiA8cD5BbiBleGFtcGxlIFhNTCBkZWNsYXJhdGlvbiB3aXRoIGEgc3RhbmRhbG9uZSBkb2N1bWVudCBkZWNsYXJhdGlvbjo8L3A+IDx0YWJsZQ0KK2NsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9J3llcyc/PjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MiI+IDxoMz48YSBuYW1lPSJzZWMtd2hpdGUtc3BhY2UiPjwvYT4yLjEwDQorV2hpdGUgU3BhY2UgSGFuZGxpbmc8L2gzPiA8cD5JbiBlZGl0aW5nIFhNTCBkb2N1bWVudHMsIGl0IGlzIG9mdGVuIGNvbnZlbmllbnQNCit0byB1c2UgIndoaXRlIHNwYWNlIiAoc3BhY2VzLCB0YWJzLCBhbmQgYmxhbmsgbGluZXMpIHRvIHNldCBhcGFydCB0aGUgbWFya3VwDQorZm9yIGdyZWF0ZXIgcmVhZGFiaWxpdHkuIFN1Y2ggd2hpdGUgc3BhY2UgaXMgdHlwaWNhbGx5IG5vdCBpbnRlbmRlZCBmb3IgaW5jbHVzaW9uDQoraW4gdGhlIGRlbGl2ZXJlZCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudC4gT24gdGhlIG90aGVyIGhhbmQsICJzaWduaWZpY2FudCINCit3aGl0ZSBzcGFjZSB0aGF0IHNob3VsZCBiZSBwcmVzZXJ2ZWQgaW4gdGhlIGRlbGl2ZXJlZCB2ZXJzaW9uIGlzIGNvbW1vbiwgZm9yDQorZXhhbXBsZSBpbiBwb2V0cnkgYW5kIHNvdXJjZSBjb2RlLjwvcD4gPHA+QW4gPGEgdGl0bGU9IlhNTCBQcm9jZXNzb3IiIGhyZWY9IiNkdC14bWwtcHJvYyI+WE1MDQorcHJvY2Vzc29yPC9hPiBtdXN0IGFsd2F5cyBwYXNzIGFsbCBjaGFyYWN0ZXJzIGluIGEgZG9jdW1lbnQgdGhhdCBhcmUgbm90IG1hcmt1cA0KK3Rocm91Z2ggdG8gdGhlIGFwcGxpY2F0aW9uLiBBIDxhIHRpdGxlPSJWYWxpZGF0aW5nIFByb2Nlc3NvciIgaHJlZj0iI2R0LXZhbGlkYXRpbmciPg0KK3ZhbGlkYXRpbmcgWE1MIHByb2Nlc3NvcjwvYT4gbXVzdCBhbHNvIGluZm9ybSB0aGUgYXBwbGljYXRpb24gd2hpY2ggb2YgdGhlc2UNCitjaGFyYWN0ZXJzIGNvbnN0aXR1dGUgd2hpdGUgc3BhY2UgYXBwZWFyaW5nIGluIDxhIHRpdGxlPSJFbGVtZW50IGNvbnRlbnQiDQoraHJlZj0iI2R0LWVsZW1jb250ZW50Ij5lbGVtZW50IGNvbnRlbnQ8L2E+LjwvcD4gPHA+QSBzcGVjaWFsIDxhIHRpdGxlPSJBdHRyaWJ1dGUiDQoraHJlZj0iI2R0LWF0dHIiPmF0dHJpYnV0ZTwvYT4gbmFtZWQgPGNvZGU+eG1sOnNwYWNlPC9jb2RlPiBtYXkgYmUgYXR0YWNoZWQNCit0byBhbiBlbGVtZW50IHRvIHNpZ25hbCBhbiBpbnRlbnRpb24gdGhhdCBpbiB0aGF0IGVsZW1lbnQsIHdoaXRlIHNwYWNlIHNob3VsZA0KK2JlIHByZXNlcnZlZCBieSBhcHBsaWNhdGlvbnMuIEluIHZhbGlkIGRvY3VtZW50cywgdGhpcyBhdHRyaWJ1dGUsIGxpa2UgYW55DQorb3RoZXIsIG11c3QgYmUgPGEgdGl0bGU9IkF0dHJpYnV0ZS1MaXN0IERlY2xhcmF0aW9uIiBocmVmPSIjZHQtYXR0ZGVjbCI+ZGVjbGFyZWQ8L2E+DQoraWYgaXQgaXMgdXNlZC4gV2hlbiBkZWNsYXJlZCwgaXQgbXVzdCBiZSBnaXZlbiBhcyBhbiA8YSB0aXRsZT0iRW51bWVyYXRlZCBBdHRyaWJ1dGUgVmFsdWVzIg0KK2hyZWY9IiNkdC1lbnVtZXJhdGVkIj5lbnVtZXJhdGVkIHR5cGU8L2E+IHdob3NlIHZhbHVlcyBhcmUgb25lIG9yIGJvdGggb2YNCisiZGVmYXVsdCIgYW5kICJwcmVzZXJ2ZSIuIEZvciBleGFtcGxlOjwvcD4gPHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiDQorYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDshQVRUTElTVCBwb2VtICB4bWw6c3BhY2UgKGRlZmF1bHR8cHJlc2VydmUpICdwcmVzZXJ2ZSc+DQorDQorJmx0OyEtLSAtLT4NCismbHQ7IUFUVExJU1QgcHJlIHhtbDpzcGFjZSAocHJlc2VydmUpICNGSVhFRCAncHJlc2VydmUnPjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8cD5UaGUgdmFsdWUgImRlZmF1bHQiIHNpZ25hbHMgdGhhdCBhcHBsaWNhdGlvbnMnIGRlZmF1bHQgd2hpdGUtc3BhY2UNCitwcm9jZXNzaW5nIG1vZGVzIGFyZSBhY2NlcHRhYmxlIGZvciB0aGlzIGVsZW1lbnQ7IHRoZSB2YWx1ZSAicHJlc2VydmUiIGluZGljYXRlcw0KK3RoZSBpbnRlbnQgdGhhdCBhcHBsaWNhdGlvbnMgcHJlc2VydmUgYWxsIHRoZSB3aGl0ZSBzcGFjZS4gVGhpcyBkZWNsYXJlZCBpbnRlbnQNCitpcyBjb25zaWRlcmVkIHRvIGFwcGx5IHRvIGFsbCBlbGVtZW50cyB3aXRoaW4gdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQgd2hlcmUNCitpdCBpcyBzcGVjaWZpZWQsIHVubGVzcyBvdmVycmlkZW4gd2l0aCBhbm90aGVyIGluc3RhbmNlIG9mIHRoZSA8Y29kZT54bWw6c3BhY2U8L2NvZGU+DQorYXR0cmlidXRlLjwvcD4gPHA+VGhlIDxhIHRpdGxlPSJSb290IEVsZW1lbnQiIGhyZWY9IiNkdC1yb290Ij5yb290IGVsZW1lbnQ8L2E+DQorb2YgYW55IGRvY3VtZW50IGlzIGNvbnNpZGVyZWQgdG8gaGF2ZSBzaWduYWxlZCBubyBpbnRlbnRpb25zIGFzIHJlZ2FyZHMgYXBwbGljYXRpb24NCitzcGFjZSBoYW5kbGluZywgdW5sZXNzIGl0IHByb3ZpZGVzIGEgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlIG9yIHRoZSBhdHRyaWJ1dGUNCitpcyBkZWNsYXJlZCB3aXRoIGEgZGVmYXVsdCB2YWx1ZS48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9InNlYy1saW5lLWVuZHMiPjwvYT4yLjExDQorRW5kLW9mLUxpbmUgSGFuZGxpbmc8L2gzPiA8cD5YTUwgPGEgdGl0bGU9IlRleHQgRW50aXR5IiBocmVmPSIjZHQtcGFyc2VkZW50Ij5wYXJzZWQNCitlbnRpdGllczwvYT4gYXJlIG9mdGVuIHN0b3JlZCBpbiBjb21wdXRlciBmaWxlcyB3aGljaCwgZm9yIGVkaXRpbmcgY29udmVuaWVuY2UsDQorYXJlIG9yZ2FuaXplZCBpbnRvIGxpbmVzLiBUaGVzZSBsaW5lcyBhcmUgdHlwaWNhbGx5IHNlcGFyYXRlZCBieSBzb21lIGNvbWJpbmF0aW9uDQorb2YgdGhlIGNoYXJhY3RlcnMgY2FycmlhZ2UtcmV0dXJuICgjeEQpIGFuZCBsaW5lLWZlZWQgKCN4QSkuPC9wPiAgPHA+VG8gc2ltcGxpZnkNCit0aGUgdGFza3Mgb2YgPGEgdGl0bGU9IkFwcGxpY2F0aW9uIiBocmVmPSIjZHQtYXBwIj5hcHBsaWNhdGlvbnM8L2E+LCB0aGUgY2hhcmFjdGVycw0KK3Bhc3NlZCB0byBhbiBhcHBsaWNhdGlvbiBieSB0aGUgPGEgdGl0bGU9IlhNTCBQcm9jZXNzb3IiIGhyZWY9IiNkdC14bWwtcHJvYyI+WE1MDQorcHJvY2Vzc29yPC9hPiBtdXN0IGJlIGFzIGlmIHRoZSBYTUwgcHJvY2Vzc29yIG5vcm1hbGl6ZWQgYWxsIGxpbmUgYnJlYWtzIGluDQorZXh0ZXJuYWwgcGFyc2VkIGVudGl0aWVzIChpbmNsdWRpbmcgdGhlIGRvY3VtZW50IGVudGl0eSkgb24gaW5wdXQsIGJlZm9yZQ0KK3BhcnNpbmcsIGJ5IHRyYW5zbGF0aW5nIGJvdGggdGhlIHR3by1jaGFyYWN0ZXIgc2VxdWVuY2UgI3hEICN4QSBhbmQgYW55ICN4RA0KK3RoYXQgaXMgbm90IGZvbGxvd2VkIGJ5ICN4QSB0byBhIHNpbmdsZSAjeEEgY2hhcmFjdGVyLjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGENCituYW1lPSJzZWMtbGFuZy10YWciPjwvYT4yLjEyIExhbmd1YWdlIElkZW50aWZpY2F0aW9uPC9oMz4gPHA+SW4gZG9jdW1lbnQgcHJvY2Vzc2luZywNCitpdCBpcyBvZnRlbiB1c2VmdWwgdG8gaWRlbnRpZnkgdGhlIG5hdHVyYWwgb3IgZm9ybWFsIGxhbmd1YWdlIGluIHdoaWNoIHRoZQ0KK2NvbnRlbnQgaXMgd3JpdHRlbi4gQSBzcGVjaWFsIDxhIHRpdGxlPSJBdHRyaWJ1dGUiIGhyZWY9IiNkdC1hdHRyIj5hdHRyaWJ1dGU8L2E+DQorbmFtZWQgPGNvZGU+eG1sOmxhbmc8L2NvZGU+IG1heSBiZSBpbnNlcnRlZCBpbiBkb2N1bWVudHMgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UNCit1c2VkIGluIHRoZSBjb250ZW50cyBhbmQgYXR0cmlidXRlIHZhbHVlcyBvZiBhbnkgZWxlbWVudCBpbiBhbiBYTUwgZG9jdW1lbnQuDQorSW4gdmFsaWQgZG9jdW1lbnRzLCB0aGlzIGF0dHJpYnV0ZSwgbGlrZSBhbnkgb3RoZXIsIG11c3QgYmUgPGEgdGl0bGU9IkF0dHJpYnV0ZS1MaXN0IERlY2xhcmF0aW9uIg0KK2hyZWY9IiNkdC1hdHRkZWNsIj5kZWNsYXJlZDwvYT4gaWYgaXQgaXMgdXNlZC4gVGhlIHZhbHVlcyBvZiB0aGUgYXR0cmlidXRlDQorYXJlIGxhbmd1YWdlIGlkZW50aWZpZXJzIGFzIGRlZmluZWQgYnkgPGEgaHJlZj0iI1JGQzE3NjYiPltJRVRGIFJGQyAxNzY2XTwvYT4sIDxjaXRlPlRhZ3MNCitmb3IgdGhlIElkZW50aWZpY2F0aW9uIG9mIExhbmd1YWdlczwvY2l0ZT4sIG9yIGl0cyBzdWNjZXNzb3Igb24gdGhlIElFVEYgU3RhbmRhcmRzDQorVHJhY2suPC9wPiA8ZGl2IGNsYXNzPSJub3RlIj48cCBjbGFzcz0icHJlZml4Ij48Yj5Ob3RlOjwvYj48L3A+IDxwPjxhIGhyZWY9IiNSRkMxNzY2Ij5bSUVURg0KK1JGQyAxNzY2XTwvYT4gdGFncyBhcmUgY29uc3RydWN0ZWQgZnJvbSB0d28tbGV0dGVyIGxhbmd1YWdlIGNvZGVzIGFzIGRlZmluZWQNCitieSA8YSBocmVmPSIjSVNPNjM5Ij5bSVNPIDYzOV08L2E+LCBmcm9tIHR3by1sZXR0ZXIgY291bnRyeSBjb2RlcyBhcyBkZWZpbmVkDQorYnkgPGEgaHJlZj0iI0lTTzMxNjYiPltJU08gMzE2Nl08L2E+LCBvciBmcm9tIGxhbmd1YWdlIGlkZW50aWZpZXJzIHJlZ2lzdGVyZWQNCit3aXRoIHRoZSBJbnRlcm5ldCBBc3NpZ25lZCBOdW1iZXJzIEF1dGhvcml0eSA8YSBocmVmPSIjSUFOQS1MQU5HQ09ERVMiPltJQU5BLUxBTkdDT0RFU108L2E+Lg0KK0l0IGlzIGV4cGVjdGVkIHRoYXQgdGhlIHN1Y2Nlc3NvciB0byA8YSBocmVmPSIjUkZDMTc2NiI+W0lFVEYgUkZDIDE3NjZdPC9hPg0KK3dpbGwgaW50cm9kdWNlIHRocmVlLWxldHRlciBsYW5ndWFnZSBjb2RlcyBmb3IgbGFuZ3VhZ2VzIG5vdCBwcmVzZW50bHkgY292ZXJlZA0KK2J5IDxhIGhyZWY9IiNJU082MzkiPltJU08gNjM5XTwvYT4uPC9wPiA8L2Rpdj4gPHA+KFByb2R1Y3Rpb25zIDMzIHRocm91Z2gNCiszOCBoYXZlIGJlZW4gcmVtb3ZlZC4pPC9wPiAgICAgIDxwPkZvciBleGFtcGxlOjwvcD4gPHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiDQorYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDtwIHhtbDpsYW5nPSJlbiI+VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZy4mbHQ7L3A+DQorJmx0O3AgeG1sOmxhbmc9ImVuLUdCIj5XaGF0IGNvbG91ciBpcyBpdD8mbHQ7L3A+DQorJmx0O3AgeG1sOmxhbmc9ImVuLVVTIj5XaGF0IGNvbG9yIGlzIGl0PyZsdDsvcD4NCismbHQ7c3Agd2hvPSJGYXVzdCIgZGVzYz0nbGVpc2UnIHhtbDpsYW5nPSJkZSI+DQorICAmbHQ7bD5IYWJlIG51biwgYWNoISBQaGlsb3NvcGhpZSwmbHQ7L2w+DQorICAmbHQ7bD5KdXJpc3RlcmVpLCB1bmQgTWVkaXppbiZsdDsvbD4NCisgICZsdDtsPnVuZCBsZWlkZXIgYXVjaCBUaGVvbG9naWUmbHQ7L2w+DQorICAmbHQ7bD5kdXJjaGF1cyBzdHVkaWVydCBtaXQgaGVpJnN6bGlnO2VtIEJlbSZ1dW1sO2gnbi4mbHQ7L2w+DQorJmx0Oy9zcD48L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gIDxwPlRoZSBpbnRlbnQgZGVjbGFyZWQgd2l0aCA8Y29kZT54bWw6bGFuZzwvY29kZT4gaXMgY29uc2lkZXJlZA0KK3RvIGFwcGx5IHRvIGFsbCBhdHRyaWJ1dGVzIGFuZCBjb250ZW50IG9mIHRoZSBlbGVtZW50IHdoZXJlIGl0IGlzIHNwZWNpZmllZCwNCit1bmxlc3Mgb3ZlcnJpZGRlbiB3aXRoIGFuIGluc3RhbmNlIG9mIDxjb2RlPnhtbDpsYW5nPC9jb2RlPiBvbiBhbm90aGVyIGVsZW1lbnQNCit3aXRoaW4gdGhhdCBjb250ZW50LjwvcD4gIDxwPkEgc2ltcGxlIGRlY2xhcmF0aW9uIGZvciA8Y29kZT54bWw6bGFuZzwvY29kZT4NCittaWdodCB0YWtlIHRoZSBmb3JtPC9wPiA8dGFibGUgY2xhc3M9ImVnIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSINCitiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+eG1sOmxhbmcgTk1UT0tFTiAjSU1QTElFRDwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8cD5idXQgc3BlY2lmaWMgZGVmYXVsdCB2YWx1ZXMgbWF5IGFsc28gYmUgZ2l2ZW4sIGlmIGFwcHJvcHJpYXRlLg0KK0luIGEgY29sbGVjdGlvbiBvZiBGcmVuY2ggcG9lbXMgZm9yIEVuZ2xpc2ggc3R1ZGVudHMsIHdpdGggZ2xvc3NlcyBhbmQgbm90ZXMNCitpbiBFbmdsaXNoLCB0aGUgPGNvZGU+eG1sOmxhbmc8L2NvZGU+IGF0dHJpYnV0ZSBtaWdodCBiZSBkZWNsYXJlZCB0aGlzIHdheTo8L3A+IDx0YWJsZQ0KK2NsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7IUFUVExJU1QgcG9lbSAgIHhtbDpsYW5nIE5NVE9LRU4gJ2ZyJz4NCismbHQ7IUFUVExJU1QgZ2xvc3MgIHhtbDpsYW5nIE5NVE9LRU4gJ2VuJz4NCismbHQ7IUFUVExJU1Qgbm90ZSAgIHhtbDpsYW5nIE5NVE9LRU4gJ2VuJz48L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPC9kaXY+IDwvZGl2PiAgPGRpdiBjbGFzcz0iZGl2MSI+IDxoMj48YSBuYW1lPSJzZWMtbG9naWNhbC1zdHJ1Y3QiPjwvYT4zDQorTG9naWNhbCBTdHJ1Y3R1cmVzPC9oMj4gPHA+WzxhIHRpdGxlPSJFbGVtZW50IiBuYW1lPSJkdC1lbGVtZW50Ij5EZWZpbml0aW9uPC9hPjoNCitFYWNoIDxhIHRpdGxlPSJYTUwgRG9jdW1lbnQiIGhyZWY9IiNkdC14bWwtZG9jIj5YTUwgZG9jdW1lbnQ8L2E+IGNvbnRhaW5zDQorb25lIG9yIG1vcmUgPGI+ZWxlbWVudHM8L2I+LCB0aGUgYm91bmRhcmllcyBvZiB3aGljaCBhcmUgZWl0aGVyIGRlbGltaXRlZA0KK2J5IDxhIHRpdGxlPSJTdGFydC1UYWciIGhyZWY9IiNkdC1zdGFnIj5zdGFydC10YWdzPC9hPiBhbmQgPGEgdGl0bGU9IkVuZCBUYWciDQoraHJlZj0iI2R0LWV0YWciPmVuZC10YWdzPC9hPiwgb3IsIGZvciA8YSB0aXRsZT0iRW1wdHkiIGhyZWY9IiNkdC1lbXB0eSI+ZW1wdHk8L2E+DQorZWxlbWVudHMsIGJ5IGFuIDxhIHRpdGxlPSJlbXB0eS1lbGVtZW50IHRhZyIgaHJlZj0iI2R0LWVldGFnIj5lbXB0eS1lbGVtZW50DQordGFnPC9hPi4gRWFjaCBlbGVtZW50IGhhcyBhIHR5cGUsIGlkZW50aWZpZWQgYnkgbmFtZSwgc29tZXRpbWVzIGNhbGxlZCBpdHMNCisiZ2VuZXJpYyBpZGVudGlmaWVyIiAoR0kpLCBhbmQgbWF5IGhhdmUgYSBzZXQgb2YgYXR0cmlidXRlIHNwZWNpZmljYXRpb25zLl0NCitFYWNoIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9uIGhhcyBhIDxhIHRpdGxlPSJBdHRyaWJ1dGUgTmFtZSIgaHJlZj0iI2R0LWF0dHJuYW1lIj5uYW1lPC9hPg0KK2FuZCBhIDxhIHRpdGxlPSJBdHRyaWJ1dGUgVmFsdWUiIGhyZWY9IiNkdC1hdHRydmFsIj52YWx1ZTwvYT4uPC9wPiA8aDU+RWxlbWVudDwvaDU+PHRhYmxlDQorY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1lbGVtZW50Ij48L2E+WzM5XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPmVsZW1lbnQ8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULUVtcHR5RWxlbVRhZyI+RW1wdHlFbGVtVGFnPC9hPjwvY29kZT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48Y29kZT58IDxhIGhyZWY9IiNOVC1TVGFnIj5TVGFnPC9hPiA8YSBocmVmPSIjTlQtY29udGVudCI+Y29udGVudDwvYT4gPGENCitocmVmPSIjTlQtRVRhZyI+RVRhZzwvYT48L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI0dJTWF0Y2giPltXRkM6IEVsZW1lbnQgVHlwZSBNYXRjaF08L2E+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI2VsZW1lbnR2YWxpZCI+W1ZDOiBFbGVtZW50IFZhbGlkXTwvYT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5UaGlzIHNwZWNpZmljYXRpb24gZG9lcyBub3QgY29uc3RyYWluIHRoZSBzZW1hbnRpY3MsIHVzZSwNCitvciAoYmV5b25kIHN5bnRheCkgbmFtZXMgb2YgdGhlIGVsZW1lbnQgdHlwZXMgYW5kIGF0dHJpYnV0ZXMsIGV4Y2VwdCB0aGF0DQorbmFtZXMgYmVnaW5uaW5nIHdpdGggYSBtYXRjaCB0byA8Y29kZT4oKCdYJ3wneCcpKCdNJ3wnbScpKCdMJ3wnbCcpKTwvY29kZT4NCithcmUgcmVzZXJ2ZWQgZm9yIHN0YW5kYXJkaXphdGlvbiBpbiB0aGlzIG9yIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGlzIHNwZWNpZmljYXRpb24uPC9wPiA8ZGl2DQorY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhIG5hbWU9IkdJTWF0Y2giPjwvYT48Yj5XZWxsLWZvcm1lZG5lc3MNCitjb25zdHJhaW50OiBFbGVtZW50IFR5cGUgTWF0Y2g8L2I+PC9wPjxwPlRoZSA8YSBocmVmPSIjTlQtTmFtZSI+TmFtZTwvYT4gaW4NCithbiBlbGVtZW50J3MgZW5kLXRhZyBtdXN0IG1hdGNoIHRoZSBlbGVtZW50IHR5cGUgaW4gdGhlIHN0YXJ0LXRhZy48L3A+IDwvZGl2PiA8ZGl2DQorY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhIG5hbWU9ImVsZW1lbnR2YWxpZCI+PC9hPjxiPlZhbGlkaXR5DQorY29uc3RyYWludDogRWxlbWVudCBWYWxpZDwvYj48L3A+PHA+QW4gZWxlbWVudCBpcyB2YWxpZCBpZiB0aGVyZSBpcyBhIGRlY2xhcmF0aW9uDQorbWF0Y2hpbmcgPGEgaHJlZj0iI05ULWVsZW1lbnRkZWNsIj5lbGVtZW50ZGVjbDwvYT4gd2hlcmUgdGhlIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPg0KK21hdGNoZXMgdGhlIGVsZW1lbnQgdHlwZSwgYW5kIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOjwvcD4gPG9sPg0KKzxsaT48cD5UaGUgZGVjbGFyYXRpb24gbWF0Y2hlcyA8Yj5FTVBUWTwvYj4gYW5kIHRoZSBlbGVtZW50IGhhcyBubyA8YSB0aXRsZT0iQ29udGVudCINCitocmVmPSIjZHQtY29udGVudCI+Y29udGVudDwvYT4uPC9wPjwvbGk+DQorPGxpPjxwPlRoZSBkZWNsYXJhdGlvbiBtYXRjaGVzIDxhIGhyZWY9IiNOVC1jaGlsZHJlbiI+Y2hpbGRyZW48L2E+IGFuZCB0aGUNCitzZXF1ZW5jZSBvZiA8YSB0aXRsZT0iUGFyZW50L0NoaWxkIiBocmVmPSIjZHQtcGFyZW50Y2hpbGQiPmNoaWxkIGVsZW1lbnRzPC9hPg0KK2JlbG9uZ3MgdG8gdGhlIGxhbmd1YWdlIGdlbmVyYXRlZCBieSB0aGUgcmVndWxhciBleHByZXNzaW9uIGluIHRoZSBjb250ZW50DQorbW9kZWwsIHdpdGggb3B0aW9uYWwgd2hpdGUgc3BhY2UgKGNoYXJhY3RlcnMgbWF0Y2hpbmcgdGhlIG5vbnRlcm1pbmFsIDxhIGhyZWY9IiNOVC1TIj5TPC9hPikNCitiZXR3ZWVuIHRoZSBzdGFydC10YWcgYW5kIHRoZSBmaXJzdCBjaGlsZCBlbGVtZW50LCBiZXR3ZWVuIGNoaWxkIGVsZW1lbnRzLA0KK29yIGJldHdlZW4gdGhlIGxhc3QgY2hpbGQgZWxlbWVudCBhbmQgdGhlIGVuZC10YWcuIE5vdGUgdGhhdCBhIENEQVRBIHNlY3Rpb24NCitjb250YWluaW5nIG9ubHkgd2hpdGUgc3BhY2UgZG9lcyBub3QgbWF0Y2ggdGhlIG5vbnRlcm1pbmFsIDxhIGhyZWY9IiNOVC1TIj5TPC9hPiwNCithbmQgaGVuY2UgY2Fubm90IGFwcGVhciBpbiB0aGVzZSBwb3NpdGlvbnMuPC9wPjwvbGk+DQorPGxpPjxwPlRoZSBkZWNsYXJhdGlvbiBtYXRjaGVzIDxhIGhyZWY9IiNOVC1NaXhlZCI+TWl4ZWQ8L2E+IGFuZCB0aGUgY29udGVudA0KK2NvbnNpc3RzIG9mIDxhIHRpdGxlPSJDaGFyYWN0ZXIgRGF0YSIgaHJlZj0iI2R0LWNoYXJkYXRhIj5jaGFyYWN0ZXIgZGF0YTwvYT4NCithbmQgPGEgdGl0bGU9IlBhcmVudC9DaGlsZCIgaHJlZj0iI2R0LXBhcmVudGNoaWxkIj5jaGlsZCBlbGVtZW50czwvYT4gd2hvc2UNCit0eXBlcyBtYXRjaCBuYW1lcyBpbiB0aGUgY29udGVudCBtb2RlbC48L3A+PC9saT4NCis8bGk+PHA+VGhlIGRlY2xhcmF0aW9uIG1hdGNoZXMgPGI+QU5ZPC9iPiwgYW5kIHRoZSB0eXBlcyBvZiBhbnkgPGEgdGl0bGU9IlBhcmVudC9DaGlsZCINCitocmVmPSIjZHQtcGFyZW50Y2hpbGQiPmNoaWxkIGVsZW1lbnRzPC9hPiBoYXZlIGJlZW4gZGVjbGFyZWQuPC9wPjwvbGk+DQorPC9vbD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic2VjLXN0YXJ0dGFncyI+PC9hPjMuMSBTdGFydC1UYWdzLA0KK0VuZC1UYWdzLCBhbmQgRW1wdHktRWxlbWVudCBUYWdzPC9oMz4gPHA+WzxhIHRpdGxlPSJTdGFydC1UYWciIG5hbWU9ImR0LXN0YWciPkRlZmluaXRpb248L2E+Og0KK1RoZSBiZWdpbm5pbmcgb2YgZXZlcnkgbm9uLWVtcHR5IFhNTCBlbGVtZW50IGlzIG1hcmtlZCBieSBhIDxiPnN0YXJ0LXRhZzwvYj4uXTwvcD4gPGg1PlN0YXJ0LXRhZzwvaDU+PHRhYmxlDQorY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1TVGFnIj48L2E+WzQwXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlNUYWc8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+JyZsdDsnIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiAoPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1BdHRyaWJ1dGUiPkF0dHJpYnV0ZTwvYT4pKiA8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPj8gJz4nPC9jb2RlPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiN1bmlxYXR0c3BlYyI+W1dGQzogVW5pcXVlIEF0dCBTcGVjXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1BdHRyaWJ1dGUiPjwvYT5bNDFdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+QXR0cmlidXRlPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiA8YSBocmVmPSIjTlQtRXEiPkVxPC9hPiA8YSBocmVmPSIjTlQtQXR0VmFsdWUiPkF0dFZhbHVlPC9hPjwvY29kZT48L3RkPg0KKzx0ZD48YSBocmVmPSIjVmFsdWVUeXBlIj5bVkM6IEF0dHJpYnV0ZSBWYWx1ZSBUeXBlXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjTm9FeHRlcm5hbFJlZnMiPltXRkM6IE5vIEV4dGVybmFsIEVudGl0eSBSZWZlcmVuY2VzXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjQ2xlYW5BdHRyVmFscyI+W1dGQzogTm8gJmx0OyBpbiBBdHRyaWJ1dGUgVmFsdWVzXTwvYT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5UaGUgPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IGluIHRoZSBzdGFydC0gYW5kIGVuZC10YWdzDQorZ2l2ZXMgdGhlIGVsZW1lbnQncyA8Yj50eXBlPC9iPi4gWzxhIHRpdGxlPSJBdHRyaWJ1dGUiIG5hbWU9ImR0LWF0dHIiPkRlZmluaXRpb248L2E+Og0KKyBUaGUgPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+LTxhIGhyZWY9IiNOVC1BdHRWYWx1ZSI+QXR0VmFsdWU8L2E+IHBhaXJzDQorYXJlIHJlZmVycmVkIHRvIGFzIHRoZSA8Yj5hdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbnM8L2I+IG9mIHRoZSBlbGVtZW50XSwgWzxhDQordGl0bGU9IkF0dHJpYnV0ZSBOYW1lIiBuYW1lPSJkdC1hdHRybmFtZSI+RGVmaW5pdGlvbjwvYT46IHdpdGggdGhlIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPg0KK2luIGVhY2ggcGFpciByZWZlcnJlZCB0byBhcyB0aGUgPGI+YXR0cmlidXRlIG5hbWU8L2I+XSBhbmQgWzxhIHRpdGxlPSJBdHRyaWJ1dGUgVmFsdWUiDQorbmFtZT0iZHQtYXR0cnZhbCI+RGVmaW5pdGlvbjwvYT46IHRoZSBjb250ZW50IG9mIHRoZSA8YSBocmVmPSIjTlQtQXR0VmFsdWUiPkF0dFZhbHVlPC9hPg0KKyh0aGUgdGV4dCBiZXR3ZWVuIHRoZSA8Y29kZT4nPC9jb2RlPiBvciA8Y29kZT4iPC9jb2RlPiBkZWxpbWl0ZXJzKSBhcyB0aGUgPGI+YXR0cmlidXRlDQordmFsdWU8L2I+Ll1Ob3RlIHRoYXQgdGhlIG9yZGVyIG9mIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9ucyBpbiBhIHN0YXJ0LXRhZw0KK29yIGVtcHR5LWVsZW1lbnQgdGFnIGlzIG5vdCBzaWduaWZpY2FudC48L3A+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhDQorbmFtZT0idW5pcWF0dHNwZWMiPjwvYT48Yj5XZWxsLWZvcm1lZG5lc3MgY29uc3RyYWludDogVW5pcXVlIEF0dCBTcGVjPC9iPjwvcD48cD5Obw0KK2F0dHJpYnV0ZSBuYW1lIG1heSBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIHNhbWUgc3RhcnQtdGFnIG9yIGVtcHR5LWVsZW1lbnQNCit0YWcuPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz0iY29uc3RyYWludCI+PHAgY2xhc3M9InByZWZpeCI+PGEgbmFtZT0iVmFsdWVUeXBlIj48L2E+PGI+VmFsaWRpdHkNCitjb25zdHJhaW50OiBBdHRyaWJ1dGUgVmFsdWUgVHlwZTwvYj48L3A+PHA+VGhlIGF0dHJpYnV0ZSBtdXN0IGhhdmUgYmVlbiBkZWNsYXJlZDsNCit0aGUgdmFsdWUgbXVzdCBiZSBvZiB0aGUgdHlwZSBkZWNsYXJlZCBmb3IgaXQuIChGb3IgYXR0cmlidXRlIHR5cGVzLCBzZWUgPGENCitocmVmPSIjYXR0ZGVjbHMiPjxiPjMuMyBBdHRyaWJ1dGUtTGlzdCBEZWNsYXJhdGlvbnM8L2I+PC9hPi4pPC9wPiA8L2Rpdj4gPGRpdg0KK2NsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJOb0V4dGVybmFsUmVmcyI+PC9hPjxiPldlbGwtZm9ybWVkbmVzcw0KK2NvbnN0cmFpbnQ6IE5vIEV4dGVybmFsIEVudGl0eSBSZWZlcmVuY2VzPC9iPjwvcD48cD5BdHRyaWJ1dGUgdmFsdWVzIGNhbm5vdA0KK2NvbnRhaW4gZGlyZWN0IG9yIGluZGlyZWN0IGVudGl0eSByZWZlcmVuY2VzIHRvIGV4dGVybmFsIGVudGl0aWVzLjwvcD4gPC9kaXY+IDxkaXYNCitjbGFzcz0iY29uc3RyYWludCI+PHAgY2xhc3M9InByZWZpeCI+PGEgbmFtZT0iQ2xlYW5BdHRyVmFscyI+PC9hPjxiPldlbGwtZm9ybWVkbmVzcw0KK2NvbnN0cmFpbnQ6IE5vIDxjb2RlPiZsdDs8L2NvZGU+IGluIEF0dHJpYnV0ZSBWYWx1ZXM8L2I+PC9wPiA8cD5UaGUgPGEgdGl0bGU9IlJlcGxhY2VtZW50IFRleHQiDQoraHJlZj0iI2R0LXJlcGx0ZXh0Ij5yZXBsYWNlbWVudCB0ZXh0PC9hPiBvZiBhbnkgZW50aXR5IHJlZmVycmVkIHRvIGRpcmVjdGx5DQorb3IgaW5kaXJlY3RseSBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUgbXVzdCBub3QgY29udGFpbiBhIDxjb2RlPiZsdDs8L2NvZGU+LjwvcD4gPC9kaXY+IDxwPkFuDQorZXhhbXBsZSBvZiBhIHN0YXJ0LXRhZzo8L3A+IDx0YWJsZSBjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ig0KK2JnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7dGVybWRlZiBpZD0iZHQtZG9nIiB0ZXJtPSJkb2ciPjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8cD5bPGEgdGl0bGU9IkVuZCBUYWciIG5hbWU9ImR0LWV0YWciPkRlZmluaXRpb248L2E+OiBUaGUgZW5kIG9mDQorZXZlcnkgZWxlbWVudCB0aGF0IGJlZ2lucyB3aXRoIGEgc3RhcnQtdGFnIG11c3QgYmUgbWFya2VkIGJ5IGFuIDxiPmVuZC10YWc8L2I+DQorY29udGFpbmluZyBhIG5hbWUgdGhhdCBlY2hvZXMgdGhlIGVsZW1lbnQncyB0eXBlIGFzIGdpdmVuIGluIHRoZSBzdGFydC10YWc6XTwvcD4gPGg1PkVuZC10YWc8L2g1Pjx0YWJsZQ0KK2NsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtRVRhZyI+PC9hPls0Ml0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5FVGFnPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicmbHQ7LycgPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gJz4nPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxwPkFuIGV4YW1wbGUgb2YgYW4gZW5kLXRhZzo8L3A+IDx0YWJsZSBjbGFzcz0iZWciIHdpZHRoPSIxMDAlIg0KK2JvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7L3Rlcm1kZWY+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDxwPls8YSB0aXRsZT0iQ29udGVudCIgbmFtZT0iZHQtY29udGVudCI+RGVmaW5pdGlvbjwvYT46IFRoZSA8YSB0aXRsZT0iVGV4dCINCitocmVmPSIjZHQtdGV4dCI+dGV4dDwvYT4gYmV0d2VlbiB0aGUgc3RhcnQtdGFnIGFuZCBlbmQtdGFnIGlzIGNhbGxlZCB0aGUgZWxlbWVudCdzIDxiPmNvbnRlbnQ8L2I+Ol08L3A+IDxoNT5Db250ZW50DQorb2YgRWxlbWVudHM8L2g1Pjx0YWJsZSBjbGFzcz0ic2NyYXAiPjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULWNvbnRlbnQiPjwvYT5bNDNdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+Y29udGVudDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtQ2hhckRhdGEiPkNoYXJEYXRhPC9hPj8gKCg8YSBocmVmPSIjTlQtZWxlbWVudCI+ZWxlbWVudDwvYT4NCit8IDxhIGhyZWY9IiNOVC1SZWZlcmVuY2UiPlJlZmVyZW5jZTwvYT4gfCA8YSBocmVmPSIjTlQtQ0RTZWN0Ij5DRFNlY3Q8L2E+DQorfCA8YSBocmVmPSIjTlQtUEkiPlBJPC9hPiB8IDxhIGhyZWY9IiNOVC1Db21tZW50Ij5Db21tZW50PC9hPikgPGEgaHJlZj0iI05ULUNoYXJEYXRhIj5DaGFyRGF0YTwvYT4/KSo8L2NvZGU+PC90ZD4NCis8dGQ+PGk+LyogICovPC9pPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxwPls8YSB0aXRsZT0iRW1wdHkiIG5hbWU9ImR0LWVtcHR5Ij5EZWZpbml0aW9uPC9hPjogQW4gZWxlbWVudA0KK3dpdGggbm8gY29udGVudCBpcyBzYWlkIHRvIGJlIDxiPmVtcHR5PC9iPi5dIFRoZSByZXByZXNlbnRhdGlvbiBvZiBhbiBlbXB0eQ0KK2VsZW1lbnQgaXMgZWl0aGVyIGEgc3RhcnQtdGFnIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFuIGVuZC10YWcsIG9yIGFuIGVtcHR5LWVsZW1lbnQNCit0YWcuIFs8YSB0aXRsZT0iZW1wdHktZWxlbWVudCB0YWciIG5hbWU9ImR0LWVldGFnIj5EZWZpbml0aW9uPC9hPjogQW4gPGI+ZW1wdHktZWxlbWVudA0KK3RhZzwvYj4gdGFrZXMgYSBzcGVjaWFsIGZvcm06XTwvcD4gPGg1PlRhZ3MgZm9yIEVtcHR5IEVsZW1lbnRzPC9oNT48dGFibGUNCitjbGFzcz0ic2NyYXAiPjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUVtcHR5RWxlbVRhZyI+PC9hPls0NF0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5FbXB0eUVsZW1UYWc8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+JyZsdDsnIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiAoPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1BdHRyaWJ1dGUiPkF0dHJpYnV0ZTwvYT4pKiA8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPj8gJy8+JzwvY29kZT48L3RkPg0KKzx0ZD48YSBocmVmPSIjdW5pcWF0dHNwZWMiPltXRkM6IFVuaXF1ZSBBdHQgU3BlY108L2E+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+RW1wdHktZWxlbWVudCB0YWdzIG1heSBiZSB1c2VkIGZvciBhbnkgZWxlbWVudCB3aGljaCBoYXMNCitubyBjb250ZW50LCB3aGV0aGVyIG9yIG5vdCBpdCBpcyBkZWNsYXJlZCB1c2luZyB0aGUga2V5d29yZCA8Yj5FTVBUWTwvYj4uIDxhDQordGl0bGU9IkZvciBpbnRlcm9wZXJhYmlsaXR5IiBocmVmPSIjZHQtaW50ZXJvcCI+Rm9yIGludGVyb3BlcmFiaWxpdHk8L2E+LA0KK3RoZSBlbXB0eS1lbGVtZW50IHRhZyBzaG91bGQgYmUgdXNlZCwgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQsIGZvciBlbGVtZW50cw0KK3doaWNoIGFyZSBkZWNsYXJlZCBFTVBUWS48L3A+IDxwPkV4YW1wbGVzIG9mIGVtcHR5IGVsZW1lbnRzOjwvcD4gPHRhYmxlIGNsYXNzPSJlZyINCit3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDtJTUcgYWxpZ249ImxlZnQiDQorIHNyYz0iaHR0cDovL3d3dy53My5vcmcvSWNvbnMvV1dXL3czY19ob21lIiAvPg0KKyZsdDticj4mbHQ7L2JyPg0KKyZsdDtici8+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9ImVsZW1kZWNscyI+PC9hPjMuMiBFbGVtZW50DQorVHlwZSBEZWNsYXJhdGlvbnM8L2gzPiA8cD5UaGUgPGEgdGl0bGU9IkVsZW1lbnQiIGhyZWY9IiNkdC1lbGVtZW50Ij5lbGVtZW50PC9hPg0KK3N0cnVjdHVyZSBvZiBhbiA8YSB0aXRsZT0iWE1MIERvY3VtZW50IiBocmVmPSIjZHQteG1sLWRvYyI+WE1MIGRvY3VtZW50PC9hPg0KK21heSwgZm9yIDxhIHRpdGxlPSJWYWxpZGl0eSIgaHJlZj0iI2R0LXZhbGlkIj52YWxpZGF0aW9uPC9hPiBwdXJwb3NlcywgYmUNCitjb25zdHJhaW5lZCB1c2luZyBlbGVtZW50IHR5cGUgYW5kIGF0dHJpYnV0ZS1saXN0IGRlY2xhcmF0aW9ucy4gQW4gZWxlbWVudA0KK3R5cGUgZGVjbGFyYXRpb24gY29uc3RyYWlucyB0aGUgZWxlbWVudCdzIDxhIHRpdGxlPSJDb250ZW50IiBocmVmPSIjZHQtY29udGVudCI+Y29udGVudDwvYT4uPC9wPiA8cD5FbGVtZW50DQordHlwZSBkZWNsYXJhdGlvbnMgb2Z0ZW4gY29uc3RyYWluIHdoaWNoIGVsZW1lbnQgdHlwZXMgY2FuIGFwcGVhciBhcyA8YSB0aXRsZT0iUGFyZW50L0NoaWxkIg0KK2hyZWY9IiNkdC1wYXJlbnRjaGlsZCI+Y2hpbGRyZW48L2E+IG9mIHRoZSBlbGVtZW50LiBBdCB1c2VyIG9wdGlvbiwgYW4gWE1MDQorcHJvY2Vzc29yIG1heSBpc3N1ZSBhIHdhcm5pbmcgd2hlbiBhIGRlY2xhcmF0aW9uIG1lbnRpb25zIGFuIGVsZW1lbnQgdHlwZQ0KK2ZvciB3aGljaCBubyBkZWNsYXJhdGlvbiBpcyBwcm92aWRlZCwgYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yLjwvcD4gPHA+WzxhDQordGl0bGU9IkVsZW1lbnQgVHlwZSBkZWNsYXJhdGlvbiIgbmFtZT0iZHQtZWxkZWNsIj5EZWZpbml0aW9uPC9hPjogQW4gPGI+ZWxlbWVudA0KK3R5cGUgZGVjbGFyYXRpb248L2I+IHRha2VzIHRoZSBmb3JtOl08L3A+IDxoNT5FbGVtZW50IFR5cGUgRGVjbGFyYXRpb248L2g1Pjx0YWJsZQ0KK2NsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtZWxlbWVudGRlY2wiPjwvYT5bNDVdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+ZWxlbWVudGRlY2w8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+JyZsdDshRUxFTUVOVCcgPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiA8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPiA8YSBocmVmPSIjTlQtY29udGVudHNwZWMiPmNvbnRlbnRzcGVjPC9hPiA8YSBocmVmPSIjTlQtUyI+UzwvYT4/DQorJz4nPC9jb2RlPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiNFRFVuaXF1ZSI+W1ZDOiBVbmlxdWUgRWxlbWVudCBUeXBlIERlY2xhcmF0aW9uXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1jb250ZW50c3BlYyI+PC9hPls0Nl0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5jb250ZW50c3BlYzwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nRU1QVFknIHwgJ0FOWScgfCA8YSBocmVmPSIjTlQtTWl4ZWQiPk1peGVkPC9hPiB8IDxhIGhyZWY9IiNOVC1jaGlsZHJlbiI+Y2hpbGRyZW48L2E+IDwvY29kZT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD53aGVyZSB0aGUgPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IGdpdmVzIHRoZSBlbGVtZW50DQordHlwZSBiZWluZyBkZWNsYXJlZC48L3A+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhIG5hbWU9IkVEVW5pcXVlIj48L2E+PGI+VmFsaWRpdHkNCitjb25zdHJhaW50OiBVbmlxdWUgRWxlbWVudCBUeXBlIERlY2xhcmF0aW9uPC9iPjwvcD48cD5ObyBlbGVtZW50IHR5cGUgbWF5DQorYmUgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UuPC9wPiA8L2Rpdj4gPHA+RXhhbXBsZXMgb2YgZWxlbWVudCB0eXBlIGRlY2xhcmF0aW9uczo8L3A+IDx0YWJsZQ0KK2NsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7IUVMRU1FTlQgYnIgRU1QVFk+DQorJmx0OyFFTEVNRU5UIHAgKCNQQ0RBVEF8ZW1waCkqID4NCismbHQ7IUVMRU1FTlQgJW5hbWUucGFyYTsgJWNvbnRlbnQucGFyYTsgPg0KKyZsdDshRUxFTUVOVCBjb250YWluZXIgQU5ZPjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhIG5hbWU9InNlYy1lbGVtZW50LWNvbnRlbnQiPjwvYT4zLjIuMSBFbGVtZW50DQorQ29udGVudDwvaDQ+IDxwPls8YSB0aXRsZT0iRWxlbWVudCBjb250ZW50IiBuYW1lPSJkdC1lbGVtY29udGVudCI+RGVmaW5pdGlvbjwvYT46DQorQW4gZWxlbWVudCA8YSB0aXRsZT0iU3RhcnQtVGFnIiBocmVmPSIjZHQtc3RhZyI+dHlwZTwvYT4gaGFzIDxiPmVsZW1lbnQgY29udGVudDwvYj4NCit3aGVuIGVsZW1lbnRzIG9mIHRoYXQgdHlwZSBtdXN0IGNvbnRhaW4gb25seSA8YSB0aXRsZT0iUGFyZW50L0NoaWxkIiBocmVmPSIjZHQtcGFyZW50Y2hpbGQiPmNoaWxkPC9hPg0KK2VsZW1lbnRzIChubyBjaGFyYWN0ZXIgZGF0YSksIG9wdGlvbmFsbHkgc2VwYXJhdGVkIGJ5IHdoaXRlIHNwYWNlIChjaGFyYWN0ZXJzDQorbWF0Y2hpbmcgdGhlIG5vbnRlcm1pbmFsIDxhIGhyZWY9IiNOVC1TIj5TPC9hPikuXVs8YSB0aXRsZT0iQ29udGVudCBtb2RlbCINCituYW1lPSJkdC1jb250ZW50LW1vZGVsIj5EZWZpbml0aW9uPC9hPjogSW4gdGhpcyBjYXNlLCB0aGUgY29uc3RyYWludCBpbmNsdWRlcw0KK2EgPGI+Y29udGVudCBtb2RlbDwvYj4sIGEgc2ltcGxlIGdyYW1tYXIgZ292ZXJuaW5nIHRoZSBhbGxvd2VkIHR5cGVzIG9mIHRoZQ0KK2NoaWxkIGVsZW1lbnRzIGFuZCB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgYWxsb3dlZCB0byBhcHBlYXIuXSBUaGUgZ3JhbW1hcg0KK2lzIGJ1aWx0IG9uIGNvbnRlbnQgcGFydGljbGVzICg8YSBocmVmPSIjTlQtY3AiPmNwPC9hPnMpLCB3aGljaCBjb25zaXN0IG9mDQorbmFtZXMsIGNob2ljZSBsaXN0cyBvZiBjb250ZW50IHBhcnRpY2xlcywgb3Igc2VxdWVuY2UgbGlzdHMgb2YgY29udGVudCBwYXJ0aWNsZXM6PC9wPiA8aDU+RWxlbWVudC1jb250ZW50DQorTW9kZWxzPC9oNT48dGFibGUgY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1jaGlsZHJlbiI+PC9hPls0N10mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5jaGlsZHJlbjwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4oPGEgaHJlZj0iI05ULWNob2ljZSI+Y2hvaWNlPC9hPiB8IDxhIGhyZWY9IiNOVC1zZXEiPnNlcTwvYT4pICgnPycNCit8ICcqJyB8ICcrJyk/PC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULWNwIj48L2E+WzQ4XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPmNwPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPig8YSBocmVmPSIjTlQtTmFtZSI+TmFtZTwvYT4gfCA8YSBocmVmPSIjTlQtY2hvaWNlIj5jaG9pY2U8L2E+IHwgPGENCitocmVmPSIjTlQtc2VxIj5zZXE8L2E+KSAoJz8nIHwgJyonIHwgJysnKT88L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtY2hvaWNlIj48L2E+WzQ5XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPmNob2ljZTwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nKCcgPGEgaHJlZj0iI05ULVMiPlM8L2E+PyA8YSBocmVmPSIjTlQtY3AiPmNwPC9hPiAoIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8NCisnfCcgPGEgaHJlZj0iI05ULVMiPlM8L2E+PyA8YSBocmVmPSIjTlQtY3AiPmNwPC9hPiApKyA8YSBocmVmPSIjTlQtUyI+UzwvYT4/DQorJyknPC9jb2RlPjwvdGQ+DQorPHRkPjxpPi8qICAqLzwvaT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48aT4vKiAgKi88L2k+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI3ZjLVBFaW5Hcm91cCI+W1ZDOiBQcm9wZXIgR3JvdXAvUEUgTmVzdGluZ108L2E+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtc2VxIj48L2E+WzUwXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPnNlcTwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nKCcgPGEgaHJlZj0iI05ULVMiPlM8L2E+PyA8YSBocmVmPSIjTlQtY3AiPmNwPC9hPiAoIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8NCisnLCcgPGEgaHJlZj0iI05ULVMiPlM8L2E+PyA8YSBocmVmPSIjTlQtY3AiPmNwPC9hPiApKiA8YSBocmVmPSIjTlQtUyI+UzwvYT4/DQorJyknPC9jb2RlPjwvdGQ+DQorPHRkPjxpPi8qICAqLzwvaT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjdmMtUEVpbkdyb3VwIj5bVkM6IFByb3BlciBHcm91cC9QRSBOZXN0aW5nXTwvYT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD53aGVyZSBlYWNoIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiBpcyB0aGUgdHlwZSBvZg0KK2FuIGVsZW1lbnQgd2hpY2ggbWF5IGFwcGVhciBhcyBhIDxhIHRpdGxlPSJQYXJlbnQvQ2hpbGQiIGhyZWY9IiNkdC1wYXJlbnRjaGlsZCI+Y2hpbGQ8L2E+Lg0KK0FueSBjb250ZW50IHBhcnRpY2xlIGluIGEgY2hvaWNlIGxpc3QgbWF5IGFwcGVhciBpbiB0aGUgPGEgdGl0bGU9IkVsZW1lbnQgY29udGVudCINCitocmVmPSIjZHQtZWxlbWNvbnRlbnQiPmVsZW1lbnQgY29udGVudDwvYT4gYXQgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBjaG9pY2UNCitsaXN0IGFwcGVhcnMgaW4gdGhlIGdyYW1tYXI7IGNvbnRlbnQgcGFydGljbGVzIG9jY3VycmluZyBpbiBhIHNlcXVlbmNlIGxpc3QNCittdXN0IGVhY2ggYXBwZWFyIGluIHRoZSA8YSB0aXRsZT0iRWxlbWVudCBjb250ZW50IiBocmVmPSIjZHQtZWxlbWNvbnRlbnQiPmVsZW1lbnQNCitjb250ZW50PC9hPiBpbiB0aGUgb3JkZXIgZ2l2ZW4gaW4gdGhlIGxpc3QuIFRoZSBvcHRpb25hbCBjaGFyYWN0ZXIgZm9sbG93aW5nDQorYSBuYW1lIG9yIGxpc3QgZ292ZXJucyB3aGV0aGVyIHRoZSBlbGVtZW50IG9yIHRoZSBjb250ZW50IHBhcnRpY2xlcyBpbiB0aGUNCitsaXN0IG1heSBvY2N1ciBvbmUgb3IgbW9yZSAoPGNvZGU+KzwvY29kZT4pLCB6ZXJvIG9yIG1vcmUgKDxjb2RlPio8L2NvZGU+KSwNCitvciB6ZXJvIG9yIG9uZSB0aW1lcyAoPGNvZGU+PzwvY29kZT4pLiBUaGUgYWJzZW5jZSBvZiBzdWNoIGFuIG9wZXJhdG9yIG1lYW5zDQordGhhdCB0aGUgZWxlbWVudCBvciBjb250ZW50IHBhcnRpY2xlIG11c3QgYXBwZWFyIGV4YWN0bHkgb25jZS4gVGhpcyBzeW50YXgNCithbmQgbWVhbmluZyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIHVzZWQgaW4gdGhlIHByb2R1Y3Rpb25zIGluIHRoaXMgc3BlY2lmaWNhdGlvbi48L3A+IDxwPlRoZQ0KK2NvbnRlbnQgb2YgYW4gZWxlbWVudCBtYXRjaGVzIGEgY29udGVudCBtb2RlbCBpZiBhbmQgb25seSBpZiBpdCBpcyBwb3NzaWJsZQ0KK3RvIHRyYWNlIG91dCBhIHBhdGggdGhyb3VnaCB0aGUgY29udGVudCBtb2RlbCwgb2JleWluZyB0aGUgc2VxdWVuY2UsIGNob2ljZSwNCithbmQgcmVwZXRpdGlvbiBvcGVyYXRvcnMgYW5kIG1hdGNoaW5nIGVhY2ggZWxlbWVudCBpbiB0aGUgY29udGVudCBhZ2FpbnN0DQorYW4gZWxlbWVudCB0eXBlIGluIHRoZSBjb250ZW50IG1vZGVsLiA8YSB0aXRsZT0iRm9yIENvbXBhdGliaWxpdHkiIGhyZWY9IiNkdC1jb21wYXQiPkZvcg0KK2NvbXBhdGliaWxpdHk8L2E+LCBpdCBpcyBhbiBlcnJvciBpZiBhbiBlbGVtZW50IGluIHRoZSBkb2N1bWVudCBjYW4gbWF0Y2gNCittb3JlIHRoYW4gb25lIG9jY3VycmVuY2Ugb2YgYW4gZWxlbWVudCB0eXBlIGluIHRoZSBjb250ZW50IG1vZGVsLiBGb3IgbW9yZQ0KK2luZm9ybWF0aW9uLCBzZWUgPGEgaHJlZj0iI2RldGVybWluaXNtIj48Yj5FIERldGVybWluaXN0aWMgQ29udGVudCBNb2RlbHM8L2I+PC9hPi48L3A+DQorICA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJ2Yy1QRWluR3JvdXAiPjwvYT48Yj5WYWxpZGl0eQ0KK2NvbnN0cmFpbnQ6IFByb3BlciBHcm91cC9QRSBOZXN0aW5nPC9iPjwvcD48cD5QYXJhbWV0ZXItZW50aXR5IDxhIHRpdGxlPSJSZXBsYWNlbWVudCBUZXh0Ig0KK2hyZWY9IiNkdC1yZXBsdGV4dCI+cmVwbGFjZW1lbnQgdGV4dDwvYT4gbXVzdCBiZSBwcm9wZXJseSBuZXN0ZWQgd2l0aCBwYXJlbnRoZXNpemVkDQorZ3JvdXBzLiBUaGF0IGlzIHRvIHNheSwgaWYgZWl0aGVyIG9mIHRoZSBvcGVuaW5nIG9yIGNsb3NpbmcgcGFyZW50aGVzZXMgaW4NCithIDxhIGhyZWY9IiNOVC1jaG9pY2UiPmNob2ljZTwvYT4sIDxhIGhyZWY9IiNOVC1zZXEiPnNlcTwvYT4sIG9yIDxhIGhyZWY9IiNOVC1NaXhlZCI+TWl4ZWQ8L2E+DQorY29uc3RydWN0IGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVwbGFjZW1lbnQgdGV4dCBmb3IgYSA8YSB0aXRsZT0iUGFyYW1ldGVyLWVudGl0eSByZWZlcmVuY2UiDQoraHJlZj0iI2R0LVBFUmVmIj5wYXJhbWV0ZXIgZW50aXR5PC9hPiwgYm90aCBtdXN0IGJlIGNvbnRhaW5lZCBpbiB0aGUgc2FtZQ0KK3JlcGxhY2VtZW50IHRleHQuPC9wPiA8cD48YSB0aXRsZT0iRm9yIGludGVyb3BlcmFiaWxpdHkiIGhyZWY9IiNkdC1pbnRlcm9wIj5Gb3INCitpbnRlcm9wZXJhYmlsaXR5PC9hPiwgaWYgYSBwYXJhbWV0ZXItZW50aXR5IHJlZmVyZW5jZSBhcHBlYXJzIGluIGEgPGEgaHJlZj0iI05ULWNob2ljZSI+Y2hvaWNlPC9hPiwgPGENCitocmVmPSIjTlQtc2VxIj5zZXE8L2E+LCBvciA8YSBocmVmPSIjTlQtTWl4ZWQiPk1peGVkPC9hPiBjb25zdHJ1Y3QsIGl0cyByZXBsYWNlbWVudA0KK3RleHQgc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3Qgb25lIG5vbi1ibGFuayBjaGFyYWN0ZXIsIGFuZCBuZWl0aGVyIHRoZSBmaXJzdA0KK25vciBsYXN0IG5vbi1ibGFuayBjaGFyYWN0ZXIgb2YgdGhlIHJlcGxhY2VtZW50IHRleHQgc2hvdWxkIGJlIGEgY29ubmVjdG9yDQorKDxjb2RlPnw8L2NvZGU+IG9yIDxjb2RlPiw8L2NvZGU+KS48L3A+IDwvZGl2PiA8cD5FeGFtcGxlcyBvZiBlbGVtZW50LWNvbnRlbnQNCittb2RlbHM6PC9wPiA8dGFibGUgY2xhc3M9ImVnIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDshRUxFTUVOVCBzcGVjIChmcm9udCwgYm9keSwgYmFjaz8pPg0KKyZsdDshRUxFTUVOVCBkaXYxIChoZWFkLCAocCB8IGxpc3QgfCBub3RlKSosIGRpdjIqKT4NCismbHQ7IUVMRU1FTlQgZGljdGlvbmFyeS1ib2R5ICglZGl2Lm1peDsgfCAlZGljdC5taXg7KSo+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhIG5hbWU9InNlYy1taXhlZC1jb250ZW50Ij48L2E+My4yLjINCitNaXhlZCBDb250ZW50PC9oND4gPHA+WzxhIHRpdGxlPSJNaXhlZCBDb250ZW50IiBuYW1lPSJkdC1taXhlZCI+RGVmaW5pdGlvbjwvYT46DQorQW4gZWxlbWVudCA8YSB0aXRsZT0iU3RhcnQtVGFnIiBocmVmPSIjZHQtc3RhZyI+dHlwZTwvYT4gaGFzIDxiPm1peGVkIGNvbnRlbnQ8L2I+DQord2hlbiBlbGVtZW50cyBvZiB0aGF0IHR5cGUgbWF5IGNvbnRhaW4gY2hhcmFjdGVyIGRhdGEsIG9wdGlvbmFsbHkgaW50ZXJzcGVyc2VkDQord2l0aCA8YSB0aXRsZT0iUGFyZW50L0NoaWxkIiBocmVmPSIjZHQtcGFyZW50Y2hpbGQiPmNoaWxkPC9hPiBlbGVtZW50cy5dIEluDQordGhpcyBjYXNlLCB0aGUgdHlwZXMgb2YgdGhlIGNoaWxkIGVsZW1lbnRzIG1heSBiZSBjb25zdHJhaW5lZCwgYnV0IG5vdCB0aGVpcg0KK29yZGVyIG9yIHRoZWlyIG51bWJlciBvZiBvY2N1cnJlbmNlczo8L3A+IDxoNT5NaXhlZC1jb250ZW50IERlY2xhcmF0aW9uPC9oNT48dGFibGUNCitjbGFzcz0ic2NyYXAiPjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULU1peGVkIj48L2E+WzUxXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPk1peGVkPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicoJyA8YSBocmVmPSIjTlQtUyI+UzwvYT4/ICcjUENEQVRBJyAoPGEgaHJlZj0iI05ULVMiPlM8L2E+PyAnfCcgPGENCitocmVmPSIjTlQtUyI+UzwvYT4/IDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPikqIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gJykqJyA8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGNvZGU+fCAnKCcgPGEgaHJlZj0iI05ULVMiPlM8L2E+PyAnI1BDREFUQScgPGEgaHJlZj0iI05ULVMiPlM8L2E+PyAnKScgPC9jb2RlPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiN2Yy1QRWluR3JvdXAiPltWQzogUHJvcGVyIEdyb3VwL1BFIE5lc3RpbmddPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiN2Yy1NaXhlZENoaWxkcmVuVW5pcXVlIj5bVkM6IE5vIER1cGxpY2F0ZSBUeXBlc108L2E+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+d2hlcmUgdGhlIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPnMgZ2l2ZSB0aGUgdHlwZXMNCitvZiBlbGVtZW50cyB0aGF0IG1heSBhcHBlYXIgYXMgY2hpbGRyZW4uIFRoZSBrZXl3b3JkIDxiPiNQQ0RBVEE8L2I+IGRlcml2ZXMNCitoaXN0b3JpY2FsbHkgZnJvbSB0aGUgdGVybSAicGFyc2VkIGNoYXJhY3RlciBkYXRhLiI8L3A+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwDQorY2xhc3M9InByZWZpeCI+PGEgbmFtZT0idmMtTWl4ZWRDaGlsZHJlblVuaXF1ZSI+PC9hPjxiPlZhbGlkaXR5IGNvbnN0cmFpbnQ6DQorTm8gRHVwbGljYXRlIFR5cGVzPC9iPjwvcD48cD5UaGUgc2FtZSBuYW1lIG11c3Qgbm90IGFwcGVhciBtb3JlIHRoYW4gb25jZQ0KK2luIGEgc2luZ2xlIG1peGVkLWNvbnRlbnQgZGVjbGFyYXRpb24uPC9wPiA8L2Rpdj4gPHA+RXhhbXBsZXMgb2YgbWl4ZWQgY29udGVudA0KK2RlY2xhcmF0aW9uczo8L3A+IDx0YWJsZSBjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ig0KK2JnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7IUVMRU1FTlQgcCAoI1BDREFUQXxhfHVsfGJ8aXxlbSkqPg0KKyZsdDshRUxFTUVOVCBwICgjUENEQVRBIHwgJWZvbnQ7IHwgJXBocmFzZTsgfCAlc3BlY2lhbDsgfCAlZm9ybTspKiA+DQorJmx0OyFFTEVNRU5UIGIgKCNQQ0RBVEEpPjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0iYXR0ZGVjbHMiPjwvYT4zLjMgQXR0cmlidXRlLUxpc3QNCitEZWNsYXJhdGlvbnM8L2gzPiA8cD48YSB0aXRsZT0iQXR0cmlidXRlIiBocmVmPSIjZHQtYXR0ciI+QXR0cmlidXRlczwvYT4gYXJlDQordXNlZCB0byBhc3NvY2lhdGUgbmFtZS12YWx1ZSBwYWlycyB3aXRoIDxhIHRpdGxlPSJFbGVtZW50IiBocmVmPSIjZHQtZWxlbWVudCI+ZWxlbWVudHM8L2E+Lg0KK0F0dHJpYnV0ZSBzcGVjaWZpY2F0aW9ucyBtYXkgYXBwZWFyIG9ubHkgd2l0aGluIDxhIHRpdGxlPSJTdGFydC1UYWciIGhyZWY9IiNkdC1zdGFnIj5zdGFydC10YWdzPC9hPg0KK2FuZCA8YSB0aXRsZT0iZW1wdHktZWxlbWVudCB0YWciIGhyZWY9IiNkdC1lZXRhZyI+ZW1wdHktZWxlbWVudCB0YWdzPC9hPjsNCit0aHVzLCB0aGUgcHJvZHVjdGlvbnMgdXNlZCB0byByZWNvZ25pemUgdGhlbSBhcHBlYXIgaW4gPGEgaHJlZj0iI3NlYy1zdGFydHRhZ3MiPjxiPjMuMQ0KK1N0YXJ0LVRhZ3MsIEVuZC1UYWdzLCBhbmQgRW1wdHktRWxlbWVudCBUYWdzPC9iPjwvYT4uIEF0dHJpYnV0ZS1saXN0IGRlY2xhcmF0aW9ucw0KK21heSBiZSB1c2VkOjwvcD4gPHVsPg0KKzxsaT48cD5UbyBkZWZpbmUgdGhlIHNldCBvZiBhdHRyaWJ1dGVzIHBlcnRhaW5pbmcgdG8gYSBnaXZlbiBlbGVtZW50IHR5cGUuPC9wPiA8L2xpPg0KKzxsaT48cD5UbyBlc3RhYmxpc2ggdHlwZSBjb25zdHJhaW50cyBmb3IgdGhlc2UgYXR0cmlidXRlcy48L3A+PC9saT4NCis8bGk+PHA+VG8gcHJvdmlkZSA8YSB0aXRsZT0iQXR0cmlidXRlIERlZmF1bHQiIGhyZWY9IiNkdC1kZWZhdWx0Ij5kZWZhdWx0DQordmFsdWVzPC9hPiBmb3IgYXR0cmlidXRlcy48L3A+PC9saT4NCis8L3VsPiA8cD5bPGEgdGl0bGU9IkF0dHJpYnV0ZS1MaXN0IERlY2xhcmF0aW9uIiBuYW1lPSJkdC1hdHRkZWNsIj5EZWZpbml0aW9uPC9hPjoNCisgPGI+QXR0cmlidXRlLWxpc3QgZGVjbGFyYXRpb25zPC9iPiBzcGVjaWZ5IHRoZSBuYW1lLCBkYXRhIHR5cGUsIGFuZCBkZWZhdWx0DQordmFsdWUgKGlmIGFueSkgb2YgZWFjaCBhdHRyaWJ1dGUgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gZWxlbWVudCB0eXBlOl08L3A+IDxoNT5BdHRyaWJ1dGUtbGlzdA0KK0RlY2xhcmF0aW9uPC9oNT48dGFibGUgY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1BdHRsaXN0RGVjbCI+PC9hPls1Ml0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5BdHRsaXN0RGVjbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nJmx0OyFBVFRMSVNUJyA8YSBocmVmPSIjTlQtUyI+UzwvYT4gPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IDxhDQoraHJlZj0iI05ULUF0dERlZiI+QXR0RGVmPC9hPiogPGEgaHJlZj0iI05ULVMiPlM8L2E+PyAnPic8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtQXR0RGVmIj48L2E+WzUzXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkF0dERlZjwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtUyI+UzwvYT4gPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IDxhIGhyZWY9IiNOVC1TIj5TPC9hPiA8YQ0KK2hyZWY9IiNOVC1BdHRUeXBlIj5BdHRUeXBlPC9hPiA8YSBocmVmPSIjTlQtUyI+UzwvYT4gPGEgaHJlZj0iI05ULURlZmF1bHREZWNsIj5EZWZhdWx0RGVjbDwvYT48L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+VGhlIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiBpbiB0aGUgPGEgaHJlZj0iI05ULUF0dGxpc3REZWNsIj5BdHRsaXN0RGVjbDwvYT4NCitydWxlIGlzIHRoZSB0eXBlIG9mIGFuIGVsZW1lbnQuIEF0IHVzZXIgb3B0aW9uLCBhbiBYTUwgcHJvY2Vzc29yIG1heSBpc3N1ZQ0KK2Egd2FybmluZyBpZiBhdHRyaWJ1dGVzIGFyZSBkZWNsYXJlZCBmb3IgYW4gZWxlbWVudCB0eXBlIG5vdCBpdHNlbGYgZGVjbGFyZWQsDQorYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yLiBUaGUgPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IGluIHRoZSA8YSBocmVmPSIjTlQtQXR0RGVmIj5BdHREZWY8L2E+DQorcnVsZSBpcyB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlLjwvcD4gPHA+V2hlbiBtb3JlIHRoYW4gb25lIDxhIGhyZWY9IiNOVC1BdHRsaXN0RGVjbCI+QXR0bGlzdERlY2w8L2E+DQoraXMgcHJvdmlkZWQgZm9yIGEgZ2l2ZW4gZWxlbWVudCB0eXBlLCB0aGUgY29udGVudHMgb2YgYWxsIHRob3NlIHByb3ZpZGVkIGFyZQ0KK21lcmdlZC4gV2hlbiBtb3JlIHRoYW4gb25lIGRlZmluaXRpb24gaXMgcHJvdmlkZWQgZm9yIHRoZSBzYW1lIGF0dHJpYnV0ZSBvZg0KK2EgZ2l2ZW4gZWxlbWVudCB0eXBlLCB0aGUgZmlyc3QgZGVjbGFyYXRpb24gaXMgYmluZGluZyBhbmQgbGF0ZXIgZGVjbGFyYXRpb25zDQorYXJlIGlnbm9yZWQuIDxhIHRpdGxlPSJGb3IgaW50ZXJvcGVyYWJpbGl0eSIgaHJlZj0iI2R0LWludGVyb3AiPkZvciBpbnRlcm9wZXJhYmlsaXR5LDwvYT4NCit3cml0ZXJzIG9mIERURHMgbWF5IGNob29zZSB0byBwcm92aWRlIGF0IG1vc3Qgb25lIGF0dHJpYnV0ZS1saXN0IGRlY2xhcmF0aW9uDQorZm9yIGEgZ2l2ZW4gZWxlbWVudCB0eXBlLCBhdCBtb3N0IG9uZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbiBmb3IgYSBnaXZlbiBhdHRyaWJ1dGUNCituYW1lIGluIGFuIGF0dHJpYnV0ZS1saXN0IGRlY2xhcmF0aW9uLCBhbmQgYXQgbGVhc3Qgb25lIGF0dHJpYnV0ZSBkZWZpbml0aW9uDQoraW4gZWFjaCBhdHRyaWJ1dGUtbGlzdCBkZWNsYXJhdGlvbi4gRm9yIGludGVyb3BlcmFiaWxpdHksIGFuIFhNTCBwcm9jZXNzb3INCittYXkgYXQgdXNlciBvcHRpb24gaXNzdWUgYSB3YXJuaW5nIHdoZW4gbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUtbGlzdCBkZWNsYXJhdGlvbg0KK2lzIHByb3ZpZGVkIGZvciBhIGdpdmVuIGVsZW1lbnQgdHlwZSwgb3IgbW9yZSB0aGFuIG9uZSBhdHRyaWJ1dGUgZGVmaW5pdGlvbg0KK2lzIHByb3ZpZGVkIGZvciBhIGdpdmVuIGF0dHJpYnV0ZSwgYnV0IHRoaXMgaXMgbm90IGFuIGVycm9yLjwvcD4gPGRpdiBjbGFzcz0iZGl2MyI+IDxoND48YQ0KK25hbWU9InNlYy1hdHRyaWJ1dGUtdHlwZXMiPjwvYT4zLjMuMSBBdHRyaWJ1dGUgVHlwZXM8L2g0PiA8cD5YTUwgYXR0cmlidXRlDQordHlwZXMgYXJlIG9mIHRocmVlIGtpbmRzOiBhIHN0cmluZyB0eXBlLCBhIHNldCBvZiB0b2tlbml6ZWQgdHlwZXMsIGFuZCBlbnVtZXJhdGVkDQordHlwZXMuIFRoZSBzdHJpbmcgdHlwZSBtYXkgdGFrZSBhbnkgbGl0ZXJhbCBzdHJpbmcgYXMgYSB2YWx1ZTsgdGhlIHRva2VuaXplZA0KK3R5cGVzIGhhdmUgdmFyeWluZyBsZXhpY2FsIGFuZCBzZW1hbnRpYyBjb25zdHJhaW50cy4gVGhlIHZhbGlkaXR5IGNvbnN0cmFpbnRzDQorbm90ZWQgaW4gdGhlIGdyYW1tYXIgYXJlIGFwcGxpZWQgYWZ0ZXIgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBoYXMgYmVlbiBub3JtYWxpemVkDQorYXMgZGVzY3JpYmVkIGluIDxhIGhyZWY9IiNhdHRkZWNscyI+PGI+My4zIEF0dHJpYnV0ZS1MaXN0IERlY2xhcmF0aW9uczwvYj48L2E+LjwvcD4gPGg1PkF0dHJpYnV0ZQ0KK1R5cGVzPC9oNT48dGFibGUgY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1BdHRUeXBlIj48L2E+WzU0XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkF0dFR5cGU8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULVN0cmluZ1R5cGUiPlN0cmluZ1R5cGU8L2E+IHwgPGEgaHJlZj0iI05ULVRva2VuaXplZFR5cGUiPlRva2VuaXplZFR5cGU8L2E+DQorfCA8YSBocmVmPSIjTlQtRW51bWVyYXRlZFR5cGUiPkVudW1lcmF0ZWRUeXBlPC9hPiA8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtU3RyaW5nVHlwZSI+PC9hPls1NV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5TdHJpbmdUeXBlPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPidDREFUQSc8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtVG9rZW5pemVkVHlwZSI+PC9hPls1Nl0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5Ub2tlbml6ZWRUeXBlPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPidJRCc8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI2lkIj5bVkM6IElEXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjb25lLWlkLXBlci1lbCI+W1ZDOiBPbmUgSUQgcGVyIEVsZW1lbnQgVHlwZV08L2E+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI2lkLWRlZmF1bHQiPltWQzogSUQgQXR0cmlidXRlIERlZmF1bHRdPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxjb2RlPnwgJ0lEUkVGJzwvY29kZT48L3RkPg0KKzx0ZD48YSBocmVmPSIjaWRyZWYiPltWQzogSURSRUZdPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxjb2RlPnwgJ0lEUkVGUyc8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI2lkcmVmIj5bVkM6IElEUkVGXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48Y29kZT58ICdFTlRJVFknPC9jb2RlPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiNlbnRuYW1lIj5bVkM6IEVudGl0eSBOYW1lXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48Y29kZT58ICdFTlRJVElFUyc8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI2VudG5hbWUiPltWQzogRW50aXR5IE5hbWVdPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxjb2RlPnwgJ05NVE9LRU4nPC9jb2RlPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiNubXRvayI+W1ZDOiBOYW1lIFRva2VuXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48Y29kZT58ICdOTVRPS0VOUyc8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI25tdG9rIj5bVkM6IE5hbWUgVG9rZW5dPC9hPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhIG5hbWU9ImlkIj48L2E+PGI+VmFsaWRpdHkNCitjb25zdHJhaW50OiBJRDwvYj48L3A+PHA+VmFsdWVzIG9mIHR5cGUgPGI+SUQ8L2I+IG11c3QgbWF0Y2ggdGhlIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPg0KK3Byb2R1Y3Rpb24uIEEgbmFtZSBtdXN0IG5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYW4gWE1MIGRvY3VtZW50IGFzIGENCit2YWx1ZSBvZiB0aGlzIHR5cGU7IGkuZS4sIElEIHZhbHVlcyBtdXN0IHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBlbGVtZW50cyB3aGljaA0KK2JlYXIgdGhlbS48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJvbmUtaWQtcGVyLWVsIj48L2E+PGI+VmFsaWRpdHkNCitjb25zdHJhaW50OiBPbmUgSUQgcGVyIEVsZW1lbnQgVHlwZTwvYj48L3A+PHA+Tm8gZWxlbWVudCB0eXBlIG1heSBoYXZlIG1vcmUNCit0aGFuIG9uZSBJRCBhdHRyaWJ1dGUgc3BlY2lmaWVkLjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhDQorbmFtZT0iaWQtZGVmYXVsdCI+PC9hPjxiPlZhbGlkaXR5IGNvbnN0cmFpbnQ6IElEIEF0dHJpYnV0ZSBEZWZhdWx0PC9iPjwvcD48cD5Bbg0KK0lEIGF0dHJpYnV0ZSBtdXN0IGhhdmUgYSBkZWNsYXJlZCBkZWZhdWx0IG9mIDxiPiNJTVBMSUVEPC9iPiBvciA8Yj4jUkVRVUlSRUQ8L2I+LjwvcD4gPC9kaXY+IDxkaXYNCitjbGFzcz0iY29uc3RyYWludCI+PHAgY2xhc3M9InByZWZpeCI+PGEgbmFtZT0iaWRyZWYiPjwvYT48Yj5WYWxpZGl0eSBjb25zdHJhaW50Og0KK0lEUkVGPC9iPjwvcD48cD5WYWx1ZXMgb2YgdHlwZSA8Yj5JRFJFRjwvYj4gbXVzdCBtYXRjaCB0aGUgPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+DQorcHJvZHVjdGlvbiwgYW5kIHZhbHVlcyBvZiB0eXBlIDxiPklEUkVGUzwvYj4gbXVzdCBtYXRjaCA8YSBocmVmPSIjTlQtTmFtZXMiPk5hbWVzPC9hPjsNCitlYWNoIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiBhbiBJRCBhdHRyaWJ1dGUgb24NCitzb21lIGVsZW1lbnQgaW4gdGhlIFhNTCBkb2N1bWVudDsgaS5lLiA8Yj5JRFJFRjwvYj4gdmFsdWVzIG11c3QgbWF0Y2ggdGhlDQordmFsdWUgb2Ygc29tZSBJRCBhdHRyaWJ1dGUuPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz0iY29uc3RyYWludCI+PHAgY2xhc3M9InByZWZpeCI+PGENCituYW1lPSJlbnRuYW1lIj48L2E+PGI+VmFsaWRpdHkgY29uc3RyYWludDogRW50aXR5IE5hbWU8L2I+PC9wPjxwPlZhbHVlcyBvZg0KK3R5cGUgPGI+RU5USVRZPC9iPiBtdXN0IG1hdGNoIHRoZSA8YSBocmVmPSIjTlQtTmFtZSI+TmFtZTwvYT4gcHJvZHVjdGlvbiwNCit2YWx1ZXMgb2YgdHlwZSA8Yj5FTlRJVElFUzwvYj4gbXVzdCBtYXRjaCA8YSBocmVmPSIjTlQtTmFtZXMiPk5hbWVzPC9hPjsgZWFjaCA8YQ0KK2hyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiBtdXN0IG1hdGNoIHRoZSBuYW1lIG9mIGFuIDxhIHRpdGxlPSJVbnBhcnNlZCBFbnRpdHkiDQoraHJlZj0iI2R0LXVucGFyc2VkIj51bnBhcnNlZCBlbnRpdHk8L2E+IGRlY2xhcmVkIGluIHRoZSA8YSB0aXRsZT0iRG9jdW1lbnQgVHlwZSBEZWNsYXJhdGlvbiINCitocmVmPSIjZHQtZG9jdHlwZSI+RFREPC9hPi48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YQ0KK25hbWU9Im5tdG9rIj48L2E+PGI+VmFsaWRpdHkgY29uc3RyYWludDogTmFtZSBUb2tlbjwvYj48L3A+PHA+VmFsdWVzIG9mIHR5cGUgPGI+Tk1UT0tFTjwvYj4NCittdXN0IG1hdGNoIHRoZSA8YSBocmVmPSIjTlQtTm10b2tlbiI+Tm10b2tlbjwvYT4gcHJvZHVjdGlvbjsgdmFsdWVzIG9mIHR5cGUgPGI+Tk1UT0tFTlM8L2I+DQorbXVzdCBtYXRjaCA8YSB0aXRsZT0iIiBocmVmPSIjTlQtTm10b2tlbnMiPk5tdG9rZW5zPC9hPi48L3A+IDwvZGl2PiAgPHA+WzxhDQordGl0bGU9IkVudW1lcmF0ZWQgQXR0cmlidXRlIFZhbHVlcyIgbmFtZT0iZHQtZW51bWVyYXRlZCI+RGVmaW5pdGlvbjwvYT46IDxiPkVudW1lcmF0ZWQNCithdHRyaWJ1dGVzPC9iPiBjYW4gdGFrZSBvbmUgb2YgYSBsaXN0IG9mIHZhbHVlcyBwcm92aWRlZCBpbiB0aGUgZGVjbGFyYXRpb25dLg0KK1RoZXJlIGFyZSB0d28ga2luZHMgb2YgZW51bWVyYXRlZCB0eXBlczo8L3A+IDxoNT5FbnVtZXJhdGVkIEF0dHJpYnV0ZSBUeXBlczwvaDU+PHRhYmxlDQorY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1FbnVtZXJhdGVkVHlwZSI+PC9hPls1N10mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5FbnVtZXJhdGVkVHlwZTwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtTm90YXRpb25UeXBlIj5Ob3RhdGlvblR5cGU8L2E+IHwgPGEgaHJlZj0iI05ULUVudW1lcmF0aW9uIj5FbnVtZXJhdGlvbjwvYT4gPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULU5vdGF0aW9uVHlwZSI+PC9hPls1OF0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5Ob3RhdGlvblR5cGU8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+J05PVEFUSU9OJyA8YSBocmVmPSIjTlQtUyI+UzwvYT4gJygnIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+DQorKDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gJ3wnIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+KSogPGENCitocmVmPSIjTlQtUyI+UzwvYT4/ICcpJyA8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI25vdGF0biI+W1ZDOiBOb3RhdGlvbiBBdHRyaWJ1dGVzXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjT25lTm90YXRpb25QZXIiPltWQzogT25lIE5vdGF0aW9uIFBlciBFbGVtZW50IFR5cGVdPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiNOb05vdGF0aW9uRW1wdHkiPltWQzogTm8gTm90YXRpb24gb24gRW1wdHkgRWxlbWVudF08L2E+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtRW51bWVyYXRpb24iPjwvYT5bNTldJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+RW51bWVyYXRpb248L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+JygnIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gPGEgaHJlZj0iI05ULU5tdG9rZW4iPk5tdG9rZW48L2E+ICg8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPj8gJ3wnIDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8gPGEgaHJlZj0iI05ULU5tdG9rZW4iPk5tdG9rZW48L2E+KSogPGENCitocmVmPSIjTlQtUyI+UzwvYT4/ICcpJzwvY29kZT48L3RkPg0KKzx0ZD48YSBocmVmPSIjZW51bSI+W1ZDOiBFbnVtZXJhdGlvbl08L2E+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+QSA8Yj5OT1RBVElPTjwvYj4gYXR0cmlidXRlIGlkZW50aWZpZXMgYSA8YSB0aXRsZT0iTm90YXRpb24iDQoraHJlZj0iI2R0LW5vdGF0aW9uIj5ub3RhdGlvbjwvYT4sIGRlY2xhcmVkIGluIHRoZSBEVEQgd2l0aCBhc3NvY2lhdGVkIHN5c3RlbQ0KK2FuZC9vciBwdWJsaWMgaWRlbnRpZmllcnMsIHRvIGJlIHVzZWQgaW4gaW50ZXJwcmV0aW5nIHRoZSBlbGVtZW50IHRvIHdoaWNoDQordGhlIGF0dHJpYnV0ZSBpcyBhdHRhY2hlZC48L3A+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhDQorbmFtZT0ibm90YXRuIj48L2E+PGI+VmFsaWRpdHkgY29uc3RyYWludDogTm90YXRpb24gQXR0cmlidXRlczwvYj48L3A+PHA+VmFsdWVzDQorb2YgdGhpcyB0eXBlIG11c3QgbWF0Y2ggb25lIG9mIHRoZSA8YSBocmVmPSIjTm90YXRpb25zIj48Y2l0ZT5ub3RhdGlvbjwvY2l0ZT48L2E+DQorbmFtZXMgaW5jbHVkZWQgaW4gdGhlIGRlY2xhcmF0aW9uOyBhbGwgbm90YXRpb24gbmFtZXMgaW4gdGhlIGRlY2xhcmF0aW9uIG11c3QNCitiZSBkZWNsYXJlZC48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJPbmVOb3RhdGlvblBlciI+PC9hPjxiPlZhbGlkaXR5DQorY29uc3RyYWludDogT25lIE5vdGF0aW9uIFBlciBFbGVtZW50IFR5cGU8L2I+PC9wPjxwPk5vIGVsZW1lbnQgdHlwZSBtYXkgaGF2ZQ0KK21vcmUgdGhhbiBvbmUgPGI+Tk9UQVRJT048L2I+IGF0dHJpYnV0ZSBzcGVjaWZpZWQuPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz0iY29uc3RyYWludCI+PHANCitjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJOb05vdGF0aW9uRW1wdHkiPjwvYT48Yj5WYWxpZGl0eSBjb25zdHJhaW50OiBObyBOb3RhdGlvbg0KK29uIEVtcHR5IEVsZW1lbnQ8L2I+PC9wPjxwPjxhIHRpdGxlPSJGb3IgQ29tcGF0aWJpbGl0eSIgaHJlZj0iI2R0LWNvbXBhdCI+Rm9yDQorY29tcGF0aWJpbGl0eTwvYT4sIGFuIGF0dHJpYnV0ZSBvZiB0eXBlIDxiPk5PVEFUSU9OPC9iPiBtdXN0IG5vdCBiZSBkZWNsYXJlZA0KK29uIGFuIGVsZW1lbnQgZGVjbGFyZWQgPGI+RU1QVFk8L2I+LjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwDQorY2xhc3M9InByZWZpeCI+PGEgbmFtZT0iZW51bSI+PC9hPjxiPlZhbGlkaXR5IGNvbnN0cmFpbnQ6IEVudW1lcmF0aW9uPC9iPjwvcD48cD5WYWx1ZXMNCitvZiB0aGlzIHR5cGUgbXVzdCBtYXRjaCBvbmUgb2YgdGhlIDxhIGhyZWY9IiNOVC1ObXRva2VuIj5ObXRva2VuPC9hPiB0b2tlbnMNCitpbiB0aGUgZGVjbGFyYXRpb24uPC9wPiA8L2Rpdj4gPHA+PGEgdGl0bGU9IkZvciBpbnRlcm9wZXJhYmlsaXR5IiBocmVmPSIjZHQtaW50ZXJvcCI+Rm9yDQoraW50ZXJvcGVyYWJpbGl0eSw8L2E+IHRoZSBzYW1lIDxhIGhyZWY9IiNOVC1ObXRva2VuIj5ObXRva2VuPC9hPiBzaG91bGQgbm90DQorb2NjdXIgbW9yZSB0aGFuIG9uY2UgaW4gdGhlIGVudW1lcmF0ZWQgYXR0cmlidXRlIHR5cGVzIG9mIGEgc2luZ2xlIGVsZW1lbnQNCit0eXBlLjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjMiPiA8aDQ+PGEgbmFtZT0ic2VjLWF0dHItZGVmYXVsdHMiPjwvYT4zLjMuMg0KK0F0dHJpYnV0ZSBEZWZhdWx0czwvaDQ+IDxwPkFuIDxhIHRpdGxlPSJBdHRyaWJ1dGUtTGlzdCBEZWNsYXJhdGlvbiIgaHJlZj0iI2R0LWF0dGRlY2wiPmF0dHJpYnV0ZQ0KK2RlY2xhcmF0aW9uPC9hPiBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB3aGV0aGVyIHRoZSBhdHRyaWJ1dGUncyBwcmVzZW5jZSBpcw0KK3JlcXVpcmVkLCBhbmQgaWYgbm90LCBob3cgYW4gWE1MIHByb2Nlc3NvciBzaG91bGQgcmVhY3QgaWYgYSBkZWNsYXJlZCBhdHRyaWJ1dGUNCitpcyBhYnNlbnQgaW4gYSBkb2N1bWVudC48L3A+IDxoNT5BdHRyaWJ1dGUgRGVmYXVsdHM8L2g1Pjx0YWJsZSBjbGFzcz0ic2NyYXAiPg0KKzx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULURlZmF1bHREZWNsIj48L2E+WzYwXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkRlZmF1bHREZWNsPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicjUkVRVUlSRUQnIHwmbmJzcDsnI0lNUExJRUQnIDwvY29kZT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48Y29kZT58ICgoJyNGSVhFRCcgUyk/IDxhIGhyZWY9IiNOVC1BdHRWYWx1ZSI+QXR0VmFsdWU8L2E+KTwvY29kZT48L3RkPg0KKzx0ZD48YSBocmVmPSIjUmVxdWlyZWRBdHRyIj5bVkM6IFJlcXVpcmVkIEF0dHJpYnV0ZV08L2E+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI2RlZmF0dHJ2YWxpZCI+W1ZDOiBBdHRyaWJ1dGUgRGVmYXVsdCBMZWdhbF08L2E+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI0NsZWFuQXR0clZhbHMiPltXRkM6IE5vICZsdDsgaW4gQXR0cmlidXRlIFZhbHVlc108L2E+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI0ZpeGVkQXR0ciI+W1ZDOiBGaXhlZCBBdHRyaWJ1dGUgRGVmYXVsdF08L2E+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+SW4gYW4gYXR0cmlidXRlIGRlY2xhcmF0aW9uLCA8Yj4jUkVRVUlSRUQ8L2I+IG1lYW5zIHRoYXQNCit0aGUgYXR0cmlidXRlIG11c3QgYWx3YXlzIGJlIHByb3ZpZGVkLCA8Yj4jSU1QTElFRDwvYj4gdGhhdCBubyBkZWZhdWx0IHZhbHVlDQoraXMgcHJvdmlkZWQuICBbPGEgdGl0bGU9IkF0dHJpYnV0ZSBEZWZhdWx0IiBuYW1lPSJkdC1kZWZhdWx0Ij5EZWZpbml0aW9uPC9hPjoNCitJZiB0aGUgZGVjbGFyYXRpb24gaXMgbmVpdGhlciA8Yj4jUkVRVUlSRUQ8L2I+IG5vciA8Yj4jSU1QTElFRDwvYj4sIHRoZW4gdGhlIDxhDQoraHJlZj0iI05ULUF0dFZhbHVlIj5BdHRWYWx1ZTwvYT4gdmFsdWUgY29udGFpbnMgdGhlIGRlY2xhcmVkIDxiPmRlZmF1bHQ8L2I+DQordmFsdWU7IHRoZSA8Yj4jRklYRUQ8L2I+IGtleXdvcmQgc3RhdGVzIHRoYXQgdGhlIGF0dHJpYnV0ZSBtdXN0IGFsd2F5cyBoYXZlDQordGhlIGRlZmF1bHQgdmFsdWUuIElmIGEgZGVmYXVsdCB2YWx1ZSBpcyBkZWNsYXJlZCwgd2hlbiBhbiBYTUwgcHJvY2Vzc29yIGVuY291bnRlcnMNCithbiBvbWl0dGVkIGF0dHJpYnV0ZSwgaXQgaXMgdG8gYmVoYXZlIGFzIHRob3VnaCB0aGUgYXR0cmlidXRlIHdlcmUgcHJlc2VudA0KK3dpdGggdGhlIGRlY2xhcmVkIGRlZmF1bHQgdmFsdWUuXTwvcD4gPGRpdiBjbGFzcz0iY29uc3RyYWludCI+PHAgY2xhc3M9InByZWZpeCI+PGENCituYW1lPSJSZXF1aXJlZEF0dHIiPjwvYT48Yj5WYWxpZGl0eSBjb25zdHJhaW50OiBSZXF1aXJlZCBBdHRyaWJ1dGU8L2I+PC9wPjxwPklmDQordGhlIGRlZmF1bHQgZGVjbGFyYXRpb24gaXMgdGhlIGtleXdvcmQgPGI+I1JFUVVJUkVEPC9iPiwgdGhlbiB0aGUgYXR0cmlidXRlDQorbXVzdCBiZSBzcGVjaWZpZWQgZm9yIGFsbCBlbGVtZW50cyBvZiB0aGUgdHlwZSBpbiB0aGUgYXR0cmlidXRlLWxpc3QgZGVjbGFyYXRpb24uPC9wPiA8L2Rpdj4gPGRpdg0KK2NsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJkZWZhdHRydmFsaWQiPjwvYT48Yj5WYWxpZGl0eQ0KK2NvbnN0cmFpbnQ6IEF0dHJpYnV0ZSBEZWZhdWx0IExlZ2FsPC9iPjwvcD48cD5UaGUgZGVjbGFyZWQgZGVmYXVsdCB2YWx1ZSBtdXN0DQorbWVldCB0aGUgbGV4aWNhbCBjb25zdHJhaW50cyBvZiB0aGUgZGVjbGFyZWQgYXR0cmlidXRlIHR5cGUuPC9wPiA8L2Rpdj4gPGRpdg0KK2NsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJGaXhlZEF0dHIiPjwvYT48Yj5WYWxpZGl0eSBjb25zdHJhaW50Og0KK0ZpeGVkIEF0dHJpYnV0ZSBEZWZhdWx0PC9iPjwvcD48cD5JZiBhbiBhdHRyaWJ1dGUgaGFzIGEgZGVmYXVsdCB2YWx1ZSBkZWNsYXJlZA0KK3dpdGggdGhlIDxiPiNGSVhFRDwvYj4ga2V5d29yZCwgaW5zdGFuY2VzIG9mIHRoYXQgYXR0cmlidXRlIG11c3QgbWF0Y2ggdGhlDQorZGVmYXVsdCB2YWx1ZS48L3A+IDwvZGl2PiA8cD5FeGFtcGxlcyBvZiBhdHRyaWJ1dGUtbGlzdCBkZWNsYXJhdGlvbnM6PC9wPiA8dGFibGUNCitjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0OyFBVFRMSVNUIHRlcm1kZWYNCisgICAgICAgICAgaWQgICAgICBJRCAgICAgICNSRVFVSVJFRA0KKyAgICAgICAgICBuYW1lICAgIENEQVRBICAgI0lNUExJRUQ+DQorJmx0OyFBVFRMSVNUIGxpc3QNCisgICAgICAgICAgdHlwZSAgICAoYnVsbGV0c3xvcmRlcmVkfGdsb3NzYXJ5KSAgIm9yZGVyZWQiPg0KKyZsdDshQVRUTElTVCBmb3JtDQorICAgICAgICAgIG1ldGhvZCAgQ0RBVEEgICAjRklYRUQgIlBPU1QiPjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MyI+IDxoND48YSBuYW1lPSJBVk5vcm1hbGl6ZSI+PC9hPjMuMy4zIEF0dHJpYnV0ZS1WYWx1ZQ0KK05vcm1hbGl6YXRpb248L2g0PiA8cD5CZWZvcmUgdGhlIHZhbHVlIG9mIGFuIGF0dHJpYnV0ZSBpcyBwYXNzZWQgdG8gdGhlIGFwcGxpY2F0aW9uDQorb3IgY2hlY2tlZCBmb3IgdmFsaWRpdHksIHRoZSBYTUwgcHJvY2Vzc29yIG11c3Qgbm9ybWFsaXplIHRoZSBhdHRyaWJ1dGUgdmFsdWUNCitieSBhcHBseWluZyB0aGUgYWxnb3JpdGhtIGJlbG93LCBvciBieSB1c2luZyBzb21lIG90aGVyIG1ldGhvZCBzdWNoIHRoYXQgdGhlDQordmFsdWUgcGFzc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiBpcyB0aGUgc2FtZSBhcyB0aGF0IHByb2R1Y2VkIGJ5IHRoZSBhbGdvcml0aG0uPC9wPiA8b2w+DQorPGxpPjxwPkFsbCBsaW5lIGJyZWFrcyBtdXN0IGhhdmUgYmVlbiBub3JtYWxpemVkIG9uIGlucHV0IHRvICN4QSBhcyBkZXNjcmliZWQNCitpbiA8YSBocmVmPSIjc2VjLWxpbmUtZW5kcyI+PGI+Mi4xMSBFbmQtb2YtTGluZSBIYW5kbGluZzwvYj48L2E+LCBzbyB0aGUgcmVzdA0KK29mIHRoaXMgYWxnb3JpdGhtIG9wZXJhdGVzIG9uIHRleHQgbm9ybWFsaXplZCBpbiB0aGlzIHdheS48L3A+PC9saT4NCis8bGk+PHA+QmVnaW4gd2l0aCBhIG5vcm1hbGl6ZWQgdmFsdWUgY29uc2lzdGluZyBvZiB0aGUgZW1wdHkgc3RyaW5nLjwvcD4gPC9saT4NCis8bGk+PHA+Rm9yIGVhY2ggY2hhcmFjdGVyLCBlbnRpdHkgcmVmZXJlbmNlLCBvciBjaGFyYWN0ZXIgcmVmZXJlbmNlIGluIHRoZQ0KK3Vubm9ybWFsaXplZCBhdHRyaWJ1dGUgdmFsdWUsIGJlZ2lubmluZyB3aXRoIHRoZSBmaXJzdCBhbmQgY29udGludWluZyB0byB0aGUNCitsYXN0LCBkbyB0aGUgZm9sbG93aW5nOjwvcD4gPHVsPg0KKzxsaT48cD5Gb3IgYSBjaGFyYWN0ZXIgcmVmZXJlbmNlLCBhcHBlbmQgdGhlIHJlZmVyZW5jZWQgY2hhcmFjdGVyIHRvIHRoZSBub3JtYWxpemVkDQordmFsdWUuPC9wPjwvbGk+DQorPGxpPjxwPkZvciBhbiBlbnRpdHkgcmVmZXJlbmNlLCByZWN1cnNpdmVseSBhcHBseSBzdGVwIDMgb2YgdGhpcyBhbGdvcml0aG0NCit0byB0aGUgcmVwbGFjZW1lbnQgdGV4dCBvZiB0aGUgZW50aXR5LjwvcD48L2xpPg0KKzxsaT48cD5Gb3IgYSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXIgKCN4MjAsICN4RCwgI3hBLCAjeDkpLCBhcHBlbmQgYSBzcGFjZSBjaGFyYWN0ZXINCisoI3gyMCkgdG8gdGhlIG5vcm1hbGl6ZWQgdmFsdWUuPC9wPjwvbGk+DQorPGxpPjxwPkZvciBhbm90aGVyIGNoYXJhY3RlciwgYXBwZW5kIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIG5vcm1hbGl6ZWQgdmFsdWUuPC9wPiA8L2xpPg0KKzwvdWw+IDwvbGk+DQorPC9vbD4gPHA+SWYgdGhlIGF0dHJpYnV0ZSB0eXBlIGlzIG5vdCBDREFUQSwgdGhlbiB0aGUgWE1MIHByb2Nlc3NvciBtdXN0IGZ1cnRoZXINCitwcm9jZXNzIHRoZSBub3JtYWxpemVkIGF0dHJpYnV0ZSB2YWx1ZSBieSBkaXNjYXJkaW5nIGFueSBsZWFkaW5nIGFuZCB0cmFpbGluZw0KK3NwYWNlICgjeDIwKSBjaGFyYWN0ZXJzLCBhbmQgYnkgcmVwbGFjaW5nIHNlcXVlbmNlcyBvZiBzcGFjZSAoI3gyMCkgY2hhcmFjdGVycw0KK2J5IGEgc2luZ2xlIHNwYWNlICgjeDIwKSBjaGFyYWN0ZXIuPC9wPiA8cD5Ob3RlIHRoYXQgaWYgdGhlIHVubm9ybWFsaXplZCBhdHRyaWJ1dGUNCit2YWx1ZSBjb250YWlucyBhIGNoYXJhY3RlciByZWZlcmVuY2UgdG8gYSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXIgb3RoZXIgdGhhbg0KK3NwYWNlICgjeDIwKSwgdGhlIG5vcm1hbGl6ZWQgdmFsdWUgY29udGFpbnMgdGhlIHJlZmVyZW5jZWQgY2hhcmFjdGVyIGl0c2VsZg0KKygjeEQsICN4QSBvciAjeDkpLiBUaGlzIGNvbnRyYXN0cyB3aXRoIHRoZSBjYXNlIHdoZXJlIHRoZSB1bm5vcm1hbGl6ZWQgdmFsdWUNCitjb250YWlucyBhIHdoaXRlIHNwYWNlIGNoYXJhY3RlciAobm90IGEgcmVmZXJlbmNlKSwgd2hpY2ggaXMgcmVwbGFjZWQgd2l0aA0KK2Egc3BhY2UgY2hhcmFjdGVyICgjeDIwKSBpbiB0aGUgbm9ybWFsaXplZCB2YWx1ZSBhbmQgYWxzbyBjb250cmFzdHMgd2l0aCB0aGUNCitjYXNlIHdoZXJlIHRoZSB1bm5vcm1hbGl6ZWQgdmFsdWUgY29udGFpbnMgYW4gZW50aXR5IHJlZmVyZW5jZSB3aG9zZSByZXBsYWNlbWVudA0KK3RleHQgY29udGFpbnMgYSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXI7IGJlaW5nIHJlY3Vyc2l2ZWx5IHByb2Nlc3NlZCwgdGhlIHdoaXRlDQorc3BhY2UgY2hhcmFjdGVyIGlzIHJlcGxhY2VkIHdpdGggYSBzcGFjZSBjaGFyYWN0ZXIgKCN4MjApIGluIHRoZSBub3JtYWxpemVkDQordmFsdWUuPC9wPiA8cD5BbGwgYXR0cmlidXRlcyBmb3Igd2hpY2ggbm8gZGVjbGFyYXRpb24gaGFzIGJlZW4gcmVhZCBzaG91bGQNCitiZSB0cmVhdGVkIGJ5IGEgbm9uLXZhbGlkYXRpbmcgcHJvY2Vzc29yIGFzIGlmIGRlY2xhcmVkIDxiPkNEQVRBPC9iPi48L3A+IDxwPkZvbGxvd2luZw0KK2FyZSBleGFtcGxlcyBvZiBhdHRyaWJ1dGUgbm9ybWFsaXphdGlvbi4gR2l2ZW4gdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnM6PC9wPiA8dGFibGUNCitjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0OyFFTlRJVFkgZCAiJmFtcDsjeEQ7Ij4NCismbHQ7IUVOVElUWSBhICImYW1wOyN4QTsiPg0KKyZsdDshRU5USVRZIGRhICImYW1wOyN4RDsmYW1wOyN4QTsiPjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8cD50aGUgYXR0cmlidXRlIHNwZWNpZmljYXRpb25zIGluIHRoZSBsZWZ0IGNvbHVtbiBiZWxvdyB3b3VsZCBiZQ0KK25vcm1hbGl6ZWQgdG8gdGhlIGNoYXJhY3RlciBzZXF1ZW5jZXMgb2YgdGhlIG1pZGRsZSBjb2x1bW4gaWYgdGhlIGF0dHJpYnV0ZSA8Y29kZT5hPC9jb2RlPg0KK2lzIGRlY2xhcmVkIDxiPk5NVE9LRU5TPC9iPiBhbmQgdG8gdGhvc2Ugb2YgdGhlIHJpZ2h0IGNvbHVtbnMgaWYgPGNvZGU+YTwvY29kZT4NCitpcyBkZWNsYXJlZCA8Yj5DREFUQTwvYj4uPC9wPiA8dGFibGUgYm9yZGVyPSIxIiBmcmFtZT0iYm9yZGVyIj48dGhlYWQ+DQorPHRyPg0KKzx0aCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj5BdHRyaWJ1dGUgc3BlY2lmaWNhdGlvbjwvdGg+DQorPHRoIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPmEgaXMgTk1UT0tFTlM8L3RoPg0KKzx0aCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj5hIGlzIENEQVRBPC90aD4NCis8L3RyPg0KKzwvdGhlYWQ+PHRib2R5Pg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiDQorYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPmE9Ig0KKw0KK3h5eiI8L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48Y29kZT54IHkgejwvY29kZT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48Y29kZT4jeDIwICN4MjAgeCB5IHo8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiDQorYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPmE9IiZhbXA7ZDsmYW1wO2Q7QSZhbXA7YTsmYW1wO2E7QiZhbXA7ZGE7IjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPkEgI3gyMCBCPC9jb2RlPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPiN4MjAgI3gyMCBBICN4MjAgI3gyMCBCICN4MjAgI3gyMDwvY29kZT48L3RkPg0KKzwvdHI+DQorPHRyPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48dGFibGUgY2xhc3M9ImVnIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSINCitiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+YT0NCisiJmFtcDsjeGQ7JmFtcDsjeGQ7QSZhbXA7I3hhOyZhbXA7I3hhO0ImYW1wOyN4ZDsmYW1wOyN4YTsiPC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGNvZGU+I3hEICN4RCBBICN4QSAjeEEgQiAjeEQgI3hBPC9jb2RlPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPiN4RCAjeEQgQSAjeEEgI3hBIEIgI3hEICN4RDwvY29kZT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5Ob3RlIHRoYXQgdGhlIGxhc3QgZXhhbXBsZSBpcyBpbnZhbGlkIChidXQgd2VsbC1mb3JtZWQpDQoraWYgPGNvZGU+YTwvY29kZT4gaXMgZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSA8Yj5OTVRPS0VOUzwvYj4uPC9wPiA8L2Rpdj4gPC9kaXY+IDxkaXYNCitjbGFzcz0iZGl2MiI+IDxoMz48YSBuYW1lPSJzZWMtY29uZGl0aW9uLXNlY3QiPjwvYT4zLjQgQ29uZGl0aW9uYWwgU2VjdGlvbnM8L2gzPiA8cD5bPGENCit0aXRsZT0iY29uZGl0aW9uYWwgc2VjdGlvbiIgbmFtZT0iZHQtY29uZC1zZWN0aW9uIj5EZWZpbml0aW9uPC9hPjogIDxiPkNvbmRpdGlvbmFsDQorc2VjdGlvbnM8L2I+IGFyZSBwb3J0aW9ucyBvZiB0aGUgPGEgdGl0bGU9IkRvY3VtZW50IFR5cGUgRGVjbGFyYXRpb24iIGhyZWY9IiNkdC1kb2N0eXBlIj5kb2N1bWVudA0KK3R5cGUgZGVjbGFyYXRpb24gZXh0ZXJuYWwgc3Vic2V0PC9hPiB3aGljaCBhcmUgaW5jbHVkZWQgaW4sIG9yIGV4Y2x1ZGVkIGZyb20sDQordGhlIGxvZ2ljYWwgc3RydWN0dXJlIG9mIHRoZSBEVEQgYmFzZWQgb24gdGhlIGtleXdvcmQgd2hpY2ggZ292ZXJucyB0aGVtLl08L3A+IDxoNT5Db25kaXRpb25hbA0KK1NlY3Rpb248L2g1Pjx0YWJsZSBjbGFzcz0ic2NyYXAiPjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULWNvbmRpdGlvbmFsU2VjdCI+PC9hPls2MV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5jb25kaXRpb25hbFNlY3Q8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULWluY2x1ZGVTZWN0Ij5pbmNsdWRlU2VjdDwvYT4gfCA8YSBocmVmPSIjTlQtaWdub3JlU2VjdCI+aWdub3JlU2VjdDwvYT4gPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULWluY2x1ZGVTZWN0Ij48L2E+WzYyXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPmluY2x1ZGVTZWN0PC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicmbHQ7IVsnIFM/ICdJTkNMVURFJyBTPyAnWycgPGEgaHJlZj0iI05ULWV4dFN1YnNldERlY2wiPmV4dFN1YnNldERlY2w8L2E+DQorJ11dJmd0OycgPC9jb2RlPjwvdGQ+DQorPHRkPjxpPi8qICAqLzwvaT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjY29uZHNlYy1uZXN0aW5nIj5bVkM6IFByb3BlciBDb25kaXRpb25hbCBTZWN0aW9uL1BFIE5lc3RpbmddPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULWlnbm9yZVNlY3QiPjwvYT5bNjNdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+aWdub3JlU2VjdDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nJmx0OyFbJyBTPyAnSUdOT1JFJyBTPyAnWycgPGEgaHJlZj0iI05ULWlnbm9yZVNlY3RDb250ZW50cyI+aWdub3JlU2VjdENvbnRlbnRzPC9hPioNCisnXV0mZ3Q7JzwvY29kZT48L3RkPg0KKzx0ZD48aT4vKiAgKi88L2k+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI2NvbmRzZWMtbmVzdGluZyI+W1ZDOiBQcm9wZXIgQ29uZGl0aW9uYWwgU2VjdGlvbi9QRSBOZXN0aW5nXTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1pZ25vcmVTZWN0Q29udGVudHMiPjwvYT5bNjRdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+aWdub3JlU2VjdENvbnRlbnRzPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1JZ25vcmUiPklnbm9yZTwvYT4gKCcmbHQ7IVsnIDxhIGhyZWY9IiNOVC1pZ25vcmVTZWN0Q29udGVudHMiPmlnbm9yZVNlY3RDb250ZW50czwvYT4NCisnXV0mZ3Q7JyA8YSBocmVmPSIjTlQtSWdub3JlIj5JZ25vcmU8L2E+KSo8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtSWdub3JlIj48L2E+WzY1XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPklnbm9yZTwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtQ2hhciI+Q2hhcjwvYT4qIC0gKDxhIGhyZWY9IiNOVC1DaGFyIj5DaGFyPC9hPiogKCcmbHQ7IVsnDQorfCAnXV0mZ3Q7JykgPGEgaHJlZj0iI05ULUNoYXIiPkNoYXI8L2E+KikgPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhIG5hbWU9ImNvbmRzZWMtbmVzdGluZyI+PC9hPjxiPlZhbGlkaXR5DQorY29uc3RyYWludDogUHJvcGVyIENvbmRpdGlvbmFsIFNlY3Rpb24vUEUgTmVzdGluZzwvYj48L3A+PHA+SWYgYW55IG9mIHRoZQ0KKyI8Y29kZT4mbHQ7IVs8L2NvZGU+IiwgIjxjb2RlPls8L2NvZGU+Iiwgb3IgIjxjb2RlPl1dJmd0OzwvY29kZT4iIG9mIGEgY29uZGl0aW9uYWwNCitzZWN0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVwbGFjZW1lbnQgdGV4dCBmb3IgYSBwYXJhbWV0ZXItZW50aXR5IHJlZmVyZW5jZSwNCithbGwgb2YgdGhlbSBtdXN0IGJlIGNvbnRhaW5lZCBpbiB0aGUgc2FtZSByZXBsYWNlbWVudCB0ZXh0LjwvcD4gPC9kaXY+IDxwPkxpa2UNCit0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIERURCBzdWJzZXRzLCBhIGNvbmRpdGlvbmFsIHNlY3Rpb24gbWF5IGNvbnRhaW4gb25lDQorb3IgbW9yZSBjb21wbGV0ZSBkZWNsYXJhdGlvbnMsIGNvbW1lbnRzLCBwcm9jZXNzaW5nIGluc3RydWN0aW9ucywgb3IgbmVzdGVkDQorY29uZGl0aW9uYWwgc2VjdGlvbnMsIGludGVybWluZ2xlZCB3aXRoIHdoaXRlIHNwYWNlLjwvcD4gPHA+SWYgdGhlIGtleXdvcmQNCitvZiB0aGUgY29uZGl0aW9uYWwgc2VjdGlvbiBpcyA8Yj5JTkNMVURFPC9iPiwgdGhlbiB0aGUgY29udGVudHMgb2YgdGhlIGNvbmRpdGlvbmFsDQorc2VjdGlvbiBhcmUgcGFydCBvZiB0aGUgRFRELiBJZiB0aGUga2V5d29yZCBvZiB0aGUgY29uZGl0aW9uYWwgc2VjdGlvbiBpcyA8Yj5JR05PUkU8L2I+LA0KK3RoZW4gdGhlIGNvbnRlbnRzIG9mIHRoZSBjb25kaXRpb25hbCBzZWN0aW9uIGFyZSBub3QgbG9naWNhbGx5IHBhcnQgb2YgdGhlDQorRFRELiAgSWYgYSBjb25kaXRpb25hbCBzZWN0aW9uIHdpdGggYSBrZXl3b3JkIG9mIDxiPklOQ0xVREU8L2I+IG9jY3VycyB3aXRoaW4NCithIGxhcmdlciBjb25kaXRpb25hbCBzZWN0aW9uIHdpdGggYSBrZXl3b3JkIG9mIDxiPklHTk9SRTwvYj4sIGJvdGggdGhlIG91dGVyDQorYW5kIHRoZSBpbm5lciBjb25kaXRpb25hbCBzZWN0aW9ucyBhcmUgaWdub3JlZC4gVGhlIGNvbnRlbnRzIG9mIGFuIGlnbm9yZWQNCitjb25kaXRpb25hbCBzZWN0aW9uIGFyZSBwYXJzZWQgYnkgaWdub3JpbmcgYWxsIGNoYXJhY3RlcnMgYWZ0ZXIgdGhlICI8Y29kZT5bPC9jb2RlPiINCitmb2xsb3dpbmcgdGhlIGtleXdvcmQsIGV4Y2VwdCBjb25kaXRpb25hbCBzZWN0aW9uIHN0YXJ0cyAiPGNvZGU+Jmx0OyFbPC9jb2RlPiINCithbmQgZW5kcyAiPGNvZGU+XV0mZ3Q7PC9jb2RlPiIsIHVudGlsIHRoZSBtYXRjaGluZyBjb25kaXRpb25hbCBzZWN0aW9uIGVuZA0KK2lzIGZvdW5kLiBQYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZXMgYXJlIG5vdCByZWNvZ25pemVkIGluIHRoaXMgcHJvY2Vzcy48L3A+IDxwPklmDQordGhlIGtleXdvcmQgb2YgdGhlIGNvbmRpdGlvbmFsIHNlY3Rpb24gaXMgYSBwYXJhbWV0ZXItZW50aXR5IHJlZmVyZW5jZSwgdGhlDQorcGFyYW1ldGVyIGVudGl0eSBtdXN0IGJlIHJlcGxhY2VkIGJ5IGl0cyBjb250ZW50IGJlZm9yZSB0aGUgcHJvY2Vzc29yIGRlY2lkZXMNCit3aGV0aGVyIHRvIGluY2x1ZGUgb3IgaWdub3JlIHRoZSBjb25kaXRpb25hbCBzZWN0aW9uLjwvcD4gPHA+QW4gZXhhbXBsZTo8L3A+IDx0YWJsZQ0KK2NsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7IUVOVElUWSAlIGRyYWZ0ICdJTkNMVURFJyA+DQorJmx0OyFFTlRJVFkgJSBmaW5hbCAnSUdOT1JFJyA+DQorDQorJmx0OyFbJWRyYWZ0O1sNCismbHQ7IUVMRU1FTlQgYm9vayAoY29tbWVudHMqLCB0aXRsZSwgYm9keSwgc3VwcGxlbWVudHM/KT4NCitdXSZndDsNCismbHQ7IVslZmluYWw7Ww0KKyZsdDshRUxFTUVOVCBib29rICh0aXRsZSwgYm9keSwgc3VwcGxlbWVudHM/KT4NCitdXSZndDs8L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPC9kaXY+ICA8L2Rpdj4gIDxkaXYgY2xhc3M9ImRpdjEiPiA8aDI+PGEgbmFtZT0ic2VjLXBoeXNpY2FsLXN0cnVjdCI+PC9hPjQNCitQaHlzaWNhbCBTdHJ1Y3R1cmVzPC9oMj4gPHA+WzxhIHRpdGxlPSJFbnRpdHkiIG5hbWU9ImR0LWVudGl0eSI+RGVmaW5pdGlvbjwvYT46DQorQW4gWE1MIGRvY3VtZW50IG1heSBjb25zaXN0IG9mIG9uZSBvciBtYW55IHN0b3JhZ2UgdW5pdHMuIFRoZXNlIGFyZSBjYWxsZWQgPGI+ZW50aXRpZXM8L2I+Ow0KK3RoZXkgYWxsIGhhdmUgPGI+Y29udGVudDwvYj4gYW5kIGFyZSBhbGwgKGV4Y2VwdCBmb3IgdGhlIDxhIHRpdGxlPSJEb2N1bWVudCBFbnRpdHkiDQoraHJlZj0iI2R0LWRvY2VudCI+ZG9jdW1lbnQgZW50aXR5PC9hPiBhbmQgdGhlIDxhIHRpdGxlPSJEb2N1bWVudCBUeXBlIERlY2xhcmF0aW9uIg0KK2hyZWY9IiNkdC1kb2N0eXBlIj5leHRlcm5hbCBEVEQgc3Vic2V0PC9hPikgaWRlbnRpZmllZCBieSBlbnRpdHkgPGI+bmFtZTwvYj4uXQ0KK0VhY2ggWE1MIGRvY3VtZW50IGhhcyBvbmUgZW50aXR5IGNhbGxlZCB0aGUgPGEgdGl0bGU9IkRvY3VtZW50IEVudGl0eSIgaHJlZj0iI2R0LWRvY2VudCI+ZG9jdW1lbnQNCitlbnRpdHk8L2E+LCB3aGljaCBzZXJ2ZXMgYXMgdGhlIHN0YXJ0aW5nIHBvaW50IGZvciB0aGUgPGEgdGl0bGU9IlhNTCBQcm9jZXNzb3IiDQoraHJlZj0iI2R0LXhtbC1wcm9jIj5YTUwgcHJvY2Vzc29yPC9hPiBhbmQgbWF5IGNvbnRhaW4gdGhlIHdob2xlIGRvY3VtZW50LjwvcD4gPHA+RW50aXRpZXMNCittYXkgYmUgZWl0aGVyIHBhcnNlZCBvciB1bnBhcnNlZC4gWzxhIHRpdGxlPSJUZXh0IEVudGl0eSIgbmFtZT0iZHQtcGFyc2VkZW50Ij5EZWZpbml0aW9uPC9hPjoNCitBIDxiPnBhcnNlZCBlbnRpdHknczwvYj4gY29udGVudHMgYXJlIHJlZmVycmVkIHRvIGFzIGl0cyA8YSB0aXRsZT0iUmVwbGFjZW1lbnQgVGV4dCINCitocmVmPSIjZHQtcmVwbHRleHQiPnJlcGxhY2VtZW50IHRleHQ8L2E+OyB0aGlzIDxhIHRpdGxlPSJUZXh0IiBocmVmPSIjZHQtdGV4dCI+dGV4dDwvYT4NCitpcyBjb25zaWRlcmVkIGFuIGludGVncmFsIHBhcnQgb2YgdGhlIGRvY3VtZW50Ll08L3A+IDxwPls8YSB0aXRsZT0iVW5wYXJzZWQgRW50aXR5Ig0KK25hbWU9ImR0LXVucGFyc2VkIj5EZWZpbml0aW9uPC9hPjogQW4gPGI+dW5wYXJzZWQgZW50aXR5PC9iPiBpcyBhIHJlc291cmNlDQord2hvc2UgY29udGVudHMgbWF5IG9yIG1heSBub3QgYmUgPGEgdGl0bGU9IlRleHQiIGhyZWY9IiNkdC10ZXh0Ij50ZXh0PC9hPiwNCithbmQgaWYgdGV4dCwgbWF5IGJlIG90aGVyIHRoYW4gWE1MLiBFYWNoIHVucGFyc2VkIGVudGl0eSBoYXMgYW4gYXNzb2NpYXRlZCA8YQ0KK3RpdGxlPSJOb3RhdGlvbiIgaHJlZj0iI2R0LW5vdGF0aW9uIj5ub3RhdGlvbjwvYT4sIGlkZW50aWZpZWQgYnkgbmFtZS4gQmV5b25kDQorYSByZXF1aXJlbWVudCB0aGF0IGFuIFhNTCBwcm9jZXNzb3IgbWFrZSB0aGUgaWRlbnRpZmllcnMgZm9yIHRoZSBlbnRpdHkgYW5kDQorbm90YXRpb24gYXZhaWxhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbiwgWE1MIHBsYWNlcyBubyBjb25zdHJhaW50cyBvbiB0aGUgY29udGVudHMNCitvZiB1bnBhcnNlZCBlbnRpdGllcy5dPC9wPiA8cD5QYXJzZWQgZW50aXRpZXMgYXJlIGludm9rZWQgYnkgbmFtZSB1c2luZyBlbnRpdHkNCityZWZlcmVuY2VzOyB1bnBhcnNlZCBlbnRpdGllcyBieSBuYW1lLCBnaXZlbiBpbiB0aGUgdmFsdWUgb2YgPGI+RU5USVRZPC9iPg0KK29yIDxiPkVOVElUSUVTPC9iPiBhdHRyaWJ1dGVzLjwvcD4gPHA+WzxhIHRpdGxlPSJnZW5lcmFsIGVudGl0eSIgbmFtZT0iZ2VuLWVudGl0eSI+RGVmaW5pdGlvbjwvYT46IDxiPkdlbmVyYWwNCitlbnRpdGllczwvYj4gYXJlIGVudGl0aWVzIGZvciB1c2Ugd2l0aGluIHRoZSBkb2N1bWVudCBjb250ZW50LiBJbiB0aGlzIHNwZWNpZmljYXRpb24sDQorZ2VuZXJhbCBlbnRpdGllcyBhcmUgc29tZXRpbWVzIHJlZmVycmVkIHRvIHdpdGggdGhlIHVucXVhbGlmaWVkIHRlcm0gPGVtPmVudGl0eTwvZW0+DQord2hlbiB0aGlzIGxlYWRzIHRvIG5vIGFtYmlndWl0eS5dIFs8YSB0aXRsZT0iUGFyYW1ldGVyIGVudGl0eSIgbmFtZT0iZHQtUEUiPkRlZmluaXRpb248L2E+OiA8Yj5QYXJhbWV0ZXINCitlbnRpdGllczwvYj4gYXJlIHBhcnNlZCBlbnRpdGllcyBmb3IgdXNlIHdpdGhpbiB0aGUgRFRELl0gVGhlc2UgdHdvIHR5cGVzDQorb2YgZW50aXRpZXMgdXNlIGRpZmZlcmVudCBmb3JtcyBvZiByZWZlcmVuY2UgYW5kIGFyZSByZWNvZ25pemVkIGluIGRpZmZlcmVudA0KK2NvbnRleHRzLiBGdXJ0aGVybW9yZSwgdGhleSBvY2N1cHkgZGlmZmVyZW50IG5hbWVzcGFjZXM7IGEgcGFyYW1ldGVyIGVudGl0eQ0KK2FuZCBhIGdlbmVyYWwgZW50aXR5IHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgdHdvIGRpc3RpbmN0IGVudGl0aWVzLjwvcD4gPGRpdg0KK2NsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9InNlYy1yZWZlcmVuY2VzIj48L2E+NC4xIENoYXJhY3RlciBhbmQgRW50aXR5IFJlZmVyZW5jZXM8L2gzPiA8cD5bPGENCit0aXRsZT0iQ2hhcmFjdGVyIFJlZmVyZW5jZSIgbmFtZT0iZHQtY2hhcnJlZiI+RGVmaW5pdGlvbjwvYT46ICBBIDxiPmNoYXJhY3Rlcg0KK3JlZmVyZW5jZTwvYj4gcmVmZXJzIHRvIGEgc3BlY2lmaWMgY2hhcmFjdGVyIGluIHRoZSBJU08vSUVDIDEwNjQ2IGNoYXJhY3Rlcg0KK3NldCwgZm9yIGV4YW1wbGUgb25lIG5vdCBkaXJlY3RseSBhY2Nlc3NpYmxlIGZyb20gYXZhaWxhYmxlIGlucHV0IGRldmljZXMuXTwvcD4gPGg1PkNoYXJhY3Rlcg0KK1JlZmVyZW5jZTwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtQ2hhclJlZiI+PC9hPls2Nl0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5DaGFyUmVmPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicmYW1wOyMnIFswLTldKyAnOycgPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxjb2RlPnwgJyZhbXA7I3gnIFswLTlhLWZBLUZdKyAnOyc8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI3dmLUxlZ2FsY2hhciI+W1dGQzogTGVnYWwgQ2hhcmFjdGVyXTwvYT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJ3Zi1MZWdhbGNoYXIiPjwvYT48Yj5XZWxsLWZvcm1lZG5lc3MNCitjb25zdHJhaW50OiBMZWdhbCBDaGFyYWN0ZXI8L2I+PC9wPjxwPkNoYXJhY3RlcnMgcmVmZXJyZWQgdG8gdXNpbmcgY2hhcmFjdGVyDQorcmVmZXJlbmNlcyBtdXN0IG1hdGNoIHRoZSBwcm9kdWN0aW9uIGZvciA8YSB0aXRsZT0iIiBocmVmPSIjTlQtQ2hhciI+Q2hhcjwvYT4uPC9wPiA8L2Rpdj4gPHA+SWYNCit0aGUgY2hhcmFjdGVyIHJlZmVyZW5jZSBiZWdpbnMgd2l0aCAiPGNvZGU+JmFtcDsjeDwvY29kZT4iLCB0aGUgZGlnaXRzIGFuZA0KK2xldHRlcnMgdXAgdG8gdGhlIHRlcm1pbmF0aW5nIDxjb2RlPjs8L2NvZGU+IHByb3ZpZGUgYSBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbg0KK29mIHRoZSBjaGFyYWN0ZXIncyBjb2RlIHBvaW50IGluIElTTy9JRUMgMTA2NDYuIElmIGl0IGJlZ2lucyBqdXN0IHdpdGggIjxjb2RlPiZhbXA7IzwvY29kZT4iLA0KK3RoZSBkaWdpdHMgdXAgdG8gdGhlIHRlcm1pbmF0aW5nIDxjb2RlPjs8L2NvZGU+IHByb3ZpZGUgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uDQorb2YgdGhlIGNoYXJhY3RlcidzIGNvZGUgcG9pbnQuPC9wPiA8cD5bPGEgdGl0bGU9IkVudGl0eSBSZWZlcmVuY2UiIG5hbWU9ImR0LWVudHJlZiI+RGVmaW5pdGlvbjwvYT46DQorQW4gPGI+ZW50aXR5IHJlZmVyZW5jZTwvYj4gcmVmZXJzIHRvIHRoZSBjb250ZW50IG9mIGEgbmFtZWQgZW50aXR5Ll0gWzxhIHRpdGxlPSJHZW5lcmFsIEVudGl0eSBSZWZlcmVuY2UiDQorbmFtZT0iZHQtR0VSZWYiPkRlZmluaXRpb248L2E+OiBSZWZlcmVuY2VzIHRvIHBhcnNlZCBnZW5lcmFsIGVudGl0aWVzIHVzZQ0KK2FtcGVyc2FuZCAoPGNvZGU+JmFtcDs8L2NvZGU+KSBhbmQgc2VtaWNvbG9uICg8Y29kZT47PC9jb2RlPikgYXMgZGVsaW1pdGVycy5dDQorWzxhIHRpdGxlPSJQYXJhbWV0ZXItZW50aXR5IHJlZmVyZW5jZSIgbmFtZT0iZHQtUEVSZWYiPkRlZmluaXRpb248L2E+OiAgPGI+UGFyYW1ldGVyLWVudGl0eQ0KK3JlZmVyZW5jZXM8L2I+IHVzZSBwZXJjZW50LXNpZ24gKDxjb2RlPiU8L2NvZGU+KSBhbmQgc2VtaWNvbG9uICg8Y29kZT47PC9jb2RlPikNCithcyBkZWxpbWl0ZXJzLl08L3A+IDxoNT5FbnRpdHkgUmVmZXJlbmNlPC9oNT48dGFibGUgY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1SZWZlcmVuY2UiPjwvYT5bNjddJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+UmVmZXJlbmNlPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1FbnRpdHlSZWYiPkVudGl0eVJlZjwvYT4gfCA8YSBocmVmPSIjTlQtQ2hhclJlZiI+Q2hhclJlZjwvYT48L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtRW50aXR5UmVmIj48L2E+WzY4XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkVudGl0eVJlZjwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nJmFtcDsnIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiAnOyc8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI3dmLWVudGRlY2xhcmVkIj5bV0ZDOiBFbnRpdHkgRGVjbGFyZWRdPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiN2Yy1lbnRkZWNsYXJlZCI+W1ZDOiBFbnRpdHkgRGVjbGFyZWRdPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiN0ZXh0ZW50Ij5bV0ZDOiBQYXJzZWQgRW50aXR5XTwvYT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48L3RkPg0KKzx0ZD48YSBocmVmPSIjbm9yZWN1cnNpb24iPltXRkM6IE5vIFJlY3Vyc2lvbl08L2E+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtUEVSZWZlcmVuY2UiPjwvYT5bNjldJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+UEVSZWZlcmVuY2U8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+JyUnIDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiAnOyc8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI3ZjLWVudGRlY2xhcmVkIj5bVkM6IEVudGl0eSBEZWNsYXJlZF08L2E+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI25vcmVjdXJzaW9uIj5bV0ZDOiBObyBSZWN1cnNpb25dPC9hPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjwvdGQ+DQorPHRkPjxhIGhyZWY9IiNpbmR0ZCI+W1dGQzogSW4gRFREXTwvYT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJ3Zi1lbnRkZWNsYXJlZCI+PC9hPjxiPldlbGwtZm9ybWVkbmVzcw0KK2NvbnN0cmFpbnQ6IEVudGl0eSBEZWNsYXJlZDwvYj48L3A+PHA+SW4gYSBkb2N1bWVudCB3aXRob3V0IGFueSBEVEQsIGEgZG9jdW1lbnQNCit3aXRoIG9ubHkgYW4gaW50ZXJuYWwgRFREIHN1YnNldCB3aGljaCBjb250YWlucyBubyBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZXMsDQorb3IgYSBkb2N1bWVudCB3aXRoICI8Y29kZT5zdGFuZGFsb25lPSd5ZXMnPC9jb2RlPiIsIGZvciBhbiBlbnRpdHkgcmVmZXJlbmNlDQordGhhdCBkb2VzIG5vdCBvY2N1ciB3aXRoaW4gdGhlIGV4dGVybmFsIHN1YnNldCBvciBhIHBhcmFtZXRlciBlbnRpdHksIHRoZSA8YQ0KK2hyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiBnaXZlbiBpbiB0aGUgZW50aXR5IHJlZmVyZW5jZSBtdXN0IDxhIHRpdGxlPSJtYXRjaCINCitocmVmPSIjZHQtbWF0Y2giPm1hdGNoPC9hPiB0aGF0IGluIGFuIDxhIGhyZWY9IiNzZWMtZW50aXR5LWRlY2wiPjxjaXRlPmVudGl0eQ0KK2RlY2xhcmF0aW9uPC9jaXRlPjwvYT4gdGhhdCBkb2VzIG5vdCBvY2N1ciB3aXRoaW4gdGhlIGV4dGVybmFsIHN1YnNldCBvciBhDQorcGFyYW1ldGVyIGVudGl0eSwgZXhjZXB0IHRoYXQgd2VsbC1mb3JtZWQgZG9jdW1lbnRzIG5lZWQgbm90IGRlY2xhcmUgYW55IG9mDQordGhlIGZvbGxvd2luZyBlbnRpdGllczogPGNvZGU+YW1wPC9jb2RlPiwgPGNvZGU+bHQ8L2NvZGU+LCA8Y29kZT5ndDwvY29kZT4sIDxjb2RlPmFwb3M8L2NvZGU+LCA8Y29kZT5xdW90PC9jb2RlPi4NCitUaGUgZGVjbGFyYXRpb24gb2YgYSBnZW5lcmFsIGVudGl0eSBtdXN0IHByZWNlZGUgYW55IHJlZmVyZW5jZSB0byBpdCB3aGljaA0KK2FwcGVhcnMgaW4gYSBkZWZhdWx0IHZhbHVlIGluIGFuIGF0dHJpYnV0ZS1saXN0IGRlY2xhcmF0aW9uLjwvcD4gPHA+Tm90ZSB0aGF0DQoraWYgZW50aXRpZXMgYXJlIGRlY2xhcmVkIGluIHRoZSBleHRlcm5hbCBzdWJzZXQgb3IgaW4gZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzLA0KK2Egbm9uLXZhbGlkYXRpbmcgcHJvY2Vzc29yIGlzIDxhIGhyZWY9IiNpbmNsdWRlLWlmLXZhbGlkIj48Y2l0ZT5ub3Qgb2JsaWdhdGVkDQordG88L2NpdGU+PC9hPiByZWFkIGFuZCBwcm9jZXNzIHRoZWlyIGRlY2xhcmF0aW9uczsgZm9yIHN1Y2ggZG9jdW1lbnRzLCB0aGUNCitydWxlIHRoYXQgYW4gZW50aXR5IG11c3QgYmUgZGVjbGFyZWQgaXMgYSB3ZWxsLWZvcm1lZG5lc3MgY29uc3RyYWludCBvbmx5DQoraWYgPGEgaHJlZj0iI3NlYy1ybWQiPjxjaXRlPnN0YW5kYWxvbmU9J3llcyc8L2NpdGU+PC9hPi48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cA0KK2NsYXNzPSJwcmVmaXgiPjxhIG5hbWU9InZjLWVudGRlY2xhcmVkIj48L2E+PGI+VmFsaWRpdHkgY29uc3RyYWludDogRW50aXR5DQorRGVjbGFyZWQ8L2I+PC9wPjxwPkluIGEgZG9jdW1lbnQgd2l0aCBhbiBleHRlcm5hbCBzdWJzZXQgb3IgZXh0ZXJuYWwgcGFyYW1ldGVyDQorZW50aXRpZXMgd2l0aCAiPGNvZGU+c3RhbmRhbG9uZT0nbm8nPC9jb2RlPiIsIHRoZSA8YSBocmVmPSIjTlQtTmFtZSI+TmFtZTwvYT4NCitnaXZlbiBpbiB0aGUgZW50aXR5IHJlZmVyZW5jZSBtdXN0IDxhIHRpdGxlPSJtYXRjaCIgaHJlZj0iI2R0LW1hdGNoIj5tYXRjaDwvYT4NCit0aGF0IGluIGFuIDxhIGhyZWY9IiNzZWMtZW50aXR5LWRlY2wiPjxjaXRlPmVudGl0eSBkZWNsYXJhdGlvbjwvY2l0ZT48L2E+Lg0KK0ZvciBpbnRlcm9wZXJhYmlsaXR5LCB2YWxpZCBkb2N1bWVudHMgc2hvdWxkIGRlY2xhcmUgdGhlIGVudGl0aWVzIDxjb2RlPmFtcDwvY29kZT4sIDxjb2RlPmx0PC9jb2RlPiwgPGNvZGU+Z3Q8L2NvZGU+LCA8Y29kZT5hcG9zPC9jb2RlPiwgPGNvZGU+cXVvdDwvY29kZQ0KKz4sIGluIHRoZSBmb3JtIHNwZWNpZmllZCBpbiA8YSBocmVmPSIjc2VjLXByZWRlZmluZWQtZW50Ij48Yj40LjYgUHJlZGVmaW5lZA0KK0VudGl0aWVzPC9iPjwvYT4uIFRoZSBkZWNsYXJhdGlvbiBvZiBhIHBhcmFtZXRlciBlbnRpdHkgbXVzdCBwcmVjZWRlIGFueSByZWZlcmVuY2UNCit0byBpdC4gU2ltaWxhcmx5LCB0aGUgZGVjbGFyYXRpb24gb2YgYSBnZW5lcmFsIGVudGl0eSBtdXN0IHByZWNlZGUgYW55IGF0dHJpYnV0ZS1saXN0DQorZGVjbGFyYXRpb24gY29udGFpbmluZyBhIGRlZmF1bHQgdmFsdWUgd2l0aCBhIGRpcmVjdCBvciBpbmRpcmVjdCByZWZlcmVuY2UNCit0byB0aGF0IGdlbmVyYWwgZW50aXR5LjwvcD4gPC9kaXY+ICA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cCBjbGFzcz0icHJlZml4Ij48YQ0KK25hbWU9InRleHRlbnQiPjwvYT48Yj5XZWxsLWZvcm1lZG5lc3MgY29uc3RyYWludDogUGFyc2VkIEVudGl0eTwvYj48L3A+PHA+QW4NCitlbnRpdHkgcmVmZXJlbmNlIG11c3Qgbm90IGNvbnRhaW4gdGhlIG5hbWUgb2YgYW4gPGEgdGl0bGU9IlVucGFyc2VkIEVudGl0eSINCitocmVmPSIjZHQtdW5wYXJzZWQiPnVucGFyc2VkIGVudGl0eTwvYT4uIFVucGFyc2VkIGVudGl0aWVzIG1heSBiZSByZWZlcnJlZA0KK3RvIG9ubHkgaW4gPGEgdGl0bGU9IkF0dHJpYnV0ZSBWYWx1ZSIgaHJlZj0iI2R0LWF0dHJ2YWwiPmF0dHJpYnV0ZSB2YWx1ZXM8L2E+DQorZGVjbGFyZWQgdG8gYmUgb2YgdHlwZSA8Yj5FTlRJVFk8L2I+IG9yIDxiPkVOVElUSUVTPC9iPi48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJjb25zdHJhaW50Ij48cA0KK2NsYXNzPSJwcmVmaXgiPjxhIG5hbWU9Im5vcmVjdXJzaW9uIj48L2E+PGI+V2VsbC1mb3JtZWRuZXNzIGNvbnN0cmFpbnQ6IE5vDQorUmVjdXJzaW9uPC9iPjwvcD48cD5BIHBhcnNlZCBlbnRpdHkgbXVzdCBub3QgY29udGFpbiBhIHJlY3Vyc2l2ZSByZWZlcmVuY2UNCit0byBpdHNlbGYsIGVpdGhlciBkaXJlY3RseSBvciBpbmRpcmVjdGx5LjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwDQorY2xhc3M9InByZWZpeCI+PGEgbmFtZT0iaW5kdGQiPjwvYT48Yj5XZWxsLWZvcm1lZG5lc3MgY29uc3RyYWludDogSW4gRFREPC9iPjwvcD48cD5QYXJhbWV0ZXItZW50aXR5DQorcmVmZXJlbmNlcyBtYXkgb25seSBhcHBlYXIgaW4gdGhlIDxhIHRpdGxlPSJEb2N1bWVudCBUeXBlIERlY2xhcmF0aW9uIiBocmVmPSIjZHQtZG9jdHlwZSI+RFREPC9hPi48L3A+IDwvZGl2PiA8cD5FeGFtcGxlcw0KK29mIGNoYXJhY3RlciBhbmQgZW50aXR5IHJlZmVyZW5jZXM6PC9wPiA8dGFibGUgY2xhc3M9ImVnIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIg0KK2NlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+VHlwZSAmbHQ7a2V5Pmxlc3MtdGhhbiZsdDsva2V5PiAoJmFtcDsjeDNDOykgdG8gc2F2ZSBvcHRpb25zLg0KK1RoaXMgZG9jdW1lbnQgd2FzIHByZXBhcmVkIG9uICZhbXA7ZG9jZGF0ZTsgYW5kDQoraXMgY2xhc3NpZmllZCAmYW1wO3NlY3VyaXR5LWxldmVsOy48L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPHA+RXhhbXBsZSBvZiBhIHBhcmFtZXRlci1lbnRpdHkgcmVmZXJlbmNlOjwvcD4gPHRhYmxlIGNsYXNzPSJlZyINCit3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDshLS0gZGVjbGFyZSB0aGUgcGFyYW1ldGVyIGVudGl0eSAiSVNPTGF0MiIuLi4gLS0+DQorJmx0OyFFTlRJVFkgJSBJU09MYXQyDQorICAgICAgICAgU1lTVEVNICJodHRwOi8vd3d3LnhtbC5jb20vaXNvL2lzb2xhdDIteG1sLmVudGl0aWVzIiA+DQorJmx0OyEtLSAuLi4gbm93IHJlZmVyZW5jZSBpdC4gLS0+DQorJUlTT0xhdDI7PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9InNlYy1lbnRpdHktZGVjbCI+PC9hPjQuMiBFbnRpdHkNCitEZWNsYXJhdGlvbnM8L2gzPiA8cD5bPGEgdGl0bGU9ImVudGl0eSBkZWNsYXJhdGlvbiIgbmFtZT0iZHQtZW50ZGVjbCI+RGVmaW5pdGlvbjwvYT46DQorIEVudGl0aWVzIGFyZSBkZWNsYXJlZCB0aHVzOl08L3A+IDxoNT5FbnRpdHkgRGVjbGFyYXRpb248L2g1Pjx0YWJsZSBjbGFzcz0ic2NyYXAiPg0KKzx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUVudGl0eURlY2wiPjwvYT5bNzBdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+RW50aXR5RGVjbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT48YSBocmVmPSIjTlQtR0VEZWNsIj5HRURlY2w8L2E+IHwgPGEgaHJlZj0iI05ULVBFRGVjbCI+UEVEZWNsPC9hPjwvY29kZT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1HRURlY2wiPjwvYT5bNzFdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+R0VEZWNsPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPicmbHQ7IUVOVElUWScgPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiA8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPiA8YSBocmVmPSIjTlQtRW50aXR5RGVmIj5FbnRpdHlEZWY8L2E+IDxhIGhyZWY9IiNOVC1TIj5TPC9hPj8NCisnPic8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtUEVEZWNsIj48L2E+WzcyXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlBFRGVjbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nJmx0OyFFTlRJVFknIDxhIGhyZWY9IiNOVC1TIj5TPC9hPiAnJScgPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhDQoraHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IDxhIGhyZWY9IiNOVC1TIj5TPC9hPiA8YSBocmVmPSIjTlQtUEVEZWYiPlBFRGVmPC9hPiA8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPj8gJz4nPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUVudGl0eURlZiI+PC9hPls3M10mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5FbnRpdHlEZWY8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULUVudGl0eVZhbHVlIj5FbnRpdHlWYWx1ZTwvYT4gfCAoPGEgaHJlZj0iI05ULUV4dGVybmFsSUQiPkV4dGVybmFsSUQ8L2E+IDxhDQoraHJlZj0iI05ULU5EYXRhRGVjbCI+TkRhdGFEZWNsPC9hPj8pPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULVBFRGVmIj48L2E+Wzc0XSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlBFRGVmPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1FbnRpdHlWYWx1ZSI+RW50aXR5VmFsdWU8L2E+IHwgPGEgaHJlZj0iI05ULUV4dGVybmFsSUQiPkV4dGVybmFsSUQ8L2E+PC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxwPlRoZSA8YSBocmVmPSIjTlQtTmFtZSI+TmFtZTwvYT4gaWRlbnRpZmllcyB0aGUgZW50aXR5DQoraW4gYW4gPGEgdGl0bGU9IkVudGl0eSBSZWZlcmVuY2UiIGhyZWY9IiNkdC1lbnRyZWYiPmVudGl0eSByZWZlcmVuY2U8L2E+IG9yLA0KK2luIHRoZSBjYXNlIG9mIGFuIHVucGFyc2VkIGVudGl0eSwgaW4gdGhlIHZhbHVlIG9mIGFuIDxiPkVOVElUWTwvYj4gb3IgPGI+RU5USVRJRVM8L2I+DQorYXR0cmlidXRlLiBJZiB0aGUgc2FtZSBlbnRpdHkgaXMgZGVjbGFyZWQgbW9yZSB0aGFuIG9uY2UsIHRoZSBmaXJzdCBkZWNsYXJhdGlvbg0KK2VuY291bnRlcmVkIGlzIGJpbmRpbmc7IGF0IHVzZXIgb3B0aW9uLCBhbiBYTUwgcHJvY2Vzc29yIG1heSBpc3N1ZSBhIHdhcm5pbmcNCitpZiBlbnRpdGllcyBhcmUgZGVjbGFyZWQgbXVsdGlwbGUgdGltZXMuPC9wPiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhIG5hbWU9InNlYy1pbnRlcm5hbC1lbnQiPjwvYT40LjIuMQ0KK0ludGVybmFsIEVudGl0aWVzPC9oND4gPHA+WzxhIHRpdGxlPSJJbnRlcm5hbCBFbnRpdHkgUmVwbGFjZW1lbnQgVGV4dCIgbmFtZT0iZHQtaW50ZXJuZW50Ij5EZWZpbml0aW9uPC9hPjoNCitJZiB0aGUgZW50aXR5IGRlZmluaXRpb24gaXMgYW4gPGEgaHJlZj0iI05ULUVudGl0eVZhbHVlIj5FbnRpdHlWYWx1ZTwvYT4sDQordGhlIGRlZmluZWQgZW50aXR5IGlzIGNhbGxlZCBhbiA8Yj5pbnRlcm5hbCBlbnRpdHk8L2I+LiBUaGVyZSBpcyBubyBzZXBhcmF0ZQ0KK3BoeXNpY2FsIHN0b3JhZ2Ugb2JqZWN0LCBhbmQgdGhlIGNvbnRlbnQgb2YgdGhlIGVudGl0eSBpcyBnaXZlbiBpbiB0aGUgZGVjbGFyYXRpb24uXQ0KK05vdGUgdGhhdCBzb21lIHByb2Nlc3Npbmcgb2YgZW50aXR5IGFuZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBpbiB0aGUgPGEgdGl0bGU9IkxpdGVyYWwgRW50aXR5IFZhbHVlIg0KK2hyZWY9IiNkdC1saXRlbnR2YWwiPmxpdGVyYWwgZW50aXR5IHZhbHVlPC9hPiBtYXkgYmUgcmVxdWlyZWQgdG8gcHJvZHVjZSB0aGUNCitjb3JyZWN0IDxhIHRpdGxlPSJSZXBsYWNlbWVudCBUZXh0IiBocmVmPSIjZHQtcmVwbHRleHQiPnJlcGxhY2VtZW50IHRleHQ8L2E+Og0KK3NlZSA8YSBocmVmPSIjaW50ZXJuLXJlcGxhY2VtZW50Ij48Yj40LjUgQ29uc3RydWN0aW9uIG9mIEludGVybmFsIEVudGl0eSBSZXBsYWNlbWVudA0KK1RleHQ8L2I+PC9hPi48L3A+IDxwPkFuIGludGVybmFsIGVudGl0eSBpcyBhIDxhIHRpdGxlPSJUZXh0IEVudGl0eSIgaHJlZj0iI2R0LXBhcnNlZGVudCI+cGFyc2VkDQorZW50aXR5PC9hPi48L3A+IDxwPkV4YW1wbGUgb2YgYW4gaW50ZXJuYWwgZW50aXR5IGRlY2xhcmF0aW9uOjwvcD4gPHRhYmxlIGNsYXNzPSJlZyINCit3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDshRU5USVRZIFB1Yi1TdGF0dXMgIlRoaXMgaXMgYSBwcmUtcmVsZWFzZSBvZiB0aGUNCisgc3BlY2lmaWNhdGlvbi4iPjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MyI+IDxoND48YSBuYW1lPSJzZWMtZXh0ZXJuYWwtZW50Ij48L2E+NC4yLjINCitFeHRlcm5hbCBFbnRpdGllczwvaDQ+IDxwPls8YSB0aXRsZT0iRXh0ZXJuYWwgRW50aXR5IiBuYW1lPSJkdC1leHRlbnQiPkRlZmluaXRpb248L2E+Og0KK0lmIHRoZSBlbnRpdHkgaXMgbm90IGludGVybmFsLCBpdCBpcyBhbiA8Yj5leHRlcm5hbCBlbnRpdHk8L2I+LCBkZWNsYXJlZCBhcw0KK2ZvbGxvd3M6XTwvcD4gPGg1PkV4dGVybmFsIEVudGl0eSBEZWNsYXJhdGlvbjwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtRXh0ZXJuYWxJRCI+PC9hPls3NV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5FeHRlcm5hbElEPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPidTWVNURU0nIDxhIGhyZWY9IiNOVC1TIj5TPC9hPiA8YSBocmVmPSIjTlQtU3lzdGVtTGl0ZXJhbCI+U3lzdGVtTGl0ZXJhbDwvYT48L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PC90ZD4NCis8dGQ+PGNvZGU+fCAnUFVCTElDJyA8YSBocmVmPSIjTlQtUyI+UzwvYT4gPGEgaHJlZj0iI05ULVB1YmlkTGl0ZXJhbCI+UHViaWRMaXRlcmFsPC9hPiA8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPiA8YSBocmVmPSIjTlQtU3lzdGVtTGl0ZXJhbCI+U3lzdGVtTGl0ZXJhbDwvYT4gPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5Pjx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULU5EYXRhRGVjbCI+PC9hPls3Nl0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5ORGF0YURlY2w8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULVMiPlM8L2E+ICdOREFUQScgPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPjwvY29kZT48L3RkPg0KKzx0ZD48YSBocmVmPSIjbm90LWRlY2xhcmVkIj5bVkM6IE5vdGF0aW9uIERlY2xhcmVkXTwvYT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5JZiB0aGUgPGEgaHJlZj0iI05ULU5EYXRhRGVjbCI+TkRhdGFEZWNsPC9hPiBpcyBwcmVzZW50LA0KK3RoaXMgaXMgYSBnZW5lcmFsIDxhIHRpdGxlPSJVbnBhcnNlZCBFbnRpdHkiIGhyZWY9IiNkdC11bnBhcnNlZCI+dW5wYXJzZWQNCitlbnRpdHk8L2E+OyBvdGhlcndpc2UgaXQgaXMgYSBwYXJzZWQgZW50aXR5LjwvcD4gPGRpdiBjbGFzcz0iY29uc3RyYWludCI+PHANCitjbGFzcz0icHJlZml4Ij48YSBuYW1lPSJub3QtZGVjbGFyZWQiPjwvYT48Yj5WYWxpZGl0eSBjb25zdHJhaW50OiBOb3RhdGlvbg0KK0RlY2xhcmVkPC9iPjwvcD48cD5UaGUgPGEgaHJlZj0iI05ULU5hbWUiPk5hbWU8L2E+IG11c3QgbWF0Y2ggdGhlIGRlY2xhcmVkDQorbmFtZSBvZiBhIDxhIHRpdGxlPSJOb3RhdGlvbiIgaHJlZj0iI2R0LW5vdGF0aW9uIj5ub3RhdGlvbjwvYT4uPC9wPiA8L2Rpdj4gPHA+WzxhDQordGl0bGU9IlN5c3RlbSBJZGVudGlmaWVyIiBuYW1lPSJkdC1zeXNpZCI+RGVmaW5pdGlvbjwvYT46IFRoZSA8YSBocmVmPSIjTlQtU3lzdGVtTGl0ZXJhbCI+U3lzdGVtTGl0ZXJhbDwvYT4NCitpcyBjYWxsZWQgdGhlIGVudGl0eSdzIDxiPnN5c3RlbSBpZGVudGlmaWVyPC9iPi4gSXQgaXMgYSBVUkkgcmVmZXJlbmNlIChhcw0KK2RlZmluZWQgaW4gPGEgaHJlZj0iI3JmYzIzOTYiPltJRVRGIFJGQyAyMzk2XTwvYT4sIHVwZGF0ZWQgYnkgPGEgaHJlZj0iI3JmYzI3MzIiPltJRVRGDQorUkZDIDI3MzJdPC9hPiksIG1lYW50IHRvIGJlIGRlcmVmZXJlbmNlZCB0byBvYnRhaW4gaW5wdXQgZm9yIHRoZSBYTUwgcHJvY2Vzc29yDQordG8gY29uc3RydWN0IHRoZSBlbnRpdHkncyByZXBsYWNlbWVudCB0ZXh0Ll0gSXQgaXMgYW4gZXJyb3IgZm9yIGEgZnJhZ21lbnQNCitpZGVudGlmaWVyIChiZWdpbm5pbmcgd2l0aCBhIDxjb2RlPiM8L2NvZGU+IGNoYXJhY3RlcikgdG8gYmUgcGFydCBvZiBhIHN5c3RlbQ0KK2lkZW50aWZpZXIuIFVubGVzcyBvdGhlcndpc2UgcHJvdmlkZWQgYnkgaW5mb3JtYXRpb24gb3V0c2lkZSB0aGUgc2NvcGUgb2YNCit0aGlzIHNwZWNpZmljYXRpb24gKGUuZy4gYSBzcGVjaWFsIFhNTCBlbGVtZW50IHR5cGUgZGVmaW5lZCBieSBhIHBhcnRpY3VsYXINCitEVEQsIG9yIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBkZWZpbmVkIGJ5IGEgcGFydGljdWxhciBhcHBsaWNhdGlvbiBzcGVjaWZpY2F0aW9uKSwNCityZWxhdGl2ZSBVUklzIGFyZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gb2YgdGhlIHJlc291cmNlIHdpdGhpbiB3aGljaCB0aGUNCitlbnRpdHkgZGVjbGFyYXRpb24gb2NjdXJzLiBBIFVSSSBtaWdodCB0aHVzIGJlIHJlbGF0aXZlIHRvIHRoZSA8YSB0aXRsZT0iRG9jdW1lbnQgRW50aXR5Ig0KK2hyZWY9IiNkdC1kb2NlbnQiPmRvY3VtZW50IGVudGl0eTwvYT4sIHRvIHRoZSBlbnRpdHkgY29udGFpbmluZyB0aGUgPGEgdGl0bGU9IkRvY3VtZW50IFR5cGUgRGVjbGFyYXRpb24iDQoraHJlZj0iI2R0LWRvY3R5cGUiPmV4dGVybmFsIERURCBzdWJzZXQ8L2E+LCBvciB0byBzb21lIG90aGVyIDxhIHRpdGxlPSJFeHRlcm5hbCBFbnRpdHkiDQoraHJlZj0iI2R0LWV4dGVudCI+ZXh0ZXJuYWwgcGFyYW1ldGVyIGVudGl0eTwvYT4uPC9wPiA8cD5VUkkgcmVmZXJlbmNlcyByZXF1aXJlDQorZW5jb2RpbmcgYW5kIGVzY2FwaW5nIG9mIGNlcnRhaW4gY2hhcmFjdGVycy4gVGhlIGRpc2FsbG93ZWQgY2hhcmFjdGVycyBpbmNsdWRlDQorYWxsIG5vbi1BU0NJSSBjaGFyYWN0ZXJzLCBwbHVzIHRoZSBleGNsdWRlZCBjaGFyYWN0ZXJzIGxpc3RlZCBpbiBTZWN0aW9uIDIuNA0KK29mIDxhIGhyZWY9IiNyZmMyMzk2Ij5bSUVURiBSRkMgMjM5Nl08L2E+LCBleGNlcHQgZm9yIHRoZSBudW1iZXIgc2lnbiAoPGNvZGU+IzwvY29kZT4pDQorYW5kIHBlcmNlbnQgc2lnbiAoPGNvZGU+JTwvY29kZT4pIGNoYXJhY3RlcnMgYW5kIHRoZSBzcXVhcmUgYnJhY2tldCBjaGFyYWN0ZXJzDQorcmUtYWxsb3dlZCBpbiA8YSBocmVmPSIjcmZjMjczMiI+W0lFVEYgUkZDIDI3MzJdPC9hPi4gRGlzYWxsb3dlZCBjaGFyYWN0ZXJzDQorbXVzdCBiZSBlc2NhcGVkIGFzIGZvbGxvd3M6PC9wPiA8b2w+DQorPGxpPjxwPkVhY2ggZGlzYWxsb3dlZCBjaGFyYWN0ZXIgaXMgY29udmVydGVkIHRvIFVURi04IDxhIGhyZWY9IiNyZmMyMjc5Ij5bSUVURg0KK1JGQyAyMjc5XTwvYT4gYXMgb25lIG9yIG1vcmUgYnl0ZXMuPC9wPjwvbGk+DQorPGxpPjxwPkFueSBvY3RldHMgY29ycmVzcG9uZGluZyB0byBhIGRpc2FsbG93ZWQgY2hhcmFjdGVyIGFyZSBlc2NhcGVkIHdpdGgNCit0aGUgVVJJIGVzY2FwaW5nIG1lY2hhbmlzbSAodGhhdCBpcywgY29udmVydGVkIHRvIDxjb2RlPiU8L2NvZGU+PHZhcj5ISDwvdmFyPiwNCit3aGVyZSBISCBpcyB0aGUgaGV4YWRlY2ltYWwgbm90YXRpb24gb2YgdGhlIGJ5dGUgdmFsdWUpLjwvcD48L2xpPg0KKzxsaT48cD5UaGUgb3JpZ2luYWwgY2hhcmFjdGVyIGlzIHJlcGxhY2VkIGJ5IHRoZSByZXN1bHRpbmcgY2hhcmFjdGVyIHNlcXVlbmNlLjwvcD4gPC9saT4NCis8L29sPiA8cD5bPGEgdGl0bGU9IlB1YmxpYyBpZGVudGlmaWVyIiBuYW1lPSJkdC1wdWJpZCI+RGVmaW5pdGlvbjwvYT46ICBJbg0KK2FkZGl0aW9uIHRvIGEgc3lzdGVtIGlkZW50aWZpZXIsIGFuIGV4dGVybmFsIGlkZW50aWZpZXIgbWF5IGluY2x1ZGUgYSA8Yj5wdWJsaWMNCitpZGVudGlmaWVyPC9iPi5dIEFuIFhNTCBwcm9jZXNzb3IgYXR0ZW1wdGluZyB0byByZXRyaWV2ZSB0aGUgZW50aXR5J3MgY29udGVudA0KK21heSB1c2UgdGhlIHB1YmxpYyBpZGVudGlmaWVyIHRvIHRyeSB0byBnZW5lcmF0ZSBhbiBhbHRlcm5hdGl2ZSBVUkkgcmVmZXJlbmNlLg0KK0lmIHRoZSBwcm9jZXNzb3IgaXMgdW5hYmxlIHRvIGRvIHNvLCBpdCBtdXN0IHVzZSB0aGUgVVJJIHJlZmVyZW5jZSBzcGVjaWZpZWQNCitpbiB0aGUgc3lzdGVtIGxpdGVyYWwuIEJlZm9yZSBhIG1hdGNoIGlzIGF0dGVtcHRlZCwgYWxsIHN0cmluZ3Mgb2Ygd2hpdGUgc3BhY2UNCitpbiB0aGUgcHVibGljIGlkZW50aWZpZXIgbXVzdCBiZSBub3JtYWxpemVkIHRvIHNpbmdsZSBzcGFjZSBjaGFyYWN0ZXJzICgjeDIwKSwNCithbmQgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGUgc3BhY2UgbXVzdCBiZSByZW1vdmVkLjwvcD4gPHA+RXhhbXBsZXMgb2YgZXh0ZXJuYWwNCitlbnRpdHkgZGVjbGFyYXRpb25zOjwvcD4gPHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiDQorYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDshRU5USVRZIG9wZW4taGF0Y2gNCisgICAgICAgICBTWVNURU0gImh0dHA6Ly93d3cudGV4dHVhbGl0eS5jb20vYm9pbGVycGxhdGUvT3BlbkhhdGNoLnhtbCI+DQorJmx0OyFFTlRJVFkgb3Blbi1oYXRjaA0KKyAgICAgICAgIFBVQkxJQyAiLS8vVGV4dHVhbGl0eS8vVEVYVCBTdGFuZGFyZCBvcGVuLWhhdGNoIGJvaWxlcnBsYXRlLy9FTiINCisgICAgICAgICAiaHR0cDovL3d3dy50ZXh0dWFsaXR5LmNvbS9ib2lsZXJwbGF0ZS9PcGVuSGF0Y2gueG1sIj4NCismbHQ7IUVOVElUWSBoYXRjaC1waWMNCisgICAgICAgICBTWVNURU0gIi4uL2dyYWZpeC9PcGVuSGF0Y2guZ2lmIg0KKyAgICAgICAgIE5EQVRBIGdpZiA+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDwvZGl2PiA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MiI+IDxoMz48YSBuYW1lPSJUZXh0RW50aXRpZXMiPjwvYT40LjMNCitQYXJzZWQgRW50aXRpZXM8L2gzPiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhIG5hbWU9InNlYy1UZXh0RGVjbCI+PC9hPjQuMy4xDQorVGhlIFRleHQgRGVjbGFyYXRpb248L2g0PiA8cD5FeHRlcm5hbCBwYXJzZWQgZW50aXRpZXMgc2hvdWxkIGVhY2ggYmVnaW4gd2l0aA0KK2EgPGI+dGV4dCBkZWNsYXJhdGlvbjwvYj4uPC9wPiA8aDU+VGV4dCBEZWNsYXJhdGlvbjwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+DQorPHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtVGV4dERlY2wiPjwvYT5bNzddJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+VGV4dERlY2w8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+JyZsdDs/eG1sJyA8YSBocmVmPSIjTlQtVmVyc2lvbkluZm8iPlZlcnNpb25JbmZvPC9hPj8gPGEgaHJlZj0iI05ULUVuY29kaW5nRGVjbCI+RW5jb2RpbmdEZWNsPC9hPiA8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPj8gJz8+JzwvY29kZT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5UaGUgdGV4dCBkZWNsYXJhdGlvbiBtdXN0IGJlIHByb3ZpZGVkIGxpdGVyYWxseSwgbm90IGJ5DQorcmVmZXJlbmNlIHRvIGEgcGFyc2VkIGVudGl0eS4gTm8gdGV4dCBkZWNsYXJhdGlvbiBtYXkgYXBwZWFyIGF0IGFueSBwb3NpdGlvbg0KK290aGVyIHRoYW4gdGhlIGJlZ2lubmluZyBvZiBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5LiBUaGUgdGV4dCBkZWNsYXJhdGlvbg0KK2luIGFuIGV4dGVybmFsIHBhcnNlZCBlbnRpdHkgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiBpdHMgPGEgdGl0bGU9IlJlcGxhY2VtZW50IFRleHQiDQoraHJlZj0iI2R0LXJlcGx0ZXh0Ij5yZXBsYWNlbWVudCB0ZXh0PC9hPi48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhDQorbmFtZT0id2YtZW50aXRpZXMiPjwvYT40LjMuMiBXZWxsLUZvcm1lZCBQYXJzZWQgRW50aXRpZXM8L2g0PiA8cD5UaGUgZG9jdW1lbnQNCitlbnRpdHkgaXMgd2VsbC1mb3JtZWQgaWYgaXQgbWF0Y2hlcyB0aGUgcHJvZHVjdGlvbiBsYWJlbGVkIDxhIGhyZWY9IiNOVC1kb2N1bWVudCI+ZG9jdW1lbnQ8L2E+Lg0KK0FuIGV4dGVybmFsIGdlbmVyYWwgcGFyc2VkIGVudGl0eSBpcyB3ZWxsLWZvcm1lZCBpZiBpdCBtYXRjaGVzIHRoZSBwcm9kdWN0aW9uDQorbGFiZWxlZCA8YSBocmVmPSIjTlQtZXh0UGFyc2VkRW50Ij5leHRQYXJzZWRFbnQ8L2E+LiBBbGwgZXh0ZXJuYWwgcGFyYW1ldGVyDQorZW50aXRpZXMgYXJlIHdlbGwtZm9ybWVkIGJ5IGRlZmluaXRpb24uPC9wPiA8aDU+V2VsbC1Gb3JtZWQgRXh0ZXJuYWwgUGFyc2VkDQorRW50aXR5PC9oNT48dGFibGUgY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1leHRQYXJzZWRFbnQiPjwvYT5bNzhdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+ZXh0UGFyc2VkRW50PC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1UZXh0RGVjbCI+VGV4dERlY2w8L2E+PyA8YSBocmVmPSIjTlQtY29udGVudCI+Y29udGVudDwvYT48L2NvZGU+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PC90YWJsZT4gPHA+QW4gaW50ZXJuYWwgZ2VuZXJhbCBwYXJzZWQgZW50aXR5IGlzIHdlbGwtZm9ybWVkIGlmIGl0cw0KK3JlcGxhY2VtZW50IHRleHQgbWF0Y2hlcyB0aGUgcHJvZHVjdGlvbiBsYWJlbGVkIDxhIGhyZWY9IiNOVC1jb250ZW50Ij5jb250ZW50PC9hPi4NCitBbGwgaW50ZXJuYWwgcGFyYW1ldGVyIGVudGl0aWVzIGFyZSB3ZWxsLWZvcm1lZCBieSBkZWZpbml0aW9uLjwvcD4gPHA+QSBjb25zZXF1ZW5jZQ0KK29mIHdlbGwtZm9ybWVkbmVzcyBpbiBlbnRpdGllcyBpcyB0aGF0IHRoZSBsb2dpY2FsIGFuZCBwaHlzaWNhbCBzdHJ1Y3R1cmVzDQoraW4gYW4gWE1MIGRvY3VtZW50IGFyZSBwcm9wZXJseSBuZXN0ZWQ7IG5vIDxhIHRpdGxlPSJTdGFydC1UYWciIGhyZWY9IiNkdC1zdGFnIj5zdGFydC10YWc8L2E+LCA8YQ0KK3RpdGxlPSJFbmQgVGFnIiBocmVmPSIjZHQtZXRhZyI+ZW5kLXRhZzwvYT4sIDxhIHRpdGxlPSJFbXB0eSIgaHJlZj0iI2R0LWVtcHR5Ij5lbXB0eS1lbGVtZW50DQordGFnPC9hPiwgPGEgdGl0bGU9IkVsZW1lbnQiIGhyZWY9IiNkdC1lbGVtZW50Ij5lbGVtZW50PC9hPiwgPGEgdGl0bGU9IkNvbW1lbnQiDQoraHJlZj0iI2R0LWNvbW1lbnQiPmNvbW1lbnQ8L2E+LCA8YSB0aXRsZT0iUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIgaHJlZj0iI2R0LXBpIj5wcm9jZXNzaW5nDQoraW5zdHJ1Y3Rpb248L2E+LCA8YSB0aXRsZT0iQ2hhcmFjdGVyIFJlZmVyZW5jZSIgaHJlZj0iI2R0LWNoYXJyZWYiPmNoYXJhY3Rlcg0KK3JlZmVyZW5jZTwvYT4sIG9yIDxhIHRpdGxlPSJFbnRpdHkgUmVmZXJlbmNlIiBocmVmPSIjZHQtZW50cmVmIj5lbnRpdHkgcmVmZXJlbmNlPC9hPg0KK2NhbiBiZWdpbiBpbiBvbmUgZW50aXR5IGFuZCBlbmQgaW4gYW5vdGhlci48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhDQorbmFtZT0iY2hhcmVuY29kaW5nIj48L2E+NC4zLjMgQ2hhcmFjdGVyIEVuY29kaW5nIGluIEVudGl0aWVzPC9oND4gPHA+RWFjaA0KK2V4dGVybmFsIHBhcnNlZCBlbnRpdHkgaW4gYW4gWE1MIGRvY3VtZW50IG1heSB1c2UgYSBkaWZmZXJlbnQgZW5jb2RpbmcgZm9yDQoraXRzIGNoYXJhY3RlcnMuIEFsbCBYTUwgcHJvY2Vzc29ycyBtdXN0IGJlIGFibGUgdG8gcmVhZCBlbnRpdGllcyBpbiBib3RoIHRoZQ0KK1VURi04IGFuZCBVVEYtMTYgZW5jb2RpbmdzLiBUaGUgdGVybXMgIlVURi04IiBhbmQgIlVURi0xNiIgaW4gdGhpcyBzcGVjaWZpY2F0aW9uDQorZG8gbm90IGFwcGx5IHRvIGNoYXJhY3RlciBlbmNvZGluZ3Mgd2l0aCBhbnkgb3RoZXIgbGFiZWxzLCBldmVuIGlmIHRoZSBlbmNvZGluZ3MNCitvciBsYWJlbHMgYXJlIHZlcnkgc2ltaWxhciB0byBVVEYtOCBvciBVVEYtMTYuPC9wPiA8cD5FbnRpdGllcyBlbmNvZGVkIGluDQorVVRGLTE2IG11c3QgYmVnaW4gd2l0aCB0aGUgQnl0ZSBPcmRlciBNYXJrIGRlc2NyaWJlZCBieSBBbm5leCBGIG9mIDxhIGhyZWY9IiNJU08xMDY0NiI+W0lTTy9JRUMNCisxMDY0Nl08L2E+LCBBbm5leCBIIG9mIDxhIGhyZWY9IiNJU08xMDY0Ni0yMDAwIj5bSVNPL0lFQyAxMDY0Ni0yMDAwXTwvYT4sDQorc2VjdGlvbiAyLjQgb2YgPGEgaHJlZj0iI1VuaWNvZGUiPltVbmljb2RlXTwvYT4sIGFuZCBzZWN0aW9uIDIuNyBvZiA8YSBocmVmPSIjVW5pY29kZTMiPltVbmljb2RlM108L2E+DQorKHRoZSBaRVJPIFdJRFRIIE5PLUJSRUFLIFNQQUNFIGNoYXJhY3RlciwgI3hGRUZGKS4gVGhpcyBpcyBhbiBlbmNvZGluZyBzaWduYXR1cmUsDQorbm90IHBhcnQgb2YgZWl0aGVyIHRoZSBtYXJrdXAgb3IgdGhlIGNoYXJhY3RlciBkYXRhIG9mIHRoZSBYTUwgZG9jdW1lbnQuIFhNTA0KK3Byb2Nlc3NvcnMgbXVzdCBiZSBhYmxlIHRvIHVzZSB0aGlzIGNoYXJhY3RlciB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gVVRGLTgNCithbmQgVVRGLTE2IGVuY29kZWQgZG9jdW1lbnRzLjwvcD4gPHA+QWx0aG91Z2ggYW4gWE1MIHByb2Nlc3NvciBpcyByZXF1aXJlZA0KK3RvIHJlYWQgb25seSBlbnRpdGllcyBpbiB0aGUgVVRGLTggYW5kIFVURi0xNiBlbmNvZGluZ3MsIGl0IGlzIHJlY29nbml6ZWQNCit0aGF0IG90aGVyIGVuY29kaW5ncyBhcmUgdXNlZCBhcm91bmQgdGhlIHdvcmxkLCBhbmQgaXQgbWF5IGJlIGRlc2lyZWQgZm9yDQorWE1MIHByb2Nlc3NvcnMgdG8gcmVhZCBlbnRpdGllcyB0aGF0IHVzZSB0aGVtLiBJbiB0aGUgYWJzZW5jZSBvZiBleHRlcm5hbA0KK2NoYXJhY3RlciBlbmNvZGluZyBpbmZvcm1hdGlvbiAoc3VjaCBhcyBNSU1FIGhlYWRlcnMpLCBwYXJzZWQgZW50aXRpZXMgd2hpY2gNCithcmUgc3RvcmVkIGluIGFuIGVuY29kaW5nIG90aGVyIHRoYW4gVVRGLTggb3IgVVRGLTE2IG11c3QgYmVnaW4gd2l0aCBhIHRleHQNCitkZWNsYXJhdGlvbiAoc2VlIDxhIGhyZWY9IiNzZWMtVGV4dERlY2wiPjxiPjQuMy4xIFRoZSBUZXh0IERlY2xhcmF0aW9uPC9iPjwvYT4pDQorY29udGFpbmluZyBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbjo8L3A+IDxoNT5FbmNvZGluZyBEZWNsYXJhdGlvbjwvaDU+PHRhYmxlDQorY2xhc3M9InNjcmFwIj48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1FbmNvZGluZ0RlY2wiPjwvYT5bODBdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+RW5jb2RpbmdEZWNsPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPjxhIGhyZWY9IiNOVC1TIj5TPC9hPiAnZW5jb2RpbmcnIDxhIGhyZWY9IiNOVC1FcSI+RXE8L2E+ICgnIicgPGENCitocmVmPSIjTlQtRW5jTmFtZSI+RW5jTmFtZTwvYT4gJyInIHwgIiciIDxhIGhyZWY9IiNOVC1FbmNOYW1lIj5FbmNOYW1lPC9hPg0KKyInIiApIDwvY29kZT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48dGJvZHk+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1FbmNOYW1lIj48L2E+WzgxXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPkVuY05hbWU8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+W0EtWmEtel0gKFtBLVphLXowLTkuX10gfCAnLScpKjwvY29kZT48L3RkPg0KKzx0ZD48aT4vKiBFbmNvZGluZyBuYW1lIGNvbnRhaW5zIG9ubHkgTGF0aW4gY2hhcmFjdGVycyAqLzwvaT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5JbiB0aGUgPGEgdGl0bGU9IkRvY3VtZW50IEVudGl0eSIgaHJlZj0iI2R0LWRvY2VudCI+ZG9jdW1lbnQNCitlbnRpdHk8L2E+LCB0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb24gaXMgcGFydCBvZiB0aGUgPGEgdGl0bGU9IlhNTCBEZWNsYXJhdGlvbiINCitocmVmPSIjZHQteG1sZGVjbCI+WE1MIGRlY2xhcmF0aW9uPC9hPi4gVGhlIDxhIGhyZWY9IiNOVC1FbmNOYW1lIj5FbmNOYW1lPC9hPg0KK2lzIHRoZSBuYW1lIG9mIHRoZSBlbmNvZGluZyB1c2VkLjwvcD4gIDxwPkluIGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uLCB0aGUNCit2YWx1ZXMgIjxjb2RlPlVURi04PC9jb2RlPiIsICI8Y29kZT5VVEYtMTY8L2NvZGU+IiwgIjxjb2RlPklTTy0xMDY0Ni1VQ1MtMjwvY29kZT4iLA0KK2FuZCAiPGNvZGU+SVNPLTEwNjQ2LVVDUy00PC9jb2RlPiIgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSB2YXJpb3VzIGVuY29kaW5ncw0KK2FuZCB0cmFuc2Zvcm1hdGlvbnMgb2YgVW5pY29kZSAvIElTTy9JRUMgMTA2NDYsIHRoZSB2YWx1ZXMgIjxjb2RlPklTTy04ODU5LTE8L2NvZGU+IiwNCisiPGNvZGU+SVNPLTg4NTktMjwvY29kZT4iLCAuLi4gIjxjb2RlPklTTy04ODU5LTwvY29kZT48dmFyPm48L3Zhcj4iICh3aGVyZSA8dmFyPm48L3Zhcj4NCitpcyB0aGUgcGFydCBudW1iZXIpIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgcGFydHMgb2YgSVNPIDg4NTksIGFuZCB0aGUgdmFsdWVzDQorIjxjb2RlPklTTy0yMDIyLUpQPC9jb2RlPiIsICI8Y29kZT5TaGlmdF9KSVM8L2NvZGU+IiwgYW5kICI8Y29kZT5FVUMtSlA8L2NvZGU+Ig0KK3Nob3VsZCBiZSB1c2VkIGZvciB0aGUgdmFyaW91cyBlbmNvZGVkIGZvcm1zIG9mIEpJUyBYLTAyMDgtMTk5Ny4gSXQgaXMgcmVjb21tZW5kZWQNCit0aGF0IGNoYXJhY3RlciBlbmNvZGluZ3MgcmVnaXN0ZXJlZCAoYXMgPGVtPmNoYXJzZXQ8L2VtPnMpIHdpdGggdGhlIEludGVybmV0DQorQXNzaWduZWQgTnVtYmVycyBBdXRob3JpdHkgPGEgaHJlZj0iI0lBTkEiPltJQU5BLUNIQVJTRVRTXTwvYT4sIG90aGVyIHRoYW4NCit0aG9zZSBqdXN0IGxpc3RlZCwgYmUgcmVmZXJyZWQgdG8gdXNpbmcgdGhlaXIgcmVnaXN0ZXJlZCBuYW1lczsgb3RoZXIgZW5jb2RpbmdzDQorc2hvdWxkIHVzZSBuYW1lcyBzdGFydGluZyB3aXRoIGFuICJ4LSIgcHJlZml4LiBYTUwgcHJvY2Vzc29ycyBzaG91bGQgbWF0Y2gNCitjaGFyYWN0ZXIgZW5jb2RpbmcgbmFtZXMgaW4gYSBjYXNlLWluc2Vuc2l0aXZlIHdheSBhbmQgc2hvdWxkIGVpdGhlciBpbnRlcnByZXQNCithbiBJQU5BLXJlZ2lzdGVyZWQgbmFtZSBhcyB0aGUgZW5jb2RpbmcgcmVnaXN0ZXJlZCBhdCBJQU5BIGZvciB0aGF0IG5hbWUgb3INCit0cmVhdCBpdCBhcyB1bmtub3duIChwcm9jZXNzb3JzIGFyZSwgb2YgY291cnNlLCBub3QgcmVxdWlyZWQgdG8gc3VwcG9ydCBhbGwNCitJQU5BLXJlZ2lzdGVyZWQgZW5jb2RpbmdzKS48L3A+IDxwPkluIHRoZSBhYnNlbmNlIG9mIGluZm9ybWF0aW9uIHByb3ZpZGVkDQorYnkgYW4gZXh0ZXJuYWwgdHJhbnNwb3J0IHByb3RvY29sIChlLmcuIEhUVFAgb3IgTUlNRSksIGl0IGlzIGFuIDxhIHRpdGxlPSJFcnJvciINCitocmVmPSIjZHQtZXJyb3IiPmVycm9yPC9hPiBmb3IgYW4gZW50aXR5IGluY2x1ZGluZyBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbg0KK3RvIGJlIHByZXNlbnRlZCB0byB0aGUgWE1MIHByb2Nlc3NvciBpbiBhbiBlbmNvZGluZyBvdGhlciB0aGFuIHRoYXQgbmFtZWQNCitpbiB0aGUgZGVjbGFyYXRpb24sIG9yIGZvciBhbiBlbnRpdHkgd2hpY2ggYmVnaW5zIHdpdGggbmVpdGhlciBhIEJ5dGUgT3JkZXINCitNYXJrIG5vciBhbiBlbmNvZGluZyBkZWNsYXJhdGlvbiB0byB1c2UgYW4gZW5jb2Rpbmcgb3RoZXIgdGhhbiBVVEYtOC4gTm90ZQ0KK3RoYXQgc2luY2UgQVNDSUkgaXMgYSBzdWJzZXQgb2YgVVRGLTgsIG9yZGluYXJ5IEFTQ0lJIGVudGl0aWVzIGRvIG5vdCBzdHJpY3RseQ0KK25lZWQgYW4gZW5jb2RpbmcgZGVjbGFyYXRpb24uPC9wPiA8cD5JdCBpcyBhIGZhdGFsIGVycm9yIGZvciBhIDxhIGhyZWY9IiNOVC1UZXh0RGVjbCI+VGV4dERlY2w8L2E+DQordG8gb2NjdXIgb3RoZXIgdGhhbiBhdCB0aGUgYmVnaW5uaW5nIG9mIGFuIGV4dGVybmFsIGVudGl0eS48L3A+IDxwPkl0IGlzIGEgPGENCit0aXRsZT0iRmF0YWwgRXJyb3IiIGhyZWY9IiNkdC1mYXRhbCI+ZmF0YWwgZXJyb3I8L2E+IHdoZW4gYW4gWE1MIHByb2Nlc3Nvcg0KK2VuY291bnRlcnMgYW4gZW50aXR5IHdpdGggYW4gZW5jb2RpbmcgdGhhdCBpdCBpcyB1bmFibGUgdG8gcHJvY2Vzcy4gSXQgaXMNCithIGZhdGFsIGVycm9yIGlmIGFuIFhNTCBlbnRpdHkgaXMgZGV0ZXJtaW5lZCAodmlhIGRlZmF1bHQsIGVuY29kaW5nIGRlY2xhcmF0aW9uLA0KK29yIGhpZ2hlci1sZXZlbCBwcm90b2NvbCkgdG8gYmUgaW4gYSBjZXJ0YWluIGVuY29kaW5nIGJ1dCBjb250YWlucyBvY3RldCBzZXF1ZW5jZXMNCit0aGF0IGFyZSBub3QgbGVnYWwgaW4gdGhhdCBlbmNvZGluZy4gSXQgaXMgYWxzbyBhIGZhdGFsIGVycm9yIGlmIGFuIFhNTCBlbnRpdHkNCitjb250YWlucyBubyBlbmNvZGluZyBkZWNsYXJhdGlvbiBhbmQgaXRzIGNvbnRlbnQgaXMgbm90IGxlZ2FsIFVURi04IG9yIFVURi0xNi48L3A+IDxwPkV4YW1wbGVzDQorb2YgdGV4dCBkZWNsYXJhdGlvbnMgY29udGFpbmluZyBlbmNvZGluZyBkZWNsYXJhdGlvbnM6PC9wPiA8dGFibGUgY2xhc3M9ImVnIg0KK3dpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0Oz94bWwgZW5jb2Rpbmc9J1VURi04Jz8+DQorJmx0Oz94bWwgZW5jb2Rpbmc9J0VVQy1KUCc/PjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8L2Rpdj4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0iZW50cHJvYyI+PC9hPjQuNCBYTUwNCitQcm9jZXNzb3IgVHJlYXRtZW50IG9mIEVudGl0aWVzIGFuZCBSZWZlcmVuY2VzPC9oMz4gPHA+VGhlIHRhYmxlIGJlbG93IHN1bW1hcml6ZXMNCit0aGUgY29udGV4dHMgaW4gd2hpY2ggY2hhcmFjdGVyIHJlZmVyZW5jZXMsIGVudGl0eSByZWZlcmVuY2VzLCBhbmQgaW52b2NhdGlvbnMNCitvZiB1bnBhcnNlZCBlbnRpdGllcyBtaWdodCBhcHBlYXIgYW5kIHRoZSByZXF1aXJlZCBiZWhhdmlvciBvZiBhbiA8YSB0aXRsZT0iWE1MIFByb2Nlc3NvciINCitocmVmPSIjZHQteG1sLXByb2MiPlhNTCBwcm9jZXNzb3I8L2E+IGluIGVhY2ggY2FzZS4gVGhlIGxhYmVscyBpbiB0aGUgbGVmdG1vc3QNCitjb2x1bW4gZGVzY3JpYmUgdGhlIHJlY29nbml0aW9uIGNvbnRleHQ6IDwvcD48ZGw+DQorPGR0IGNsYXNzPSJsYWJlbCI+UmVmZXJlbmNlIGluIENvbnRlbnQ8L2R0Pg0KKzxkZD4gPHA+YXMgYSByZWZlcmVuY2UgYW55d2hlcmUgYWZ0ZXIgdGhlIDxhIHRpdGxlPSJTdGFydC1UYWciIGhyZWY9IiNkdC1zdGFnIj5zdGFydC10YWc8L2E+DQorYW5kIGJlZm9yZSB0aGUgPGEgdGl0bGU9IkVuZCBUYWciIGhyZWY9IiNkdC1ldGFnIj5lbmQtdGFnPC9hPiBvZiBhbiBlbGVtZW50Ow0KK2NvcnJlc3BvbmRzIHRvIHRoZSBub250ZXJtaW5hbCA8YSBocmVmPSIjTlQtY29udGVudCI+Y29udGVudDwvYT4uPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPlJlZmVyZW5jZSBpbiBBdHRyaWJ1dGUgVmFsdWU8L2R0Pg0KKzxkZD4gPHA+YXMgYSByZWZlcmVuY2Ugd2l0aGluIGVpdGhlciB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIGluIGEgPGEgdGl0bGU9IlN0YXJ0LVRhZyINCitocmVmPSIjZHQtc3RhZyI+c3RhcnQtdGFnPC9hPiwgb3IgYSBkZWZhdWx0IHZhbHVlIGluIGFuIDxhIHRpdGxlPSJBdHRyaWJ1dGUtTGlzdCBEZWNsYXJhdGlvbiINCitocmVmPSIjZHQtYXR0ZGVjbCI+YXR0cmlidXRlIGRlY2xhcmF0aW9uPC9hPjsgY29ycmVzcG9uZHMgdG8gdGhlIG5vbnRlcm1pbmFsIDxhDQoraHJlZj0iI05ULUF0dFZhbHVlIj5BdHRWYWx1ZTwvYT4uPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPk9jY3VycyBhcyBBdHRyaWJ1dGUgVmFsdWU8L2R0Pg0KKzxkZD4gPHA+YXMgYSA8YSBocmVmPSIjTlQtTmFtZSI+TmFtZTwvYT4sIG5vdCBhIHJlZmVyZW5jZSwgYXBwZWFyaW5nIGVpdGhlcg0KK2FzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgd2hpY2ggaGFzIGJlZW4gZGVjbGFyZWQgYXMgdHlwZSA8Yj5FTlRJVFk8L2I+LA0KK29yIGFzIG9uZSBvZiB0aGUgc3BhY2Utc2VwYXJhdGVkIHRva2VucyBpbiB0aGUgdmFsdWUgb2YgYW4gYXR0cmlidXRlIHdoaWNoDQoraGFzIGJlZW4gZGVjbGFyZWQgYXMgdHlwZSA8Yj5FTlRJVElFUzwvYj4uPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPlJlZmVyZW5jZSBpbiBFbnRpdHkgVmFsdWU8L2R0Pg0KKzxkZD4gPHA+YXMgYSByZWZlcmVuY2Ugd2l0aGluIGEgcGFyYW1ldGVyIG9yIGludGVybmFsIGVudGl0eSdzIDxhIHRpdGxlPSJMaXRlcmFsIEVudGl0eSBWYWx1ZSINCitocmVmPSIjZHQtbGl0ZW50dmFsIj5saXRlcmFsIGVudGl0eSB2YWx1ZTwvYT4gaW4gdGhlIGVudGl0eSdzIGRlY2xhcmF0aW9uOw0KK2NvcnJlc3BvbmRzIHRvIHRoZSBub250ZXJtaW5hbCA8YSBocmVmPSIjTlQtRW50aXR5VmFsdWUiPkVudGl0eVZhbHVlPC9hPi48L3A+IDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+UmVmZXJlbmNlIGluIERURDwvZHQ+DQorPGRkPiA8cD5hcyBhIHJlZmVyZW5jZSB3aXRoaW4gZWl0aGVyIHRoZSBpbnRlcm5hbCBvciBleHRlcm5hbCBzdWJzZXRzIG9mIHRoZSA8YQ0KK3RpdGxlPSJEb2N1bWVudCBUeXBlIERlY2xhcmF0aW9uIiBocmVmPSIjZHQtZG9jdHlwZSI+RFREPC9hPiwgYnV0IG91dHNpZGUNCitvZiBhbiA8YSBocmVmPSIjTlQtRW50aXR5VmFsdWUiPkVudGl0eVZhbHVlPC9hPiwgPGEgaHJlZj0iI05ULUF0dFZhbHVlIj5BdHRWYWx1ZTwvYT4sIDxhDQoraHJlZj0iI05ULVBJIj5QSTwvYT4sIDxhIGhyZWY9IiNOVC1Db21tZW50Ij5Db21tZW50PC9hPiwgPGEgaHJlZj0iI05ULVN5c3RlbUxpdGVyYWwiPlN5c3RlbUxpdGVyYWw8L2E+LCA8YQ0KK2hyZWY9IiNOVC1QdWJpZExpdGVyYWwiPlB1YmlkTGl0ZXJhbDwvYT4sIG9yIHRoZSBjb250ZW50cyBvZiBhbiBpZ25vcmVkIGNvbmRpdGlvbmFsDQorc2VjdGlvbiAoc2VlIDxhIGhyZWY9IiNzZWMtY29uZGl0aW9uLXNlY3QiPjxiPjMuNCBDb25kaXRpb25hbCBTZWN0aW9uczwvYj48L2E+KS48L3A+IDxwPi48L3A+IDwvZGQ+DQorPC9kbD48cD48L3A+IDx0YWJsZSBib3JkZXI9IjEiIGZyYW1lPSJib3JkZXIiIGNlbGxwYWRkaW5nPSI3Ij48dGJvZHkgYWxpZ249ImNlbnRlciI+DQorPHRyPg0KKzx0ZCByb3dzcGFuPSIyIiBjb2xzcGFuPSIxIj48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSI0IiBhbGlnbj0iY2VudGVyIiB2YWxpZ249ImJvdHRvbSI+RW50aXR5IFR5cGU8L3RkPg0KKzx0ZCByb3dzcGFuPSIyIiBjb2xzcGFuPSIxIiBhbGlnbj0iY2VudGVyIj5DaGFyYWN0ZXI8L3RkPg0KKzwvdHI+DQorPHRyIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0iYm90dG9tIj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+UGFyYW1ldGVyPC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+SW50ZXJuYWwgR2VuZXJhbDwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPkV4dGVybmFsIFBhcnNlZCBHZW5lcmFsPC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+VW5wYXJzZWQ8L3RkPg0KKzwvdHI+DQorPHRyIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSIgYWxpZ249InJpZ2h0Ij5SZWZlcmVuY2UgaW4gQ29udGVudDwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNub3QtcmVjb2duaXplZCI+PGNpdGU+Tm90IHJlY29nbml6ZWQ8L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNpbmNsdWRlZCI+PGNpdGU+SW5jbHVkZWQ8L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNpbmNsdWRlLWlmLXZhbGlkIj48Y2l0ZT5JbmNsdWRlZCBpZg0KK3ZhbGlkYXRpbmc8L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNmb3JiaWRkZW4iPjxjaXRlPkZvcmJpZGRlbjwvY2l0ZT48L2E+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGEgaHJlZj0iI2luY2x1ZGVkIj48Y2l0ZT5JbmNsdWRlZDwvY2l0ZT48L2E+PC90ZD4NCis8L3RyPg0KKzx0ciBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiIGFsaWduPSJyaWdodCI+UmVmZXJlbmNlIGluIEF0dHJpYnV0ZSBWYWx1ZTwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNub3QtcmVjb2duaXplZCI+PGNpdGU+Tm90IHJlY29nbml6ZWQ8L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNpbmxpdGVyYWwiPjxjaXRlPkluY2x1ZGVkIGluIGxpdGVyYWw8L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNmb3JiaWRkZW4iPjxjaXRlPkZvcmJpZGRlbjwvY2l0ZT48L2E+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGEgaHJlZj0iI2ZvcmJpZGRlbiI+PGNpdGU+Rm9yYmlkZGVuPC9jaXRlPjwvYT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48YSBocmVmPSIjaW5jbHVkZWQiPjxjaXRlPkluY2x1ZGVkPC9jaXRlPjwvYT48L3RkPg0KKzwvdHI+DQorPHRyIGFsaWduPSJjZW50ZXIiIHZhbGlnbj0ibWlkZGxlIj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSIgYWxpZ249InJpZ2h0Ij5PY2N1cnMgYXMgQXR0cmlidXRlIFZhbHVlPC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGEgaHJlZj0iI25vdC1yZWNvZ25pemVkIj48Y2l0ZT5Ob3QgcmVjb2duaXplZDwvY2l0ZT48L2E+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGEgaHJlZj0iI2ZvcmJpZGRlbiI+PGNpdGU+Rm9yYmlkZGVuPC9jaXRlPjwvYT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48YSBocmVmPSIjZm9yYmlkZGVuIj48Y2l0ZT5Gb3JiaWRkZW48L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNub3RpZnkiPjxjaXRlPk5vdGlmeTwvY2l0ZT48L2E+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGEgaHJlZj0iI25vdC1yZWNvZ25pemVkIj48Y2l0ZT5Ob3QgcmVjb2duaXplZDwvY2l0ZT48L2E+PC90ZD4NCis8L3RyPg0KKzx0ciBhbGlnbj0iY2VudGVyIiB2YWxpZ249Im1pZGRsZSI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiIGFsaWduPSJyaWdodCI+UmVmZXJlbmNlIGluIEVudGl0eVZhbHVlPC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGEgaHJlZj0iI2lubGl0ZXJhbCI+PGNpdGU+SW5jbHVkZWQgaW4gbGl0ZXJhbDwvY2l0ZT48L2E+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGEgaHJlZj0iI2J5cGFzcyI+PGNpdGU+QnlwYXNzZWQ8L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNieXBhc3MiPjxjaXRlPkJ5cGFzc2VkPC9jaXRlPjwvYT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48YSBocmVmPSIjZm9yYmlkZGVuIj48Y2l0ZT5Gb3JiaWRkZW48L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNpbmNsdWRlZCI+PGNpdGU+SW5jbHVkZWQ8L2NpdGU+PC9hPjwvdGQ+DQorPC90cj4NCis8dHIgYWxpZ249ImNlbnRlciIgdmFsaWduPSJtaWRkbGUiPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIiBhbGlnbj0icmlnaHQiPlJlZmVyZW5jZSBpbiBEVEQ8L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48YSBocmVmPSIjYXMtUEUiPjxjaXRlPkluY2x1ZGVkIGFzIFBFPC9jaXRlPjwvYT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48YSBocmVmPSIjZm9yYmlkZGVuIj48Y2l0ZT5Gb3JiaWRkZW48L2NpdGU+PC9hPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxhIGhyZWY9IiNmb3JiaWRkZW4iPjxjaXRlPkZvcmJpZGRlbjwvY2l0ZT48L2E+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGEgaHJlZj0iI2ZvcmJpZGRlbiI+PGNpdGU+Rm9yYmlkZGVuPC9jaXRlPjwvYT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48YSBocmVmPSIjZm9yYmlkZGVuIj48Y2l0ZT5Gb3JiaWRkZW48L2NpdGU+PC9hPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxkaXYgY2xhc3M9ImRpdjMiPiA8aDQ+PGEgbmFtZT0ibm90LXJlY29nbml6ZWQiPjwvYT40LjQuMQ0KK05vdCBSZWNvZ25pemVkPC9oND4gPHA+T3V0c2lkZSB0aGUgRFRELCB0aGUgPGNvZGU+JTwvY29kZT4gY2hhcmFjdGVyIGhhcyBubw0KK3NwZWNpYWwgc2lnbmlmaWNhbmNlOyB0aHVzLCB3aGF0IHdvdWxkIGJlIHBhcmFtZXRlciBlbnRpdHkgcmVmZXJlbmNlcyBpbiB0aGUNCitEVEQgYXJlIG5vdCByZWNvZ25pemVkIGFzIG1hcmt1cCBpbiA8YSBocmVmPSIjTlQtY29udGVudCI+Y29udGVudDwvYT4uIFNpbWlsYXJseSwNCit0aGUgbmFtZXMgb2YgdW5wYXJzZWQgZW50aXRpZXMgYXJlIG5vdCByZWNvZ25pemVkIGV4Y2VwdCB3aGVuIHRoZXkgYXBwZWFyDQoraW4gdGhlIHZhbHVlIG9mIGFuIGFwcHJvcHJpYXRlbHkgZGVjbGFyZWQgYXR0cmlidXRlLjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjMiPiA8aDQ+PGENCituYW1lPSJpbmNsdWRlZCI+PC9hPjQuNC4yIEluY2x1ZGVkPC9oND4gPHA+WzxhIHRpdGxlPSJJbmNsdWRlIiBuYW1lPSJkdC1pbmNsdWRlIj5EZWZpbml0aW9uPC9hPjoNCitBbiBlbnRpdHkgaXMgPGI+aW5jbHVkZWQ8L2I+IHdoZW4gaXRzIDxhIHRpdGxlPSJSZXBsYWNlbWVudCBUZXh0IiBocmVmPSIjZHQtcmVwbHRleHQiPnJlcGxhY2VtZW50DQordGV4dDwvYT4gaXMgcmV0cmlldmVkIGFuZCBwcm9jZXNzZWQsIGluIHBsYWNlIG9mIHRoZSByZWZlcmVuY2UgaXRzZWxmLCBhcw0KK3Rob3VnaCBpdCB3ZXJlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGF0IHRoZSBsb2NhdGlvbiB0aGUgcmVmZXJlbmNlIHdhcyByZWNvZ25pemVkLl0NCitUaGUgcmVwbGFjZW1lbnQgdGV4dCBtYXkgY29udGFpbiBib3RoIDxhIHRpdGxlPSJDaGFyYWN0ZXIgRGF0YSIgaHJlZj0iI2R0LWNoYXJkYXRhIj5jaGFyYWN0ZXINCitkYXRhPC9hPiBhbmQgKGV4Y2VwdCBmb3IgcGFyYW1ldGVyIGVudGl0aWVzKSA8YSB0aXRsZT0iTWFya3VwIiBocmVmPSIjZHQtbWFya3VwIj5tYXJrdXA8L2E+LA0KK3doaWNoIG11c3QgYmUgcmVjb2duaXplZCBpbiB0aGUgdXN1YWwgd2F5LiAoVGhlIHN0cmluZyAiPGNvZGU+QVQmYW1wO2FtcDtUOzwvY29kZT4iDQorZXhwYW5kcyB0byAiPGNvZGU+QVQmYW1wO1Q7PC9jb2RlPiIgYW5kIHRoZSByZW1haW5pbmcgYW1wZXJzYW5kIGlzIG5vdCByZWNvZ25pemVkDQorYXMgYW4gZW50aXR5LXJlZmVyZW5jZSBkZWxpbWl0ZXIuKSBBIGNoYXJhY3RlciByZWZlcmVuY2UgaXMgPGI+aW5jbHVkZWQ8L2I+DQord2hlbiB0aGUgaW5kaWNhdGVkIGNoYXJhY3RlciBpcyBwcm9jZXNzZWQgaW4gcGxhY2Ugb2YgdGhlIHJlZmVyZW5jZSBpdHNlbGYuIDwvcD4gPC9kaXY+IDxkaXYNCitjbGFzcz0iZGl2MyI+IDxoND48YSBuYW1lPSJpbmNsdWRlLWlmLXZhbGlkIj48L2E+NC40LjMgSW5jbHVkZWQgSWYgVmFsaWRhdGluZzwvaDQ+IDxwPldoZW4NCithbiBYTUwgcHJvY2Vzc29yIHJlY29nbml6ZXMgYSByZWZlcmVuY2UgdG8gYSBwYXJzZWQgZW50aXR5LCBpbiBvcmRlciB0byA8YQ0KK3RpdGxlPSJWYWxpZGl0eSIgaHJlZj0iI2R0LXZhbGlkIj52YWxpZGF0ZTwvYT4gdGhlIGRvY3VtZW50LCB0aGUgcHJvY2Vzc29yDQorbXVzdCA8YSB0aXRsZT0iSW5jbHVkZSIgaHJlZj0iI2R0LWluY2x1ZGUiPmluY2x1ZGU8L2E+IGl0cyByZXBsYWNlbWVudCB0ZXh0Lg0KK0lmIHRoZSBlbnRpdHkgaXMgZXh0ZXJuYWwsIGFuZCB0aGUgcHJvY2Vzc29yIGlzIG5vdCBhdHRlbXB0aW5nIHRvIHZhbGlkYXRlDQordGhlIFhNTCBkb2N1bWVudCwgdGhlIHByb2Nlc3NvciA8YSB0aXRsZT0iTWF5IiBocmVmPSIjZHQtbWF5Ij5tYXk8L2E+LCBidXQNCituZWVkIG5vdCwgaW5jbHVkZSB0aGUgZW50aXR5J3MgcmVwbGFjZW1lbnQgdGV4dC4gSWYgYSBub24tdmFsaWRhdGluZyBwcm9jZXNzb3INCitkb2VzIG5vdCBpbmNsdWRlIHRoZSByZXBsYWNlbWVudCB0ZXh0LCBpdCBtdXN0IGluZm9ybSB0aGUgYXBwbGljYXRpb24gdGhhdA0KK2l0IHJlY29nbml6ZWQsIGJ1dCBkaWQgbm90IHJlYWQsIHRoZSBlbnRpdHkuPC9wPiA8cD5UaGlzIHJ1bGUgaXMgYmFzZWQgb24NCit0aGUgcmVjb2duaXRpb24gdGhhdCB0aGUgYXV0b21hdGljIGluY2x1c2lvbiBwcm92aWRlZCBieSB0aGUgU0dNTCBhbmQgWE1MDQorZW50aXR5IG1lY2hhbmlzbSwgcHJpbWFyaWx5IGRlc2lnbmVkIHRvIHN1cHBvcnQgbW9kdWxhcml0eSBpbiBhdXRob3JpbmcsIGlzDQorbm90IG5lY2Vzc2FyaWx5IGFwcHJvcHJpYXRlIGZvciBvdGhlciBhcHBsaWNhdGlvbnMsIGluIHBhcnRpY3VsYXIgZG9jdW1lbnQNCiticm93c2luZy4gQnJvd3NlcnMsIGZvciBleGFtcGxlLCB3aGVuIGVuY291bnRlcmluZyBhbiBleHRlcm5hbCBwYXJzZWQgZW50aXR5DQorcmVmZXJlbmNlLCBtaWdodCBjaG9vc2UgdG8gcHJvdmlkZSBhIHZpc3VhbCBpbmRpY2F0aW9uIG9mIHRoZSBlbnRpdHkncyBwcmVzZW5jZQ0KK2FuZCByZXRyaWV2ZSBpdCBmb3IgZGlzcGxheSBvbmx5IG9uIGRlbWFuZC48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhDQorbmFtZT0iZm9yYmlkZGVuIj48L2E+NC40LjQgRm9yYmlkZGVuPC9oND4gPHA+VGhlIGZvbGxvd2luZyBhcmUgZm9yYmlkZGVuLA0KK2FuZCBjb25zdGl0dXRlIDxhIHRpdGxlPSJGYXRhbCBFcnJvciIgaHJlZj0iI2R0LWZhdGFsIj5mYXRhbDwvYT4gZXJyb3JzOjwvcD4gPHVsPg0KKzxsaT48cD50aGUgYXBwZWFyYW5jZSBvZiBhIHJlZmVyZW5jZSB0byBhbiA8YSB0aXRsZT0iVW5wYXJzZWQgRW50aXR5IiBocmVmPSIjZHQtdW5wYXJzZWQiPnVucGFyc2VkDQorZW50aXR5PC9hPi48L3A+PC9saT4NCis8bGk+PHA+dGhlIGFwcGVhcmFuY2Ugb2YgYW55IGNoYXJhY3RlciBvciBnZW5lcmFsLWVudGl0eSByZWZlcmVuY2UgaW4gdGhlDQorRFREIGV4Y2VwdCB3aXRoaW4gYW4gPGEgaHJlZj0iI05ULUVudGl0eVZhbHVlIj5FbnRpdHlWYWx1ZTwvYT4gb3IgPGEgaHJlZj0iI05ULUF0dFZhbHVlIj5BdHRWYWx1ZTwvYT4uPC9wPiA8L2xpPg0KKzxsaT48cD5hIHJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBlbnRpdHkgaW4gYW4gYXR0cmlidXRlIHZhbHVlLjwvcD48L2xpPg0KKzwvdWw+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhIG5hbWU9ImlubGl0ZXJhbCI+PC9hPjQuNC41IEluY2x1ZGVkDQoraW4gTGl0ZXJhbDwvaDQ+IDxwPldoZW4gYW4gPGEgdGl0bGU9IkVudGl0eSBSZWZlcmVuY2UiIGhyZWY9IiNkdC1lbnRyZWYiPmVudGl0eQ0KK3JlZmVyZW5jZTwvYT4gYXBwZWFycyBpbiBhbiBhdHRyaWJ1dGUgdmFsdWUsIG9yIGEgcGFyYW1ldGVyIGVudGl0eSByZWZlcmVuY2UNCithcHBlYXJzIGluIGEgbGl0ZXJhbCBlbnRpdHkgdmFsdWUsIGl0cyA8YSB0aXRsZT0iUmVwbGFjZW1lbnQgVGV4dCIgaHJlZj0iI2R0LXJlcGx0ZXh0Ij5yZXBsYWNlbWVudA0KK3RleHQ8L2E+IGlzIHByb2Nlc3NlZCBpbiBwbGFjZSBvZiB0aGUgcmVmZXJlbmNlIGl0c2VsZiBhcyB0aG91Z2ggaXQgd2VyZSBwYXJ0DQorb2YgdGhlIGRvY3VtZW50IGF0IHRoZSBsb2NhdGlvbiB0aGUgcmVmZXJlbmNlIHdhcyByZWNvZ25pemVkLCBleGNlcHQgdGhhdA0KK2Egc2luZ2xlIG9yIGRvdWJsZSBxdW90ZSBjaGFyYWN0ZXIgaW4gdGhlIHJlcGxhY2VtZW50IHRleHQgaXMgYWx3YXlzIHRyZWF0ZWQNCithcyBhIG5vcm1hbCBkYXRhIGNoYXJhY3RlciBhbmQgd2lsbCBub3QgdGVybWluYXRlIHRoZSBsaXRlcmFsLiBGb3IgZXhhbXBsZSwNCit0aGlzIGlzIHdlbGwtZm9ybWVkOjwvcD4gPHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiDQorYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDshLS0gIC0tPg0KKyZsdDshRU5USVRZICUgWU4gJyJZZXMiJyA+DQorJmx0OyFFTlRJVFkgV2hhdEhlU2FpZCAiSGUgc2FpZCAlWU47IiA+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDxwPndoaWxlIHRoaXMgaXMgbm90OjwvcD4gPHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSINCitjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDshRU5USVRZIEVuZEF0dHIgIjI3JyIgPg0KKyZsdDtlbGVtZW50IGF0dHJpYnV0ZT0nYS0mYW1wO0VuZEF0dHI7PjwvcHJlPjwvdGQ+DQorPC90cj4NCis8L3RhYmxlPiA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MyI+IDxoND48YSBuYW1lPSJub3RpZnkiPjwvYT40LjQuNiBOb3RpZnk8L2g0PiA8cD5XaGVuDQordGhlIG5hbWUgb2YgYW4gPGEgdGl0bGU9IlVucGFyc2VkIEVudGl0eSIgaHJlZj0iI2R0LXVucGFyc2VkIj51bnBhcnNlZCBlbnRpdHk8L2E+DQorYXBwZWFycyBhcyBhIHRva2VuIGluIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUgb2YgZGVjbGFyZWQgdHlwZSA8Yj5FTlRJVFk8L2I+DQorb3IgPGI+RU5USVRJRVM8L2I+LCBhIHZhbGlkYXRpbmcgcHJvY2Vzc29yIG11c3QgaW5mb3JtIHRoZSBhcHBsaWNhdGlvbiBvZg0KK3RoZSA8YSB0aXRsZT0iU3lzdGVtIElkZW50aWZpZXIiIGhyZWY9IiNkdC1zeXNpZCI+c3lzdGVtPC9hPiBhbmQgPGEgdGl0bGU9IlB1YmxpYyBpZGVudGlmaWVyIg0KK2hyZWY9IiNkdC1wdWJpZCI+cHVibGljPC9hPiAoaWYgYW55KSBpZGVudGlmaWVycyBmb3IgYm90aCB0aGUgZW50aXR5IGFuZCBpdHMNCithc3NvY2lhdGVkIDxhIHRpdGxlPSJOb3RhdGlvbiIgaHJlZj0iI2R0LW5vdGF0aW9uIj5ub3RhdGlvbjwvYT4uPC9wPiA8L2Rpdj4gPGRpdg0KK2NsYXNzPSJkaXYzIj4gPGg0PjxhIG5hbWU9ImJ5cGFzcyI+PC9hPjQuNC43IEJ5cGFzc2VkPC9oND4gPHA+V2hlbiBhIGdlbmVyYWwNCitlbnRpdHkgcmVmZXJlbmNlIGFwcGVhcnMgaW4gdGhlIDxhIGhyZWY9IiNOVC1FbnRpdHlWYWx1ZSI+RW50aXR5VmFsdWU8L2E+DQoraW4gYW4gZW50aXR5IGRlY2xhcmF0aW9uLCBpdCBpcyBieXBhc3NlZCBhbmQgbGVmdCBhcyBpcy48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYzIj4gPGg0PjxhDQorbmFtZT0iYXMtUEUiPjwvYT40LjQuOCBJbmNsdWRlZCBhcyBQRTwvaDQ+IDxwPkp1c3QgYXMgd2l0aCBleHRlcm5hbCBwYXJzZWQNCitlbnRpdGllcywgcGFyYW1ldGVyIGVudGl0aWVzIG5lZWQgb25seSBiZSA8YSBocmVmPSIjaW5jbHVkZS1pZi12YWxpZCI+PGNpdGU+aW5jbHVkZWQNCitpZiB2YWxpZGF0aW5nPC9jaXRlPjwvYT4uIFdoZW4gYSBwYXJhbWV0ZXItZW50aXR5IHJlZmVyZW5jZSBpcyByZWNvZ25pemVkDQoraW4gdGhlIERURCBhbmQgaW5jbHVkZWQsIGl0cyA8YSB0aXRsZT0iUmVwbGFjZW1lbnQgVGV4dCIgaHJlZj0iI2R0LXJlcGx0ZXh0Ij5yZXBsYWNlbWVudA0KK3RleHQ8L2E+IGlzIGVubGFyZ2VkIGJ5IHRoZSBhdHRhY2htZW50IG9mIG9uZSBsZWFkaW5nIGFuZCBvbmUgZm9sbG93aW5nIHNwYWNlDQorKCN4MjApIGNoYXJhY3RlcjsgdGhlIGludGVudCBpcyB0byBjb25zdHJhaW4gdGhlIHJlcGxhY2VtZW50IHRleHQgb2YgcGFyYW1ldGVyDQorZW50aXRpZXMgdG8gY29udGFpbiBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgZ3JhbW1hdGljYWwgdG9rZW5zIGluIHRoZSBEVEQuIFRoaXMNCitiZWhhdmlvciBkb2VzIG5vdCBhcHBseSB0byBwYXJhbWV0ZXIgZW50aXR5IHJlZmVyZW5jZXMgd2l0aGluIGVudGl0eSB2YWx1ZXM7DQordGhlc2UgYXJlIGRlc2NyaWJlZCBpbiA8YSBocmVmPSIjaW5saXRlcmFsIj48Yj40LjQuNSBJbmNsdWRlZCBpbiBMaXRlcmFsPC9iPjwvYT4uPC9wPiA8L2Rpdj4gPC9kaXY+IDxkaXYNCitjbGFzcz0iZGl2MiI+IDxoMz48YSBuYW1lPSJpbnRlcm4tcmVwbGFjZW1lbnQiPjwvYT40LjUgQ29uc3RydWN0aW9uIG9mIEludGVybmFsDQorRW50aXR5IFJlcGxhY2VtZW50IFRleHQ8L2gzPiA8cD5JbiBkaXNjdXNzaW5nIHRoZSB0cmVhdG1lbnQgb2YgaW50ZXJuYWwgZW50aXRpZXMsDQoraXQgaXMgdXNlZnVsIHRvIGRpc3Rpbmd1aXNoIHR3byBmb3JtcyBvZiB0aGUgZW50aXR5J3MgdmFsdWUuIFs8YSB0aXRsZT0iTGl0ZXJhbCBFbnRpdHkgVmFsdWUiDQorbmFtZT0iZHQtbGl0ZW50dmFsIj5EZWZpbml0aW9uPC9hPjogVGhlIDxiPmxpdGVyYWwgZW50aXR5IHZhbHVlPC9iPiBpcyB0aGUNCitxdW90ZWQgc3RyaW5nIGFjdHVhbGx5IHByZXNlbnQgaW4gdGhlIGVudGl0eSBkZWNsYXJhdGlvbiwgY29ycmVzcG9uZGluZyB0bw0KK3RoZSBub24tdGVybWluYWwgPGEgaHJlZj0iI05ULUVudGl0eVZhbHVlIj5FbnRpdHlWYWx1ZTwvYT4uXSBbPGEgdGl0bGU9IlJlcGxhY2VtZW50IFRleHQiDQorbmFtZT0iZHQtcmVwbHRleHQiPkRlZmluaXRpb248L2E+OiBUaGUgPGI+cmVwbGFjZW1lbnQgdGV4dDwvYj4gaXMgdGhlIGNvbnRlbnQNCitvZiB0aGUgZW50aXR5LCBhZnRlciByZXBsYWNlbWVudCBvZiBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBhbmQgcGFyYW1ldGVyLWVudGl0eQ0KK3JlZmVyZW5jZXMuXTwvcD4gPHA+VGhlIGxpdGVyYWwgZW50aXR5IHZhbHVlIGFzIGdpdmVuIGluIGFuIGludGVybmFsIGVudGl0eQ0KK2RlY2xhcmF0aW9uICg8YSBocmVmPSIjTlQtRW50aXR5VmFsdWUiPkVudGl0eVZhbHVlPC9hPikgbWF5IGNvbnRhaW4gY2hhcmFjdGVyLA0KK3BhcmFtZXRlci1lbnRpdHksIGFuZCBnZW5lcmFsLWVudGl0eSByZWZlcmVuY2VzLiBTdWNoIHJlZmVyZW5jZXMgbXVzdCBiZSBjb250YWluZWQNCitlbnRpcmVseSB3aXRoaW4gdGhlIGxpdGVyYWwgZW50aXR5IHZhbHVlLiBUaGUgYWN0dWFsIHJlcGxhY2VtZW50IHRleHQgdGhhdA0KK2lzIDxhIHRpdGxlPSJJbmNsdWRlIiBocmVmPSIjZHQtaW5jbHVkZSI+aW5jbHVkZWQ8L2E+IGFzIGRlc2NyaWJlZCBhYm92ZSBtdXN0DQorY29udGFpbiB0aGUgPGVtPnJlcGxhY2VtZW50IHRleHQ8L2VtPiBvZiBhbnkgcGFyYW1ldGVyIGVudGl0aWVzIHJlZmVycmVkIHRvLA0KK2FuZCBtdXN0IGNvbnRhaW4gdGhlIGNoYXJhY3RlciByZWZlcnJlZCB0bywgaW4gcGxhY2Ugb2YgYW55IGNoYXJhY3RlciByZWZlcmVuY2VzDQoraW4gdGhlIGxpdGVyYWwgZW50aXR5IHZhbHVlOyBob3dldmVyLCBnZW5lcmFsLWVudGl0eSByZWZlcmVuY2VzIG11c3QgYmUgbGVmdA0KK2FzLWlzLCB1bmV4cGFuZGVkLiBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIGZvbGxvd2luZyBkZWNsYXJhdGlvbnM6PC9wPiA8dGFibGUNCitjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0OyFFTlRJVFkgJSBwdWIgICAgIiZhbXA7I3hjOTtkaXRpb25zIEdhbGxpbWFyZCIgPg0KKyZsdDshRU5USVRZICAgcmlnaHRzICJBbGwgcmlnaHRzIHJlc2VydmVkIiA+DQorJmx0OyFFTlRJVFkgICBib29rICAgIkxhIFBlc3RlOiBBbGJlcnQgQ2FtdXMsDQorJmFtcDsjeEE5OyAxOTQ3ICVwdWI7LiAmYW1wO3JpZ2h0czsiID48L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPHA+dGhlbiB0aGUgcmVwbGFjZW1lbnQgdGV4dCBmb3IgdGhlIGVudGl0eSAiPGNvZGU+Ym9vazwvY29kZT4iIGlzOjwvcD4gPHRhYmxlDQorY2xhc3M9ImVnIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIiBjZWxscGFkZGluZz0iNSIgYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPkxhIFBlc3RlOiBBbGJlcnQgQ2FtdXMsDQorJmNvcHk7IDE5NDcgJkVhY3V0ZTtkaXRpb25zIEdhbGxpbWFyZC4gJmFtcDtyaWdodHM7PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDxwPlRoZSBnZW5lcmFsLWVudGl0eSByZWZlcmVuY2UgIjxjb2RlPiZhbXA7cmlnaHRzOzwvY29kZT4iIHdvdWxkDQorYmUgZXhwYW5kZWQgc2hvdWxkIHRoZSByZWZlcmVuY2UgIjxjb2RlPiZhbXA7Ym9vazs8L2NvZGU+IiBhcHBlYXIgaW4gdGhlIGRvY3VtZW50J3MNCitjb250ZW50IG9yIGFuIGF0dHJpYnV0ZSB2YWx1ZS48L3A+IDxwPlRoZXNlIHNpbXBsZSBydWxlcyBtYXkgaGF2ZSBjb21wbGV4DQoraW50ZXJhY3Rpb25zOyBmb3IgYSBkZXRhaWxlZCBkaXNjdXNzaW9uIG9mIGEgZGlmZmljdWx0IGV4YW1wbGUsIHNlZSA8YSBocmVmPSIjc2VjLWVudGV4cGFuZCI+PGI+RA0KK0V4cGFuc2lvbiBvZiBFbnRpdHkgYW5kIENoYXJhY3RlciBSZWZlcmVuY2VzPC9iPjwvYT4uPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MiI+IDxoMz48YQ0KK25hbWU9InNlYy1wcmVkZWZpbmVkLWVudCI+PC9hPjQuNiBQcmVkZWZpbmVkIEVudGl0aWVzPC9oMz4gPHA+WzxhIHRpdGxlPSJlc2NhcGUiDQorbmFtZT0iZHQtZXNjYXBlIj5EZWZpbml0aW9uPC9hPjogRW50aXR5IGFuZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcyBjYW4gYm90aA0KK2JlIHVzZWQgdG8gPGI+ZXNjYXBlPC9iPiB0aGUgbGVmdCBhbmdsZSBicmFja2V0LCBhbXBlcnNhbmQsIGFuZCBvdGhlciBkZWxpbWl0ZXJzLg0KK0Egc2V0IG9mIGdlbmVyYWwgZW50aXRpZXMgKDxjb2RlPmFtcDwvY29kZT4sIDxjb2RlPmx0PC9jb2RlPiwgPGNvZGU+Z3Q8L2NvZGU+LCA8Y29kZT5hcG9zPC9jb2RlPiwgPGNvZGU+cXVvdDwvY29kZT4pDQoraXMgc3BlY2lmaWVkIGZvciB0aGlzIHB1cnBvc2UuIE51bWVyaWMgY2hhcmFjdGVyIHJlZmVyZW5jZXMgbWF5IGFsc28gYmUgdXNlZDsNCit0aGV5IGFyZSBleHBhbmRlZCBpbW1lZGlhdGVseSB3aGVuIHJlY29nbml6ZWQgYW5kIG11c3QgYmUgdHJlYXRlZCBhcyBjaGFyYWN0ZXINCitkYXRhLCBzbyB0aGUgbnVtZXJpYyBjaGFyYWN0ZXIgcmVmZXJlbmNlcyAiPGNvZGU+JmFtcDsjNjA7PC9jb2RlPiIgYW5kICI8Y29kZT4mYW1wOyMzODs8L2NvZGU+Ig0KK21heSBiZSB1c2VkIHRvIGVzY2FwZSA8Y29kZT4mbHQ7PC9jb2RlPiBhbmQgPGNvZGU+JmFtcDs8L2NvZGU+IHdoZW4gdGhleSBvY2N1cg0KK2luIGNoYXJhY3RlciBkYXRhLl08L3A+IDxwPkFsbCBYTUwgcHJvY2Vzc29ycyBtdXN0IHJlY29nbml6ZSB0aGVzZSBlbnRpdGllcw0KK3doZXRoZXIgdGhleSBhcmUgZGVjbGFyZWQgb3Igbm90LiA8YSB0aXRsZT0iRm9yIGludGVyb3BlcmFiaWxpdHkiIGhyZWY9IiNkdC1pbnRlcm9wIj5Gb3INCitpbnRlcm9wZXJhYmlsaXR5PC9hPiwgdmFsaWQgWE1MIGRvY3VtZW50cyBzaG91bGQgZGVjbGFyZSB0aGVzZSBlbnRpdGllcywgbGlrZQ0KK2FueSBvdGhlcnMsIGJlZm9yZSB1c2luZyB0aGVtLiBJZiB0aGUgZW50aXRpZXMgPGNvZGU+bHQ8L2NvZGU+IG9yIDxjb2RlPmFtcDwvY29kZT4NCithcmUgZGVjbGFyZWQsIHRoZXkgbXVzdCBiZSBkZWNsYXJlZCBhcyBpbnRlcm5hbCBlbnRpdGllcyB3aG9zZSByZXBsYWNlbWVudA0KK3RleHQgaXMgYSBjaGFyYWN0ZXIgcmVmZXJlbmNlIHRvIHRoZSByZXNwZWN0aXZlIGNoYXJhY3RlciAobGVzcy10aGFuIHNpZ24NCitvciBhbXBlcnNhbmQpIGJlaW5nIGVzY2FwZWQ7IHRoZSBkb3VibGUgZXNjYXBpbmcgaXMgcmVxdWlyZWQgZm9yIHRoZXNlIGVudGl0aWVzDQorc28gdGhhdCByZWZlcmVuY2VzIHRvIHRoZW0gcHJvZHVjZSBhIHdlbGwtZm9ybWVkIHJlc3VsdC4gSWYgdGhlIGVudGl0aWVzIDxjb2RlPmd0PC9jb2RlPiwgPGNvZGU+YXBvczwvY29kZT4sDQorb3IgPGNvZGU+cXVvdDwvY29kZT4gYXJlIGRlY2xhcmVkLCB0aGV5IG11c3QgYmUgZGVjbGFyZWQgYXMgaW50ZXJuYWwgZW50aXRpZXMNCit3aG9zZSByZXBsYWNlbWVudCB0ZXh0IGlzIHRoZSBzaW5nbGUgY2hhcmFjdGVyIGJlaW5nIGVzY2FwZWQgKG9yIGEgY2hhcmFjdGVyDQorcmVmZXJlbmNlIHRvIHRoYXQgY2hhcmFjdGVyOyB0aGUgZG91YmxlIGVzY2FwaW5nIGhlcmUgaXMgdW5uZWNlc3NhcnkgYnV0IGhhcm1sZXNzKS4NCitGb3IgZXhhbXBsZTo8L3A+IDx0YWJsZSBjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1Ig0KK2JnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT4mbHQ7IUVOVElUWSBsdCAgICAgIiZhbXA7IzM4OyM2MDsiPg0KKyZsdDshRU5USVRZIGd0ICAgICAiJmFtcDsjNjI7Ij4NCismbHQ7IUVOVElUWSBhbXAgICAgIiZhbXA7IzM4OyMzODsiPg0KKyZsdDshRU5USVRZIGFwb3MgICAiJmFtcDsjMzk7Ij4NCismbHQ7IUVOVElUWSBxdW90ICAgIiZhbXA7IzM0OyI+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+ICA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MiI+IDxoMz48YSBuYW1lPSJOb3RhdGlvbnMiPjwvYT40LjcgTm90YXRpb24NCitEZWNsYXJhdGlvbnM8L2gzPiA8cD5bPGEgdGl0bGU9Ik5vdGF0aW9uIiBuYW1lPSJkdC1ub3RhdGlvbiI+RGVmaW5pdGlvbjwvYT46IDxiPk5vdGF0aW9uczwvYj4NCitpZGVudGlmeSBieSBuYW1lIHRoZSBmb3JtYXQgb2YgPGEgdGl0bGU9IkV4dGVybmFsIEVudGl0eSIgaHJlZj0iI2R0LWV4dGVudCI+dW5wYXJzZWQNCitlbnRpdGllczwvYT4sIHRoZSBmb3JtYXQgb2YgZWxlbWVudHMgd2hpY2ggYmVhciBhIG5vdGF0aW9uIGF0dHJpYnV0ZSwgb3IgdGhlDQorYXBwbGljYXRpb24gdG8gd2hpY2ggYSA8YSB0aXRsZT0iUHJvY2Vzc2luZyBpbnN0cnVjdGlvbiIgaHJlZj0iI2R0LXBpIj5wcm9jZXNzaW5nDQoraW5zdHJ1Y3Rpb248L2E+IGlzIGFkZHJlc3NlZC5dPC9wPiA8cD5bPGEgdGl0bGU9Ik5vdGF0aW9uIERlY2xhcmF0aW9uIiBuYW1lPSJkdC1ub3RkZWNsIj5EZWZpbml0aW9uPC9hPjoNCisgPGI+Tm90YXRpb24gZGVjbGFyYXRpb25zPC9iPiBwcm92aWRlIGEgbmFtZSBmb3IgdGhlIG5vdGF0aW9uLCBmb3IgdXNlIGluDQorZW50aXR5IGFuZCBhdHRyaWJ1dGUtbGlzdCBkZWNsYXJhdGlvbnMgYW5kIGluIGF0dHJpYnV0ZSBzcGVjaWZpY2F0aW9ucywgYW5kDQorYW4gZXh0ZXJuYWwgaWRlbnRpZmllciBmb3IgdGhlIG5vdGF0aW9uIHdoaWNoIG1heSBhbGxvdyBhbiBYTUwgcHJvY2Vzc29yIG9yDQoraXRzIGNsaWVudCBhcHBsaWNhdGlvbiB0byBsb2NhdGUgYSBoZWxwZXIgYXBwbGljYXRpb24gY2FwYWJsZSBvZiBwcm9jZXNzaW5nDQorZGF0YSBpbiB0aGUgZ2l2ZW4gbm90YXRpb24uXTwvcD4gPGg1Pk5vdGF0aW9uIERlY2xhcmF0aW9uczwvaDU+PHRhYmxlIGNsYXNzPSJzY3JhcCI+DQorPHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtTm90YXRpb25EZWNsIj48L2E+WzgyXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPk5vdGF0aW9uRGVjbDwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT4nJmx0OyFOT1RBVElPTicgPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1OYW1lIj5OYW1lPC9hPiA8YQ0KK2hyZWY9IiNOVC1TIj5TPC9hPiAoPGEgaHJlZj0iI05ULUV4dGVybmFsSUQiPkV4dGVybmFsSUQ8L2E+IHwgPGEgaHJlZj0iI05ULVB1YmxpY0lEIj5QdWJsaWNJRDwvYT4pIDxhDQoraHJlZj0iI05ULVMiPlM8L2E+PyAnPic8L2NvZGU+PC90ZD4NCis8dGQ+PGEgaHJlZj0iI1VuaXF1ZU5vdGF0aW9uTmFtZSI+W1ZDOiBVbmlxdWUgTm90YXRpb24gTmFtZV08L2E+PC90ZD4NCis8L3RyPg0KKzwvdGJvZHk+PHRib2R5Pg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtUHVibGljSUQiPjwvYT5bODNdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+UHVibGljSUQ8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+J1BVQkxJQycgPGEgaHJlZj0iI05ULVMiPlM8L2E+IDxhIGhyZWY9IiNOVC1QdWJpZExpdGVyYWwiPlB1YmlkTGl0ZXJhbDwvYT4gPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8L3Rib2R5PjwvdGFibGU+IDxkaXYgY2xhc3M9ImNvbnN0cmFpbnQiPjxwIGNsYXNzPSJwcmVmaXgiPjxhIG5hbWU9IlVuaXF1ZU5vdGF0aW9uTmFtZSI+PC9hPjxiPlZhbGlkaXR5DQorY29uc3RyYWludDogVW5pcXVlIE5vdGF0aW9uIE5hbWU8L2I+PC9wPjxwPk9ubHkgb25lIG5vdGF0aW9uIGRlY2xhcmF0aW9uIGNhbg0KK2RlY2xhcmUgYSBnaXZlbiA8YSBocmVmPSIjTlQtTmFtZSI+TmFtZTwvYT4uPC9wPiA8L2Rpdj4gPHA+WE1MIHByb2Nlc3NvcnMNCittdXN0IHByb3ZpZGUgYXBwbGljYXRpb25zIHdpdGggdGhlIG5hbWUgYW5kIGV4dGVybmFsIGlkZW50aWZpZXIocykgb2YgYW55DQorbm90YXRpb24gZGVjbGFyZWQgYW5kIHJlZmVycmVkIHRvIGluIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgYXR0cmlidXRlIGRlZmluaXRpb24sDQorb3IgZW50aXR5IGRlY2xhcmF0aW9uLiBUaGV5IG1heSBhZGRpdGlvbmFsbHkgcmVzb2x2ZSB0aGUgZXh0ZXJuYWwgaWRlbnRpZmllcg0KK2ludG8gdGhlIDxhIHRpdGxlPSJTeXN0ZW0gSWRlbnRpZmllciIgaHJlZj0iI2R0LXN5c2lkIj5zeXN0ZW0gaWRlbnRpZmllcjwvYT4sDQorZmlsZSBuYW1lLCBvciBvdGhlciBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gYWxsb3cgdGhlIGFwcGxpY2F0aW9uIHRvIGNhbGwgYQ0KK3Byb2Nlc3NvciBmb3IgZGF0YSBpbiB0aGUgbm90YXRpb24gZGVzY3JpYmVkLiAoSXQgaXMgbm90IGFuIGVycm9yLCBob3dldmVyLA0KK2ZvciBYTUwgZG9jdW1lbnRzIHRvIGRlY2xhcmUgYW5kIHJlZmVyIHRvIG5vdGF0aW9ucyBmb3Igd2hpY2ggbm90YXRpb24tc3BlY2lmaWMNCithcHBsaWNhdGlvbnMgYXJlIG5vdCBhdmFpbGFibGUgb24gdGhlIHN5c3RlbSB3aGVyZSB0aGUgWE1MIHByb2Nlc3NvciBvciBhcHBsaWNhdGlvbg0KK2lzIHJ1bm5pbmcuKTwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic2VjLWRvYy1lbnRpdHkiPjwvYT40LjgNCitEb2N1bWVudCBFbnRpdHk8L2gzPiA8cD5bPGEgdGl0bGU9IkRvY3VtZW50IEVudGl0eSIgbmFtZT0iZHQtZG9jZW50Ij5EZWZpbml0aW9uPC9hPjoNCitUaGUgPGI+ZG9jdW1lbnQgZW50aXR5PC9iPiBzZXJ2ZXMgYXMgdGhlIHJvb3Qgb2YgdGhlIGVudGl0eSB0cmVlIGFuZCBhIHN0YXJ0aW5nLXBvaW50DQorZm9yIGFuIDxhIHRpdGxlPSJYTUwgUHJvY2Vzc29yIiBocmVmPSIjZHQteG1sLXByb2MiPlhNTCBwcm9jZXNzb3I8L2E+Ll0gVGhpcw0KK3NwZWNpZmljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSBob3cgdGhlIGRvY3VtZW50IGVudGl0eSBpcyB0byBiZSBsb2NhdGVkIGJ5DQorYW4gWE1MIHByb2Nlc3NvcjsgdW5saWtlIG90aGVyIGVudGl0aWVzLCB0aGUgZG9jdW1lbnQgZW50aXR5IGhhcyBubyBuYW1lIGFuZA0KK21pZ2h0IHdlbGwgYXBwZWFyIG9uIGEgcHJvY2Vzc29yIGlucHV0IHN0cmVhbSB3aXRob3V0IGFueSBpZGVudGlmaWNhdGlvbiBhdA0KK2FsbC48L3A+IDwvZGl2PiA8L2Rpdj4gIDxkaXYgY2xhc3M9ImRpdjEiPiA8aDI+PGEgbmFtZT0ic2VjLWNvbmZvcm1hbmNlIj48L2E+NQ0KK0NvbmZvcm1hbmNlPC9oMj4gPGRpdiBjbGFzcz0iZGl2MiI+IDxoMz48YSBuYW1lPSJwcm9jLXR5cGVzIj48L2E+NS4xIFZhbGlkYXRpbmcNCithbmQgTm9uLVZhbGlkYXRpbmcgUHJvY2Vzc29yczwvaDM+IDxwPkNvbmZvcm1pbmcgPGEgdGl0bGU9IlhNTCBQcm9jZXNzb3IiDQoraHJlZj0iI2R0LXhtbC1wcm9jIj5YTUwgcHJvY2Vzc29yczwvYT4gZmFsbCBpbnRvIHR3byBjbGFzc2VzOiB2YWxpZGF0aW5nIGFuZA0KK25vbi12YWxpZGF0aW5nLjwvcD4gPHA+VmFsaWRhdGluZyBhbmQgbm9uLXZhbGlkYXRpbmcgcHJvY2Vzc29ycyBhbGlrZSBtdXN0DQorcmVwb3J0IHZpb2xhdGlvbnMgb2YgdGhpcyBzcGVjaWZpY2F0aW9uJ3Mgd2VsbC1mb3JtZWRuZXNzIGNvbnN0cmFpbnRzIGluIHRoZQ0KK2NvbnRlbnQgb2YgdGhlIDxhIHRpdGxlPSJEb2N1bWVudCBFbnRpdHkiIGhyZWY9IiNkdC1kb2NlbnQiPmRvY3VtZW50IGVudGl0eTwvYT4NCithbmQgYW55IG90aGVyIDxhIHRpdGxlPSJUZXh0IEVudGl0eSIgaHJlZj0iI2R0LXBhcnNlZGVudCI+cGFyc2VkIGVudGl0aWVzPC9hPg0KK3RoYXQgdGhleSByZWFkLjwvcD4gPHA+WzxhIHRpdGxlPSJWYWxpZGF0aW5nIFByb2Nlc3NvciIgbmFtZT0iZHQtdmFsaWRhdGluZyI+RGVmaW5pdGlvbjwvYT46IDxiPlZhbGlkYXRpbmcNCitwcm9jZXNzb3JzPC9iPiBtdXN0LCBhdCB1c2VyIG9wdGlvbiwgcmVwb3J0IHZpb2xhdGlvbnMgb2YgdGhlIGNvbnN0cmFpbnRzDQorZXhwcmVzc2VkIGJ5IHRoZSBkZWNsYXJhdGlvbnMgaW4gdGhlIDxhIHRpdGxlPSJEb2N1bWVudCBUeXBlIERlY2xhcmF0aW9uIg0KK2hyZWY9IiNkdC1kb2N0eXBlIj5EVEQ8L2E+LCBhbmQgZmFpbHVyZXMgdG8gZnVsZmlsbCB0aGUgdmFsaWRpdHkgY29uc3RyYWludHMNCitnaXZlbiBpbiB0aGlzIHNwZWNpZmljYXRpb24uXSBUbyBhY2NvbXBsaXNoIHRoaXMsIHZhbGlkYXRpbmcgWE1MIHByb2Nlc3NvcnMNCittdXN0IHJlYWQgYW5kIHByb2Nlc3MgdGhlIGVudGlyZSBEVEQgYW5kIGFsbCBleHRlcm5hbCBwYXJzZWQgZW50aXRpZXMgcmVmZXJlbmNlZA0KK2luIHRoZSBkb2N1bWVudC48L3A+IDxwPk5vbi12YWxpZGF0aW5nIHByb2Nlc3NvcnMgYXJlIHJlcXVpcmVkIHRvIGNoZWNrIG9ubHkNCit0aGUgPGEgdGl0bGU9IkRvY3VtZW50IEVudGl0eSIgaHJlZj0iI2R0LWRvY2VudCI+ZG9jdW1lbnQgZW50aXR5PC9hPiwgaW5jbHVkaW5nDQordGhlIGVudGlyZSBpbnRlcm5hbCBEVEQgc3Vic2V0LCBmb3Igd2VsbC1mb3JtZWRuZXNzLiBbPGEgdGl0bGU9IlByb2Nlc3MgRGVjbGFyYXRpb25zIg0KK25hbWU9ImR0LXVzZS1tZGVjbCI+RGVmaW5pdGlvbjwvYT46ICBXaGlsZSB0aGV5IGFyZSBub3QgcmVxdWlyZWQgdG8gY2hlY2sNCit0aGUgZG9jdW1lbnQgZm9yIHZhbGlkaXR5LCB0aGV5IGFyZSByZXF1aXJlZCB0byA8Yj5wcm9jZXNzPC9iPiBhbGwgdGhlIGRlY2xhcmF0aW9ucw0KK3RoZXkgcmVhZCBpbiB0aGUgaW50ZXJuYWwgRFREIHN1YnNldCBhbmQgaW4gYW55IHBhcmFtZXRlciBlbnRpdHkgdGhhdCB0aGV5DQorcmVhZCwgdXAgdG8gdGhlIGZpcnN0IHJlZmVyZW5jZSB0byBhIHBhcmFtZXRlciBlbnRpdHkgdGhhdCB0aGV5IGRvIDxlbT5ub3Q8L2VtPg0KK3JlYWQ7IHRoYXQgaXMgdG8gc2F5LCB0aGV5IG11c3QgdXNlIHRoZSBpbmZvcm1hdGlvbiBpbiB0aG9zZSBkZWNsYXJhdGlvbnMNCit0byA8YSBocmVmPSIjQVZOb3JtYWxpemUiPjxjaXRlPm5vcm1hbGl6ZTwvY2l0ZT48L2E+IGF0dHJpYnV0ZSB2YWx1ZXMsIDxhDQoraHJlZj0iI2luY2x1ZGVkIj48Y2l0ZT5pbmNsdWRlPC9jaXRlPjwvYT4gdGhlIHJlcGxhY2VtZW50IHRleHQgb2YgaW50ZXJuYWwNCitlbnRpdGllcywgYW5kIHN1cHBseSA8YSBocmVmPSIjc2VjLWF0dHItZGVmYXVsdHMiPjxjaXRlPmRlZmF1bHQgYXR0cmlidXRlDQordmFsdWVzPC9jaXRlPjwvYT4uXSBFeGNlcHQgd2hlbiA8Y29kZT5zdGFuZGFsb25lPSJ5ZXMiPC9jb2RlPiwgdGhleSBtdXN0IG5vdCA8YQ0KK3RpdGxlPSJQcm9jZXNzIERlY2xhcmF0aW9ucyIgaHJlZj0iI2R0LXVzZS1tZGVjbCI+cHJvY2VzczwvYT4gPGEgdGl0bGU9ImVudGl0eSBkZWNsYXJhdGlvbiINCitocmVmPSIjZHQtZW50ZGVjbCI+ZW50aXR5IGRlY2xhcmF0aW9uczwvYT4gb3IgPGEgdGl0bGU9IkF0dHJpYnV0ZS1MaXN0IERlY2xhcmF0aW9uIg0KK2hyZWY9IiNkdC1hdHRkZWNsIj5hdHRyaWJ1dGUtbGlzdCBkZWNsYXJhdGlvbnM8L2E+IGVuY291bnRlcmVkIGFmdGVyIGEgcmVmZXJlbmNlDQordG8gYSBwYXJhbWV0ZXIgZW50aXR5IHRoYXQgaXMgbm90IHJlYWQsIHNpbmNlIHRoZSBlbnRpdHkgbWF5IGhhdmUgY29udGFpbmVkDQorb3ZlcnJpZGluZyBkZWNsYXJhdGlvbnMuPC9wPiA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MiI+IDxoMz48YSBuYW1lPSJzYWZlLWJlaGF2aW9yIj48L2E+NS4yDQorVXNpbmcgWE1MIFByb2Nlc3NvcnM8L2gzPiA8cD5UaGUgYmVoYXZpb3Igb2YgYSB2YWxpZGF0aW5nIFhNTCBwcm9jZXNzb3IgaXMNCitoaWdobHkgcHJlZGljdGFibGU7IGl0IG11c3QgcmVhZCBldmVyeSBwaWVjZSBvZiBhIGRvY3VtZW50IGFuZCByZXBvcnQgYWxsDQord2VsbC1mb3JtZWRuZXNzIGFuZCB2YWxpZGl0eSB2aW9sYXRpb25zLiBMZXNzIGlzIHJlcXVpcmVkIG9mIGEgbm9uLXZhbGlkYXRpbmcNCitwcm9jZXNzb3I7IGl0IG5lZWQgbm90IHJlYWQgYW55IHBhcnQgb2YgdGhlIGRvY3VtZW50IG90aGVyIHRoYW4gdGhlIGRvY3VtZW50DQorZW50aXR5LiBUaGlzIGhhcyB0d28gZWZmZWN0cyB0aGF0IG1heSBiZSBpbXBvcnRhbnQgdG8gdXNlcnMgb2YgWE1MIHByb2Nlc3NvcnM6PC9wPiA8dWw+DQorPGxpPjxwPkNlcnRhaW4gd2VsbC1mb3JtZWRuZXNzIGVycm9ycywgc3BlY2lmaWNhbGx5IHRob3NlIHRoYXQgcmVxdWlyZSByZWFkaW5nDQorZXh0ZXJuYWwgZW50aXRpZXMsIG1heSBub3QgYmUgZGV0ZWN0ZWQgYnkgYSBub24tdmFsaWRhdGluZyBwcm9jZXNzb3IuIEV4YW1wbGVzDQoraW5jbHVkZSB0aGUgY29uc3RyYWludHMgZW50aXRsZWQgPGEgaHJlZj0iI3dmLWVudGRlY2xhcmVkIj48Y2l0ZT5FbnRpdHkgRGVjbGFyZWQ8L2NpdGU+PC9hPiwgPGENCitocmVmPSIjdGV4dGVudCI+PGNpdGU+UGFyc2VkIEVudGl0eTwvY2l0ZT48L2E+LCBhbmQgPGEgaHJlZj0iI25vcmVjdXJzaW9uIj48Y2l0ZT5Obw0KK1JlY3Vyc2lvbjwvY2l0ZT48L2E+LCBhcyB3ZWxsIGFzIHNvbWUgb2YgdGhlIGNhc2VzIGRlc2NyaWJlZCBhcyA8YSBocmVmPSIjZm9yYmlkZGVuIj48Y2l0ZT5mb3JiaWRkZW48L2NpdGU+PC9hPg0KK2luIDxhIGhyZWY9IiNlbnRwcm9jIj48Yj40LjQgWE1MIFByb2Nlc3NvciBUcmVhdG1lbnQgb2YgRW50aXRpZXMgYW5kIFJlZmVyZW5jZXM8L2I+PC9hPi48L3A+PC9saT4NCis8bGk+PHA+VGhlIGluZm9ybWF0aW9uIHBhc3NlZCBmcm9tIHRoZSBwcm9jZXNzb3IgdG8gdGhlIGFwcGxpY2F0aW9uIG1heSB2YXJ5LA0KK2RlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBwcm9jZXNzb3IgcmVhZHMgcGFyYW1ldGVyIGFuZCBleHRlcm5hbCBlbnRpdGllcy4NCitGb3IgZXhhbXBsZSwgYSBub24tdmFsaWRhdGluZyBwcm9jZXNzb3IgbWF5IG5vdCA8YSBocmVmPSIjQVZOb3JtYWxpemUiPjxjaXRlPm5vcm1hbGl6ZTwvY2l0ZT48L2E+DQorYXR0cmlidXRlIHZhbHVlcywgPGEgaHJlZj0iI2luY2x1ZGVkIj48Y2l0ZT5pbmNsdWRlPC9jaXRlPjwvYT4gdGhlIHJlcGxhY2VtZW50DQordGV4dCBvZiBpbnRlcm5hbCBlbnRpdGllcywgb3Igc3VwcGx5IDxhIGhyZWY9IiNzZWMtYXR0ci1kZWZhdWx0cyI+PGNpdGU+ZGVmYXVsdA0KK2F0dHJpYnV0ZSB2YWx1ZXM8L2NpdGU+PC9hPiwgd2hlcmUgZG9pbmcgc28gZGVwZW5kcyBvbiBoYXZpbmcgcmVhZCBkZWNsYXJhdGlvbnMNCitpbiBleHRlcm5hbCBvciBwYXJhbWV0ZXIgZW50aXRpZXMuPC9wPjwvbGk+DQorPC91bD4gPHA+Rm9yIG1heGltdW0gcmVsaWFiaWxpdHkgaW4gaW50ZXJvcGVyYXRpbmcgYmV0d2VlbiBkaWZmZXJlbnQgWE1MIHByb2Nlc3NvcnMsDQorYXBwbGljYXRpb25zIHdoaWNoIHVzZSBub24tdmFsaWRhdGluZyBwcm9jZXNzb3JzIHNob3VsZCBub3QgcmVseSBvbiBhbnkgYmVoYXZpb3JzDQorbm90IHJlcXVpcmVkIG9mIHN1Y2ggcHJvY2Vzc29ycy4gQXBwbGljYXRpb25zIHdoaWNoIHJlcXVpcmUgZmFjaWxpdGllcyBzdWNoDQorYXMgdGhlIHVzZSBvZiBkZWZhdWx0IGF0dHJpYnV0ZXMgb3IgaW50ZXJuYWwgZW50aXRpZXMgd2hpY2ggYXJlIGRlY2xhcmVkIGluDQorZXh0ZXJuYWwgZW50aXRpZXMgc2hvdWxkIHVzZSB2YWxpZGF0aW5nIFhNTCBwcm9jZXNzb3JzLjwvcD4gPC9kaXY+IDwvZGl2PiA8ZGl2DQorY2xhc3M9ImRpdjEiPiA8aDI+PGEgbmFtZT0ic2VjLW5vdGF0aW9uIj48L2E+NiBOb3RhdGlvbjwvaDI+IDxwPlRoZSBmb3JtYWwNCitncmFtbWFyIG9mIFhNTCBpcyBnaXZlbiBpbiB0aGlzIHNwZWNpZmljYXRpb24gdXNpbmcgYSBzaW1wbGUgRXh0ZW5kZWQgQmFja3VzLU5hdXINCitGb3JtIChFQk5GKSBub3RhdGlvbi4gRWFjaCBydWxlIGluIHRoZSBncmFtbWFyIGRlZmluZXMgb25lIHN5bWJvbCwgaW4gdGhlDQorZm9ybTwvcD4gPHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiIGJnY29sb3I9IiM5OWZmZmYiPg0KKzx0cj4NCis8dGQ+PHByZT5zeW1ib2wgOjo9IGV4cHJlc3Npb248L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPHA+U3ltYm9scyBhcmUgd3JpdHRlbiB3aXRoIGFuIGluaXRpYWwgY2FwaXRhbCBsZXR0ZXIgaWYgdGhleSBhcmUNCit0aGUgc3RhcnQgc3ltYm9sIG9mIGEgcmVndWxhciBsYW5ndWFnZSwgb3RoZXJ3aXNlIHdpdGggYW4gaW5pdGlhbCBsb3dlciBjYXNlDQorbGV0dGVyLiBMaXRlcmFsIHN0cmluZ3MgYXJlIHF1b3RlZC48L3A+IDxwPldpdGhpbiB0aGUgZXhwcmVzc2lvbiBvbiB0aGUgcmlnaHQtaGFuZA0KK3NpZGUgb2YgYSBydWxlLCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIGFyZSB1c2VkIHRvIG1hdGNoIHN0cmluZ3Mgb2Ygb25lDQorb3IgbW9yZSBjaGFyYWN0ZXJzOiA8L3A+PGRsPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxjb2RlPiN4TjwvY29kZT48L2R0Pg0KKzxkZD4gPHA+d2hlcmUgPGNvZGU+TjwvY29kZT4gaXMgYSBoZXhhZGVjaW1hbCBpbnRlZ2VyLCB0aGUgZXhwcmVzc2lvbiBtYXRjaGVzDQordGhlIGNoYXJhY3RlciBpbiBJU08vSUVDIDEwNjQ2IHdob3NlIGNhbm9uaWNhbCAoVUNTLTQpIGNvZGUgdmFsdWUsIHdoZW4gaW50ZXJwcmV0ZWQNCithcyBhbiB1bnNpZ25lZCBiaW5hcnkgbnVtYmVyLCBoYXMgdGhlIHZhbHVlIGluZGljYXRlZC4gVGhlIG51bWJlciBvZiBsZWFkaW5nDQoremVyb3MgaW4gdGhlIDxjb2RlPiN4TjwvY29kZT4gZm9ybSBpcyBpbnNpZ25pZmljYW50OyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcNCit6ZXJvcyBpbiB0aGUgY29ycmVzcG9uZGluZyBjb2RlIHZhbHVlIGlzIGdvdmVybmVkIGJ5IHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcNCitpbiB1c2UgYW5kIGlzIG5vdCBzaWduaWZpY2FudCBmb3IgWE1MLjwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48Y29kZT5bYS16QS1aXTwvY29kZT4sIDxjb2RlPlsjeE4tI3hOXTwvY29kZT48L2R0Pg0KKzxkZD4gPHA+bWF0Y2hlcyBhbnkgPGEgaHJlZj0iI05ULUNoYXIiPkNoYXI8L2E+IHdpdGggYSB2YWx1ZSBpbiB0aGUgcmFuZ2UocykNCitpbmRpY2F0ZWQgKGluY2x1c2l2ZSkuPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxjb2RlPlthYmNdPC9jb2RlPiwgPGNvZGU+WyN4TiN4TiN4Tl08L2NvZGU+PC9kdD4NCis8ZGQ+IDxwPm1hdGNoZXMgYW55IDxhIGhyZWY9IiNOVC1DaGFyIj5DaGFyPC9hPiB3aXRoIGEgdmFsdWUgYW1vbmcgdGhlIGNoYXJhY3RlcnMNCitlbnVtZXJhdGVkLiBFbnVtZXJhdGlvbnMgYW5kIHJhbmdlcyBjYW4gYmUgbWl4ZWQgaW4gb25lIHNldCBvZiBicmFja2V0cy48L3A+IDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGNvZGU+W15hLXpdPC9jb2RlPiwgPGNvZGU+W14jeE4tI3hOXTwvY29kZT48L2R0Pg0KKzxkZD4gPHA+bWF0Y2hlcyBhbnkgPGEgaHJlZj0iI05ULUNoYXIiPkNoYXI8L2E+IHdpdGggYSB2YWx1ZSA8ZW0+b3V0c2lkZTwvZW0+DQordGhlIHJhbmdlIGluZGljYXRlZC48L3A+IDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGNvZGU+W15hYmNdPC9jb2RlPiwgPGNvZGU+W14jeE4jeE4jeE5dPC9jb2RlPjwvZHQ+DQorPGRkPiA8cD5tYXRjaGVzIGFueSA8YSBocmVmPSIjTlQtQ2hhciI+Q2hhcjwvYT4gd2l0aCBhIHZhbHVlIG5vdCBhbW9uZyB0aGUNCitjaGFyYWN0ZXJzIGdpdmVuLiBFbnVtZXJhdGlvbnMgYW5kIHJhbmdlcyBvZiBmb3JiaWRkZW4gdmFsdWVzIGNhbiBiZSBtaXhlZA0KK2luIG9uZSBzZXQgb2YgYnJhY2tldHMuPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxjb2RlPiJzdHJpbmciPC9jb2RlPjwvZHQ+DQorPGRkPiA8cD5tYXRjaGVzIGEgbGl0ZXJhbCBzdHJpbmcgPGEgdGl0bGU9Im1hdGNoIiBocmVmPSIjZHQtbWF0Y2giPm1hdGNoaW5nPC9hPg0KK3RoYXQgZ2l2ZW4gaW5zaWRlIHRoZSBkb3VibGUgcXVvdGVzLjwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48Y29kZT4nc3RyaW5nJzwvY29kZT48L2R0Pg0KKzxkZD4gPHA+bWF0Y2hlcyBhIGxpdGVyYWwgc3RyaW5nIDxhIHRpdGxlPSJtYXRjaCIgaHJlZj0iI2R0LW1hdGNoIj5tYXRjaGluZzwvYT4NCit0aGF0IGdpdmVuIGluc2lkZSB0aGUgc2luZ2xlIHF1b3Rlcy48L3A+IDwvZGQ+DQorPC9kbD48cD4gVGhlc2Ugc3ltYm9scyBtYXkgYmUgY29tYmluZWQgdG8gbWF0Y2ggbW9yZSBjb21wbGV4IHBhdHRlcm5zIGFzIGZvbGxvd3MsDQord2hlcmUgPGNvZGU+QTwvY29kZT4gYW5kIDxjb2RlPkI8L2NvZGU+IHJlcHJlc2VudCBzaW1wbGUgZXhwcmVzc2lvbnM6IDwvcD48ZGw+DQorPGR0IGNsYXNzPSJsYWJlbCI+KDxjb2RlPmV4cHJlc3Npb248L2NvZGU+KTwvZHQ+DQorPGRkPiA8cD48Y29kZT5leHByZXNzaW9uPC9jb2RlPiBpcyB0cmVhdGVkIGFzIGEgdW5pdCBhbmQgbWF5IGJlIGNvbWJpbmVkIGFzDQorZGVzY3JpYmVkIGluIHRoaXMgbGlzdC48L3A+IDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGNvZGU+QT88L2NvZGU+PC9kdD4NCis8ZGQ+IDxwPm1hdGNoZXMgPGNvZGU+QTwvY29kZT4gb3Igbm90aGluZzsgb3B0aW9uYWwgPGNvZGU+QTwvY29kZT4uPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxjb2RlPkEgQjwvY29kZT48L2R0Pg0KKzxkZD4gPHA+bWF0Y2hlcyA8Y29kZT5BPC9jb2RlPiBmb2xsb3dlZCBieSA8Y29kZT5CPC9jb2RlPi4gVGhpcyBvcGVyYXRvciBoYXMNCitoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIGFsdGVybmF0aW9uOyB0aHVzIDxjb2RlPkEgQiB8IEMgRDwvY29kZT4gaXMgaWRlbnRpY2FsDQordG8gPGNvZGU+KEEgQikgfCAoQyBEKTwvY29kZT4uPC9wPiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxjb2RlPkEgfCBCPC9jb2RlPjwvZHQ+DQorPGRkPiA8cD5tYXRjaGVzIDxjb2RlPkE8L2NvZGU+IG9yIDxjb2RlPkI8L2NvZGU+IGJ1dCBub3QgYm90aC48L3A+IDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGNvZGU+QSAtIEI8L2NvZGU+PC9kdD4NCis8ZGQ+IDxwPm1hdGNoZXMgYW55IHN0cmluZyB0aGF0IG1hdGNoZXMgPGNvZGU+QTwvY29kZT4gYnV0IGRvZXMgbm90IG1hdGNoIDxjb2RlPkI8L2NvZGU+LjwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48Y29kZT5BKzwvY29kZT48L2R0Pg0KKzxkZD4gPHA+bWF0Y2hlcyBvbmUgb3IgbW9yZSBvY2N1cnJlbmNlcyBvZiA8Y29kZT5BPC9jb2RlPi5Db25jYXRlbmF0aW9uIGhhcw0KK2hpZ2hlciBwcmVjZWRlbmNlIHRoYW4gYWx0ZXJuYXRpb247IHRodXMgPGNvZGU+QSsgfCBCKzwvY29kZT4gaXMgaWRlbnRpY2FsDQordG8gPGNvZGU+KEErKSB8IChCKyk8L2NvZGU+LjwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48Y29kZT5BKjwvY29kZT48L2R0Pg0KKzxkZD4gPHA+bWF0Y2hlcyB6ZXJvIG9yIG1vcmUgb2NjdXJyZW5jZXMgb2YgPGNvZGU+QTwvY29kZT4uIENvbmNhdGVuYXRpb24NCitoYXMgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBhbHRlcm5hdGlvbjsgdGh1cyA8Y29kZT5BKiB8IEIqPC9jb2RlPiBpcyBpZGVudGljYWwNCit0byA8Y29kZT4oQSopIHwgKEIqKTwvY29kZT4uPC9wPiA8L2RkPg0KKzwvZGw+PHA+IE90aGVyIG5vdGF0aW9ucyB1c2VkIGluIHRoZSBwcm9kdWN0aW9ucyBhcmU6IDwvcD48ZGw+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGNvZGU+LyogLi4uICovPC9jb2RlPjwvZHQ+DQorPGRkPiA8cD5jb21tZW50LjwvcD4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48Y29kZT5bIHdmYzogLi4uIF08L2NvZGU+PC9kdD4NCis8ZGQ+IDxwPndlbGwtZm9ybWVkbmVzcyBjb25zdHJhaW50OyB0aGlzIGlkZW50aWZpZXMgYnkgbmFtZSBhIGNvbnN0cmFpbnQgb24gPGENCit0aXRsZT0iV2VsbC1Gb3JtZWQiIGhyZWY9IiNkdC13ZWxsZm9ybWVkIj53ZWxsLWZvcm1lZDwvYT4gZG9jdW1lbnRzIGFzc29jaWF0ZWQNCit3aXRoIGEgcHJvZHVjdGlvbi48L3A+IDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGNvZGU+WyB2YzogLi4uIF08L2NvZGU+PC9kdD4NCis8ZGQ+IDxwPnZhbGlkaXR5IGNvbnN0cmFpbnQ7IHRoaXMgaWRlbnRpZmllcyBieSBuYW1lIGEgY29uc3RyYWludCBvbiA8YSB0aXRsZT0iVmFsaWRpdHkiDQoraHJlZj0iI2R0LXZhbGlkIj52YWxpZDwvYT4gZG9jdW1lbnRzIGFzc29jaWF0ZWQgd2l0aCBhIHByb2R1Y3Rpb24uPC9wPiA8L2RkPg0KKzwvZGw+PHA+PC9wPiA8L2Rpdj4gPC9kaXY+PGRpdiBjbGFzcz0iYmFjayI+ICAgPGRpdiBjbGFzcz0iZGl2MSI+IDxoMj48YSBuYW1lPSJzZWMtYmlibGlvZ3JhcGh5Ij48L2E+QQ0KK1JlZmVyZW5jZXM8L2gyPiA8ZGl2IGNsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9InNlYy1leGlzdGluZy1zdGRzIj48L2E+QS4xDQorTm9ybWF0aXZlIFJlZmVyZW5jZXM8L2gzPiA8ZGw+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0iSUFOQSI+PC9hPklBTkEtQ0hBUlNFVFM8L2R0Pg0KKzxkZD4oSW50ZXJuZXQgQXNzaWduZWQgTnVtYmVycyBBdXRob3JpdHkpIDxjaXRlPk9mZmljaWFsIE5hbWVzIGZvciBDaGFyYWN0ZXINCitTZXRzPC9jaXRlPiwgZWQuIEtlbGQgU2ltb25zZW4gZXQgYWwuIFNlZSA8YSBocmVmPSJmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9pYW5hL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzIj5mdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9pYW5hL2Fzc2lnbm1lbnRzL2NoYXJhY3Rlci1zZXRzPC9hDQorPi4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48YSBuYW1lPSJSRkMxNzY2Ij48L2E+SUVURiBSRkMgMTc2NjwvZHQ+DQorPGRkPklFVEYgKEludGVybmV0IEVuZ2luZWVyaW5nIFRhc2sgRm9yY2UpLiA8Y2l0ZT5SRkMgMTc2NjogVGFncyBmb3IgdGhlIElkZW50aWZpY2F0aW9uDQorb2YgTGFuZ3VhZ2VzPC9jaXRlPiwgZWQuIEguIEFsdmVzdHJhbmQuIDE5OTUuICAoU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzE3NjYudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMxNzY2LnR4dDwvYT4uKTwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0iSVNPMTA2NDYiPjwvYT5JU08vSUVDIDEwNjQ2PC9kdD4NCis8ZGQ+SVNPIChJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uKS4gPGNpdGU+SVNPL0lFQyAxMDY0Ni0xOTkzDQorKEUpLiBJbmZvcm1hdGlvbiB0ZWNobm9sb2d5IC0tIFVuaXZlcnNhbCBNdWx0aXBsZS1PY3RldCBDb2RlZCBDaGFyYWN0ZXIgU2V0DQorKFVDUykgLS0gUGFydCAxOiBBcmNoaXRlY3R1cmUgYW5kIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZS48L2NpdGU+IFtHZW5ldmFdOg0KK0ludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24sIDE5OTMgKHBsdXMgYW1lbmRtZW50cyBBTSAxDQordGhyb3VnaCBBTSA3KS48L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxhIG5hbWU9IklTTzEwNjQ2LTIwMDAiPjwvYT5JU08vSUVDIDEwNjQ2LTIwMDA8L2R0Pg0KKzxkZD4gSVNPIChJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uKS4gPGNpdGU+SVNPL0lFQyAxMDY0Ni0xOjIwMDAuDQorSW5mb3JtYXRpb24gdGVjaG5vbG9neSAtLSBVbml2ZXJzYWwgTXVsdGlwbGUtT2N0ZXQgQ29kZWQgQ2hhcmFjdGVyIFNldCAoVUNTKQ0KKy0tIFBhcnQgMTogQXJjaGl0ZWN0dXJlIGFuZCBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUuPC9jaXRlPiBbR2VuZXZhXTogSW50ZXJuYXRpb25hbA0KK09yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uLCAyMDAwLjwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0iVW5pY29kZSI+PC9hPlVuaWNvZGU8L2R0Pg0KKzxkZD5UaGUgVW5pY29kZSBDb25zb3J0aXVtLiA8ZW0+VGhlIFVuaWNvZGUgU3RhbmRhcmQsIFZlcnNpb24gMi4wLjwvZW0+IFJlYWRpbmcsDQorTWFzcy46IEFkZGlzb24tV2VzbGV5IERldmVsb3BlcnMgUHJlc3MsIDE5OTYuPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48YSBuYW1lPSJVbmljb2RlMyI+PC9hPlVuaWNvZGUzPC9kdD4NCis8ZGQ+IFRoZSBVbmljb2RlIENvbnNvcnRpdW0uIDxlbT5UaGUgVW5pY29kZSBTdGFuZGFyZCwgVmVyc2lvbiAzLjAuPC9lbT4gUmVhZGluZywNCitNYXNzLjogQWRkaXNvbi1XZXNsZXkgRGV2ZWxvcGVycyBQcmVzcywgMjAwMC4gSVNCTiAwLTIwMS02MTYzMy01LjwvZGQ+DQorPC9kbD48L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MiI+ICA8aDM+PGEgbmFtZT0ibnVsbCI+PC9hPkEuMiBPdGhlciBSZWZlcmVuY2VzPC9oMz4gPGRsPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxhIG5hbWU9IkFobyI+PC9hPkFoby9VbGxtYW48L2R0Pg0KKzxkZD5BaG8sIEFsZnJlZCBWLiwgUmF2aSBTZXRoaSwgYW5kIEplZmZyZXkgRC4gVWxsbWFuLiA8Y2l0ZT5Db21waWxlcnM6IFByaW5jaXBsZXMsDQorVGVjaG5pcXVlcywgYW5kIFRvb2xzPC9jaXRlPi4gUmVhZGluZzogQWRkaXNvbi1XZXNsZXksIDE5ODYsIHJwdC4gY29yci4gMTk4OC48L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxhIG5hbWU9IkJlcm5lcnMtTGVlIj48L2E+QmVybmVycy1MZWUgZXQgYWwuPC9kdD4NCis8ZGQ+IEJlcm5lcnMtTGVlLCBULiwgUi4gRmllbGRpbmcsIGFuZCBMLiBNYXNpbnRlci4gPGNpdGU+VW5pZm9ybSBSZXNvdXJjZQ0KK0lkZW50aWZpZXJzIChVUkkpOiBHZW5lcmljIFN5bnRheCBhbmQgU2VtYW50aWNzPC9jaXRlPi4gMTk5Ny4gKFdvcmsgaW4gcHJvZ3Jlc3M7DQorc2VlIHVwZGF0ZXMgdG8gUkZDMTczOC4pPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48YSBuYW1lPSJBQksiPjwvYT5CciZ1dW1sO2dnZW1hbm4tS2xlaW48L2R0Pg0KKzxkZD5CciZ1dW1sO2dnZW1hbm4tS2xlaW4sIEFubmUuIEZvcm1hbCBNb2RlbHMgaW4gRG9jdW1lbnQgUHJvY2Vzc2luZy4gSGFiaWxpdGF0aW9uc3NjaHJpZnQuDQorRmFjdWx0eSBvZiBNYXRoZW1hdGljcyBhdCB0aGUgVW5pdmVyc2l0eSBvZiBGcmVpYnVyZywgMTk5My4gKFNlZSA8YSBocmVmPSJmdHA6Ly9mdHAuaW5mb3JtYXRpay51bmktZnJlaWJ1cmcuZGUvZG9jdW1lbnRzL3BhcGVycy9icnVlZ2dlbS9oYWJpbC5wcyINCis+ZnRwOi8vZnRwLmluZm9ybWF0aWsudW5pLWZyZWlidXJnLmRlL2RvY3VtZW50cy9wYXBlcnMvYnJ1ZWdnZW0vaGFiaWwucHM8L2E+Lik8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxhIG5hbWU9IkFCS0RXIj48L2E+QnImdXVtbDtnZ2VtYW5uLUtsZWluIGFuZCBXb29kPC9kdD4NCis8ZGQ+QnImdXVtbDtnZ2VtYW5uLUtsZWluLCBBbm5lLCBhbmQgRGVyaWNrIFdvb2QuIDxjaXRlPkRldGVybWluaXN0aWMgUmVndWxhcg0KK0xhbmd1YWdlczwvY2l0ZT4uIFVuaXZlcnNpdCZhdW1sO3QgRnJlaWJ1cmcsIEluc3RpdHV0IGYmdXVtbDtyIEluZm9ybWF0aWssDQorQmVyaWNodCAzOCwgT2t0b2JlciAxOTkxLiBFeHRlbmRlZCBhYnN0cmFjdCBpbiBBLiBGaW5rZWwsIE0uIEphbnR6ZW4sIEhyc2cuLA0KK1NUQUNTIDE5OTIsIFMuIDE3My0xODQuIFNwcmluZ2VyLVZlcmxhZywgQmVybGluIDE5OTIuIExlY3R1cmUgTm90ZXMgaW4gQ29tcHV0ZXINCitTY2llbmNlIDU3Ny4gRnVsbCB2ZXJzaW9uIHRpdGxlZCA8Y2l0ZT5PbmUtVW5hbWJpZ3VvdXMgUmVndWxhciBMYW5ndWFnZXM8L2NpdGU+DQoraW4gSW5mb3JtYXRpb24gYW5kIENvbXB1dGF0aW9uIDE0MCAoMik6IDIyOS0yNTMsIEZlYnJ1YXJ5IDE5OTguPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48YSBuYW1lPSJDbGFyayI+PC9hPkNsYXJrPC9kdD4NCis8ZGQ+SmFtZXMgQ2xhcmsuIENvbXBhcmlzb24gb2YgU0dNTCBhbmQgWE1MLiBTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvTk9URS1zZ21sLXhtbC05NzEyMTUiPmh0dHA6Ly93d3cudzMub3JnL1RSL05PVEUtc2dtbC14bWwtOTcxMjE1PC9hDQorPi4gPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48YSBuYW1lPSJJQU5BLUxBTkdDT0RFUyI+PC9hPklBTkEtTEFOR0NPREVTPC9kdD4NCis8ZGQ+KEludGVybmV0IEFzc2lnbmVkIE51bWJlcnMgQXV0aG9yaXR5KSA8Y2l0ZT5SZWdpc3RyeSBvZiBMYW5ndWFnZSBUYWdzPC9jaXRlPiwNCitlZC4gS2VsZCBTaW1vbnNlbiBldCBhbC4gIChTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5pc2kuZWR1L2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvbGFuZ3VhZ2VzLyI+aHR0cDovL3d3dy5pc2kuZWR1L2luLW5vdGVzL2lhbmEvYXNzaWdubWVudHMvbGFuZ3VhZ2VzLzwvYQ0KKz4uKTwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0iUkZDMjE0MSI+PC9hPklFVEYgUkZDMjE0MTwvZHQ+DQorPGRkPklFVEYgKEludGVybmV0IEVuZ2luZWVyaW5nIFRhc2sgRm9yY2UpLiA8ZW0+UkZDIDIxNDE6IFVSTiBTeW50YXg8L2VtPiwNCitlZC4gUi4gTW9hdHMuIDE5OTcuICAgKFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMTQxLnR4dCI+aHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjE0MS50eHQ8L2E+Lik8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxhIG5hbWU9InJmYzIyNzkiPjwvYT5JRVRGIFJGQyAyMjc5PC9kdD4NCis8ZGQ+SUVURiAoSW50ZXJuZXQgRW5naW5lZXJpbmcgVGFzayBGb3JjZSkuIDxjaXRlPlJGQyAyMjc5OiBVVEYtOCwgYSB0cmFuc2Zvcm1hdGlvbg0KK2Zvcm1hdCBvZiBJU08gMTA2NDY8L2NpdGU+LCBlZC4gRi4gWWVyZ2VhdSwgMTk5OC4gIChTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjI3OS50eHQiPmh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIyNzkudHh0PC9hPi4pPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48YSBuYW1lPSJyZmMyMzc2Ij48L2E+SUVURiBSRkMgMjM3NjwvZHQ+DQorPGRkPklFVEYgKEludGVybmV0IEVuZ2luZWVyaW5nIFRhc2sgRm9yY2UpLiA8Y2l0ZT5SRkMgMjM3NjogWE1MIE1lZGlhIFR5cGVzPC9jaXRlPi4NCitlZC4gRS4gV2hpdGVoZWFkLCBNLiBNdXJhdGEuIDE5OTguICAoU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzNzYudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzc2LnR4dDwvYT4uKTwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0icmZjMjM5NiI+PC9hPklFVEYgUkZDIDIzOTY8L2R0Pg0KKzxkZD5JRVRGIChJbnRlcm5ldCBFbmdpbmVlcmluZyBUYXNrIEZvcmNlKS4gPGNpdGU+UkZDIDIzOTY6IFVuaWZvcm0gUmVzb3VyY2UNCitJZGVudGlmaWVycyAoVVJJKTogR2VuZXJpYyBTeW50YXg8L2NpdGU+LiBULiBCZXJuZXJzLUxlZSwgUi4gRmllbGRpbmcsIEwuDQorTWFzaW50ZXIuIDE5OTguICAoU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dDwvYT4uKTwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0icmZjMjczMiI+PC9hPklFVEYgUkZDIDI3MzI8L2R0Pg0KKzxkZD5JRVRGIChJbnRlcm5ldCBFbmdpbmVlcmluZyBUYXNrIEZvcmNlKS4gPGNpdGU+UkZDIDI3MzI6IEZvcm1hdCBmb3IgTGl0ZXJhbA0KK0lQdjYgQWRkcmVzc2VzIGluIFVSTCdzPC9jaXRlPi4gUi4gSGluZGVuLCBCLiBDYXJwZW50ZXIsIEwuIE1hc2ludGVyLiAxOTk5Lg0KKyAoU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI3MzIudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyNzMyLnR4dDwvYT4uKTwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0icmZjMjc4MSI+PC9hPklFVEYgUkZDIDI3ODE8L2R0Pg0KKzxkZD4gSUVURiAoSW50ZXJuZXQgRW5naW5lZXJpbmcgVGFzayBGb3JjZSkuIDxlbT5SRkMgMjc4MTogVVRGLTE2LCBhbiBlbmNvZGluZw0KK29mIElTTyAxMDY0NjwvZW0+LCBlZC4gUC4gSG9mZm1hbiwgRi4gWWVyZ2VhdS4gMjAwMC4gIChTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjc4MS50eHQiPmh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzI3ODEudHh0PC9hPi4pPC9kZD4NCis8ZHQgY2xhc3M9ImxhYmVsIj48YSBuYW1lPSJJU082MzkiPjwvYT5JU08gNjM5PC9kdD4NCis8ZGQ+IChJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uKS4gPGNpdGU+SVNPIDYzOToxOTg4DQorKEUpLiBDb2RlIGZvciB0aGUgcmVwcmVzZW50YXRpb24gb2YgbmFtZXMgb2YgbGFuZ3VhZ2VzLjwvY2l0ZT4gW0dlbmV2YV06IEludGVybmF0aW9uYWwNCitPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiwgMTk4OC48L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxhIG5hbWU9IklTTzMxNjYiPjwvYT5JU08gMzE2NjwvZHQ+DQorPGRkPiAoSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbikuIDxjaXRlPklTTyAzMTY2LTE6MTk5Nw0KKyhFKS4gQ29kZXMgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBvZiBuYW1lcyBvZiBjb3VudHJpZXMgYW5kIHRoZWlyIHN1YmRpdmlzaW9ucw0KKy0tIFBhcnQgMTogQ291bnRyeSBjb2RlczwvY2l0ZT4gW0dlbmV2YV06IEludGVybmF0aW9uYWwgT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24sDQorMTk5Ny48L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxhIG5hbWU9IklTTzg4NzkiPjwvYT5JU08gODg3OTwvZHQ+DQorPGRkPklTTyAoSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbikuIDxjaXRlPklTTyA4ODc5OjE5ODYoRSkuDQorSW5mb3JtYXRpb24gcHJvY2Vzc2luZyAtLSBUZXh0IGFuZCBPZmZpY2UgU3lzdGVtcyAtLSBTdGFuZGFyZCBHZW5lcmFsaXplZA0KK01hcmt1cCBMYW5ndWFnZSAoU0dNTCkuPC9jaXRlPiBGaXJzdCBlZGl0aW9uIC0tIDE5ODYtMTAtMTUuIFtHZW5ldmFdOiBJbnRlcm5hdGlvbmFsDQorT3JnYW5pemF0aW9uIGZvciBTdGFuZGFyZGl6YXRpb24sIDE5ODYuIDwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0iSVNPMTA3NDQiPjwvYT5JU08vSUVDIDEwNzQ0PC9kdD4NCis8ZGQ+SVNPIChJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uKS4gPGNpdGU+SVNPL0lFQyAxMDc0NC0xOTkyDQorKEUpLiBJbmZvcm1hdGlvbiB0ZWNobm9sb2d5IC0tIEh5cGVybWVkaWEvVGltZS1iYXNlZCBTdHJ1Y3R1cmluZyBMYW5ndWFnZQ0KKyhIeVRpbWUpLiA8L2NpdGU+IFtHZW5ldmFdOiBJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uLA0KKzE5OTIuIDxlbT5FeHRlbmRlZCBGYWNpbGl0aWVzIEFubmV4ZS48L2VtPiBbR2VuZXZhXTogSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24NCitmb3IgU3RhbmRhcmRpemF0aW9uLCAxOTk2LiA8L2RkPg0KKzxkdCBjbGFzcz0ibGFiZWwiPjxhIG5hbWU9IndlYnNnbWwiPjwvYT5XRUJTR01MPC9kdD4NCis8ZGQ+SVNPIChJbnRlcm5hdGlvbmFsIE9yZ2FuaXphdGlvbiBmb3IgU3RhbmRhcmRpemF0aW9uKS4gPGNpdGU+SVNPIDg4Nzk6MTk4Ng0KK1RDMi4gSW5mb3JtYXRpb24gdGVjaG5vbG9neSAtLSBEb2N1bWVudCBEZXNjcmlwdGlvbiBhbmQgUHJvY2Vzc2luZyBMYW5ndWFnZXMuIDwvY2l0ZT4NCitbR2VuZXZhXTogSW50ZXJuYXRpb25hbCBPcmdhbml6YXRpb24gZm9yIFN0YW5kYXJkaXphdGlvbiwgMTk5OC4gIChTZWUgPGEgaHJlZj0iaHR0cDovL3d3dy5zZ21sc291cmNlLmNvbS84ODc5cmV2L24wMDI5Lmh0bSI+aHR0cDovL3d3dy5zZ21sc291cmNlLmNvbS84ODc5cmV2L24wMDI5Lmh0bTwvYQ0KKz4uKTwvZGQ+DQorPGR0IGNsYXNzPSJsYWJlbCI+PGEgbmFtZT0ieG1sLW5hbWVzIj48L2E+WE1MIE5hbWVzPC9kdD4NCis8ZGQ+VGltIEJyYXksIERhdmUgSG9sbGFuZGVyLCBhbmQgQW5kcmV3IExheW1hbiwgZWRpdG9ycy4gPGNpdGU+TmFtZXNwYWNlcw0KK2luIFhNTDwvY2l0ZT4uIFRleHR1YWxpdHksIEhld2xldHQtUGFja2FyZCwgYW5kIE1pY3Jvc29mdC4gV29ybGQgV2lkZSBXZWINCitDb25zb3J0aXVtLCAxOTk5LiAgKFNlZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sLW5hbWVzLyI+aHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbC1uYW1lcy88L2E+Lik8L2RkPg0KKzwvZGw+PC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYxIj4gPGgyPjxhIG5hbWU9IkNoYXJDbGFzc2VzIj48L2E+QiBDaGFyYWN0ZXINCitDbGFzc2VzPC9oMj4gPHA+Rm9sbG93aW5nIHRoZSBjaGFyYWN0ZXJpc3RpY3MgZGVmaW5lZCBpbiB0aGUgVW5pY29kZSBzdGFuZGFyZCwNCitjaGFyYWN0ZXJzIGFyZSBjbGFzc2VkIGFzIGJhc2UgY2hhcmFjdGVycyAoYW1vbmcgb3RoZXJzLCB0aGVzZSBjb250YWluIHRoZQ0KK2FscGhhYmV0aWMgY2hhcmFjdGVycyBvZiB0aGUgTGF0aW4gYWxwaGFiZXQpLCBpZGVvZ3JhcGhpYyBjaGFyYWN0ZXJzLCBhbmQNCitjb21iaW5pbmcgY2hhcmFjdGVycyAoYW1vbmcgb3RoZXJzLCB0aGlzIGNsYXNzIGNvbnRhaW5zIG1vc3QgZGlhY3JpdGljcykgRGlnaXRzDQorYW5kIGV4dGVuZGVycyBhcmUgYWxzbyBkaXN0aW5ndWlzaGVkLjwvcD4gPGg1PkNoYXJhY3RlcnM8L2g1Pjx0YWJsZSBjbGFzcz0ic2NyYXAiPg0KKzx0Ym9keT4NCis8dHIgdmFsaWduPSJiYXNlbGluZSI+DQorPHRkPjxhIG5hbWU9Ik5ULUxldHRlciI+PC9hPls4NF0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5MZXR0ZXI8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+PGEgaHJlZj0iI05ULUJhc2VDaGFyIj5CYXNlQ2hhcjwvYT4gfCA8YSBocmVmPSIjTlQtSWRlb2dyYXBoaWMiPklkZW9ncmFwaGljPC9hPjwvY29kZT48L3RkPg0KKzwvdHI+DQorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPg0KKzx0ZD48YSBuYW1lPSJOVC1CYXNlQ2hhciI+PC9hPls4NV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5CYXNlQ2hhcjwvY29kZT48L3RkPg0KKzx0ZD4mbmJzcDsmbmJzcDsmbmJzcDs6Oj0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5bI3gwMDQxLSN4MDA1QV0gfCZuYnNwO1sjeDAwNjEtI3gwMDdBXSB8Jm5ic3A7WyN4MDBDMC0jeDAwRDZdIHwmbmJzcDtbI3gwMEQ4LSN4MDBGNl0NCit8Jm5ic3A7WyN4MDBGOC0jeDAwRkZdIHwmbmJzcDtbI3gwMTAwLSN4MDEzMV0gfCZuYnNwO1sjeDAxMzQtI3gwMTNFXSB8Jm5ic3A7WyN4MDE0MS0jeDAxNDhdDQorfCZuYnNwO1sjeDAxNEEtI3gwMTdFXSB8Jm5ic3A7WyN4MDE4MC0jeDAxQzNdIHwmbmJzcDtbI3gwMUNELSN4MDFGMF0gfCZuYnNwO1sjeDAxRjQtI3gwMUY1XQ0KK3wmbmJzcDtbI3gwMUZBLSN4MDIxN10gfCZuYnNwO1sjeDAyNTAtI3gwMkE4XSB8Jm5ic3A7WyN4MDJCQi0jeDAyQzFdIHwmbmJzcDsjeDAzODYNCit8Jm5ic3A7WyN4MDM4OC0jeDAzOEFdIHwmbmJzcDsjeDAzOEMgfCZuYnNwO1sjeDAzOEUtI3gwM0ExXSB8Jm5ic3A7WyN4MDNBMy0jeDAzQ0VdDQorfCZuYnNwO1sjeDAzRDAtI3gwM0Q2XSB8Jm5ic3A7I3gwM0RBIHwmbmJzcDsjeDAzREMgfCZuYnNwOyN4MDNERSB8Jm5ic3A7I3gwM0UwDQorfCZuYnNwO1sjeDAzRTItI3gwM0YzXSB8Jm5ic3A7WyN4MDQwMS0jeDA0MENdIHwmbmJzcDtbI3gwNDBFLSN4MDQ0Rl0gfCZuYnNwO1sjeDA0NTEtI3gwNDVDXQ0KK3wmbmJzcDtbI3gwNDVFLSN4MDQ4MV0gfCZuYnNwO1sjeDA0OTAtI3gwNEM0XSB8Jm5ic3A7WyN4MDRDNy0jeDA0QzhdIHwmbmJzcDtbI3gwNENCLSN4MDRDQ10NCit8Jm5ic3A7WyN4MDREMC0jeDA0RUJdIHwmbmJzcDtbI3gwNEVFLSN4MDRGNV0gfCZuYnNwO1sjeDA0RjgtI3gwNEY5XSB8Jm5ic3A7WyN4MDUzMS0jeDA1NTZdDQorfCZuYnNwOyN4MDU1OSB8Jm5ic3A7WyN4MDU2MS0jeDA1ODZdIHwmbmJzcDtbI3gwNUQwLSN4MDVFQV0gfCZuYnNwO1sjeDA1RjAtI3gwNUYyXQ0KK3wmbmJzcDtbI3gwNjIxLSN4MDYzQV0gfCZuYnNwO1sjeDA2NDEtI3gwNjRBXSB8Jm5ic3A7WyN4MDY3MS0jeDA2QjddIHwmbmJzcDtbI3gwNkJBLSN4MDZCRV0NCit8Jm5ic3A7WyN4MDZDMC0jeDA2Q0VdIHwmbmJzcDtbI3gwNkQwLSN4MDZEM10gfCZuYnNwOyN4MDZENSB8Jm5ic3A7WyN4MDZFNS0jeDA2RTZdDQorfCZuYnNwO1sjeDA5MDUtI3gwOTM5XSB8Jm5ic3A7I3gwOTNEIHwmbmJzcDtbI3gwOTU4LSN4MDk2MV0gfCZuYnNwO1sjeDA5ODUtI3gwOThDXQ0KK3wmbmJzcDtbI3gwOThGLSN4MDk5MF0gfCZuYnNwO1sjeDA5OTMtI3gwOUE4XSB8Jm5ic3A7WyN4MDlBQS0jeDA5QjBdIHwmbmJzcDsjeDA5QjINCit8Jm5ic3A7WyN4MDlCNi0jeDA5QjldIHwmbmJzcDtbI3gwOURDLSN4MDlERF0gfCZuYnNwO1sjeDA5REYtI3gwOUUxXSB8Jm5ic3A7WyN4MDlGMC0jeDA5RjFdDQorfCZuYnNwO1sjeDBBMDUtI3gwQTBBXSB8Jm5ic3A7WyN4MEEwRi0jeDBBMTBdIHwmbmJzcDtbI3gwQTEzLSN4MEEyOF0gfCZuYnNwO1sjeDBBMkEtI3gwQTMwXQ0KK3wmbmJzcDtbI3gwQTMyLSN4MEEzM10gfCZuYnNwO1sjeDBBMzUtI3gwQTM2XSB8Jm5ic3A7WyN4MEEzOC0jeDBBMzldIHwmbmJzcDtbI3gwQTU5LSN4MEE1Q10NCit8Jm5ic3A7I3gwQTVFIHwmbmJzcDtbI3gwQTcyLSN4MEE3NF0gfCZuYnNwO1sjeDBBODUtI3gwQThCXSB8Jm5ic3A7I3gwQThEDQorfCZuYnNwO1sjeDBBOEYtI3gwQTkxXSB8Jm5ic3A7WyN4MEE5My0jeDBBQThdIHwmbmJzcDtbI3gwQUFBLSN4MEFCMF0gfCZuYnNwO1sjeDBBQjItI3gwQUIzXQ0KK3wmbmJzcDtbI3gwQUI1LSN4MEFCOV0gfCZuYnNwOyN4MEFCRCB8Jm5ic3A7I3gwQUUwIHwmbmJzcDtbI3gwQjA1LSN4MEIwQ10NCit8Jm5ic3A7WyN4MEIwRi0jeDBCMTBdIHwmbmJzcDtbI3gwQjEzLSN4MEIyOF0gfCZuYnNwO1sjeDBCMkEtI3gwQjMwXSB8Jm5ic3A7WyN4MEIzMi0jeDBCMzNdDQorfCZuYnNwO1sjeDBCMzYtI3gwQjM5XSB8Jm5ic3A7I3gwQjNEIHwmbmJzcDtbI3gwQjVDLSN4MEI1RF0gfCZuYnNwO1sjeDBCNUYtI3gwQjYxXQ0KK3wmbmJzcDtbI3gwQjg1LSN4MEI4QV0gfCZuYnNwO1sjeDBCOEUtI3gwQjkwXSB8Jm5ic3A7WyN4MEI5Mi0jeDBCOTVdIHwmbmJzcDtbI3gwQjk5LSN4MEI5QV0NCit8Jm5ic3A7I3gwQjlDIHwmbmJzcDtbI3gwQjlFLSN4MEI5Rl0gfCZuYnNwO1sjeDBCQTMtI3gwQkE0XSB8Jm5ic3A7WyN4MEJBOC0jeDBCQUFdDQorfCZuYnNwO1sjeDBCQUUtI3gwQkI1XSB8Jm5ic3A7WyN4MEJCNy0jeDBCQjldIHwmbmJzcDtbI3gwQzA1LSN4MEMwQ10gfCZuYnNwO1sjeDBDMEUtI3gwQzEwXQ0KK3wmbmJzcDtbI3gwQzEyLSN4MEMyOF0gfCZuYnNwO1sjeDBDMkEtI3gwQzMzXSB8Jm5ic3A7WyN4MEMzNS0jeDBDMzldIHwmbmJzcDtbI3gwQzYwLSN4MEM2MV0NCit8Jm5ic3A7WyN4MEM4NS0jeDBDOENdIHwmbmJzcDtbI3gwQzhFLSN4MEM5MF0gfCZuYnNwO1sjeDBDOTItI3gwQ0E4XSB8Jm5ic3A7WyN4MENBQS0jeDBDQjNdDQorfCZuYnNwO1sjeDBDQjUtI3gwQ0I5XSB8Jm5ic3A7I3gwQ0RFIHwmbmJzcDtbI3gwQ0UwLSN4MENFMV0gfCZuYnNwO1sjeDBEMDUtI3gwRDBDXQ0KK3wmbmJzcDtbI3gwRDBFLSN4MEQxMF0gfCZuYnNwO1sjeDBEMTItI3gwRDI4XSB8Jm5ic3A7WyN4MEQyQS0jeDBEMzldIHwmbmJzcDtbI3gwRDYwLSN4MEQ2MV0NCit8Jm5ic3A7WyN4MEUwMS0jeDBFMkVdIHwmbmJzcDsjeDBFMzAgfCZuYnNwO1sjeDBFMzItI3gwRTMzXSB8Jm5ic3A7WyN4MEU0MC0jeDBFNDVdDQorfCZuYnNwO1sjeDBFODEtI3gwRTgyXSB8Jm5ic3A7I3gwRTg0IHwmbmJzcDtbI3gwRTg3LSN4MEU4OF0gfCZuYnNwOyN4MEU4QQ0KK3wmbmJzcDsjeDBFOEQgfCZuYnNwO1sjeDBFOTQtI3gwRTk3XSB8Jm5ic3A7WyN4MEU5OS0jeDBFOUZdIHwmbmJzcDtbI3gwRUExLSN4MEVBM10NCit8Jm5ic3A7I3gwRUE1IHwmbmJzcDsjeDBFQTcgfCZuYnNwO1sjeDBFQUEtI3gwRUFCXSB8Jm5ic3A7WyN4MEVBRC0jeDBFQUVdDQorfCZuYnNwOyN4MEVCMCB8Jm5ic3A7WyN4MEVCMi0jeDBFQjNdIHwmbmJzcDsjeDBFQkQgfCZuYnNwO1sjeDBFQzAtI3gwRUM0XQ0KK3wmbmJzcDtbI3gwRjQwLSN4MEY0N10gfCZuYnNwO1sjeDBGNDktI3gwRjY5XSB8Jm5ic3A7WyN4MTBBMC0jeDEwQzVdIHwmbmJzcDtbI3gxMEQwLSN4MTBGNl0NCit8Jm5ic3A7I3gxMTAwIHwmbmJzcDtbI3gxMTAyLSN4MTEwM10gfCZuYnNwO1sjeDExMDUtI3gxMTA3XSB8Jm5ic3A7I3gxMTA5DQorfCZuYnNwO1sjeDExMEItI3gxMTBDXSB8Jm5ic3A7WyN4MTEwRS0jeDExMTJdIHwmbmJzcDsjeDExM0MgfCZuYnNwOyN4MTEzRQ0KK3wmbmJzcDsjeDExNDAgfCZuYnNwOyN4MTE0QyB8Jm5ic3A7I3gxMTRFIHwmbmJzcDsjeDExNTAgfCZuYnNwO1sjeDExNTQtI3gxMTU1XQ0KK3wmbmJzcDsjeDExNTkgfCZuYnNwO1sjeDExNUYtI3gxMTYxXSB8Jm5ic3A7I3gxMTYzIHwmbmJzcDsjeDExNjUgfCZuYnNwOyN4MTE2Nw0KK3wmbmJzcDsjeDExNjkgfCZuYnNwO1sjeDExNkQtI3gxMTZFXSB8Jm5ic3A7WyN4MTE3Mi0jeDExNzNdIHwmbmJzcDsjeDExNzUNCit8Jm5ic3A7I3gxMTlFIHwmbmJzcDsjeDExQTggfCZuYnNwOyN4MTFBQiB8Jm5ic3A7WyN4MTFBRS0jeDExQUZdIHwmbmJzcDtbI3gxMUI3LSN4MTFCOF0NCit8Jm5ic3A7I3gxMUJBIHwmbmJzcDtbI3gxMUJDLSN4MTFDMl0gfCZuYnNwOyN4MTFFQiB8Jm5ic3A7I3gxMUYwIHwmbmJzcDsjeDExRjkNCit8Jm5ic3A7WyN4MUUwMC0jeDFFOUJdIHwmbmJzcDtbI3gxRUEwLSN4MUVGOV0gfCZuYnNwO1sjeDFGMDAtI3gxRjE1XSB8Jm5ic3A7WyN4MUYxOC0jeDFGMURdDQorfCZuYnNwO1sjeDFGMjAtI3gxRjQ1XSB8Jm5ic3A7WyN4MUY0OC0jeDFGNERdIHwmbmJzcDtbI3gxRjUwLSN4MUY1N10gfCZuYnNwOyN4MUY1OQ0KK3wmbmJzcDsjeDFGNUIgfCZuYnNwOyN4MUY1RCB8Jm5ic3A7WyN4MUY1Ri0jeDFGN0RdIHwmbmJzcDtbI3gxRjgwLSN4MUZCNF0NCit8Jm5ic3A7WyN4MUZCNi0jeDFGQkNdIHwmbmJzcDsjeDFGQkUgfCZuYnNwO1sjeDFGQzItI3gxRkM0XSB8Jm5ic3A7WyN4MUZDNi0jeDFGQ0NdDQorfCZuYnNwO1sjeDFGRDAtI3gxRkQzXSB8Jm5ic3A7WyN4MUZENi0jeDFGREJdIHwmbmJzcDtbI3gxRkUwLSN4MUZFQ10gfCZuYnNwO1sjeDFGRjItI3gxRkY0XQ0KK3wmbmJzcDtbI3gxRkY2LSN4MUZGQ10gfCZuYnNwOyN4MjEyNiB8Jm5ic3A7WyN4MjEyQS0jeDIxMkJdIHwmbmJzcDsjeDIxMkUNCit8Jm5ic3A7WyN4MjE4MC0jeDIxODJdIHwmbmJzcDtbI3gzMDQxLSN4MzA5NF0gfCZuYnNwO1sjeDMwQTEtI3gzMEZBXSB8Jm5ic3A7WyN4MzEwNS0jeDMxMkNdDQorfCZuYnNwO1sjeEFDMDAtI3hEN0EzXSA8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtSWRlb2dyYXBoaWMiPjwvYT5bODZdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+SWRlb2dyYXBoaWM8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+WyN4NEUwMC0jeDlGQTVdIHwmbmJzcDsjeDMwMDcgfCZuYnNwO1sjeDMwMjEtI3gzMDI5XSA8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtQ29tYmluaW5nQ2hhciI+PC9hPls4N10mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPg0KKzx0ZD48Y29kZT5Db21iaW5pbmdDaGFyPC9jb2RlPjwvdGQ+DQorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+DQorPHRkPjxjb2RlPlsjeDAzMDAtI3gwMzQ1XSB8Jm5ic3A7WyN4MDM2MC0jeDAzNjFdIHwmbmJzcDtbI3gwNDgzLSN4MDQ4Nl0gfCZuYnNwO1sjeDA1OTEtI3gwNUExXQ0KK3wmbmJzcDtbI3gwNUEzLSN4MDVCOV0gfCZuYnNwO1sjeDA1QkItI3gwNUJEXSB8Jm5ic3A7I3gwNUJGIHwmbmJzcDtbI3gwNUMxLSN4MDVDMl0NCit8Jm5ic3A7I3gwNUM0IHwmbmJzcDtbI3gwNjRCLSN4MDY1Ml0gfCZuYnNwOyN4MDY3MCB8Jm5ic3A7WyN4MDZENi0jeDA2RENdDQorfCZuYnNwO1sjeDA2REQtI3gwNkRGXSB8Jm5ic3A7WyN4MDZFMC0jeDA2RTRdIHwmbmJzcDtbI3gwNkU3LSN4MDZFOF0gfCZuYnNwO1sjeDA2RUEtI3gwNkVEXQ0KK3wmbmJzcDtbI3gwOTAxLSN4MDkwM10gfCZuYnNwOyN4MDkzQyB8Jm5ic3A7WyN4MDkzRS0jeDA5NENdIHwmbmJzcDsjeDA5NEQNCit8Jm5ic3A7WyN4MDk1MS0jeDA5NTRdIHwmbmJzcDtbI3gwOTYyLSN4MDk2M10gfCZuYnNwO1sjeDA5ODEtI3gwOTgzXSB8Jm5ic3A7I3gwOUJDDQorfCZuYnNwOyN4MDlCRSB8Jm5ic3A7I3gwOUJGIHwmbmJzcDtbI3gwOUMwLSN4MDlDNF0gfCZuYnNwO1sjeDA5QzctI3gwOUM4XQ0KK3wmbmJzcDtbI3gwOUNCLSN4MDlDRF0gfCZuYnNwOyN4MDlENyB8Jm5ic3A7WyN4MDlFMi0jeDA5RTNdIHwmbmJzcDsjeDBBMDINCit8Jm5ic3A7I3gwQTNDIHwmbmJzcDsjeDBBM0UgfCZuYnNwOyN4MEEzRiB8Jm5ic3A7WyN4MEE0MC0jeDBBNDJdIHwmbmJzcDtbI3gwQTQ3LSN4MEE0OF0NCit8Jm5ic3A7WyN4MEE0Qi0jeDBBNERdIHwmbmJzcDtbI3gwQTcwLSN4MEE3MV0gfCZuYnNwO1sjeDBBODEtI3gwQTgzXSB8Jm5ic3A7I3gwQUJDDQorfCZuYnNwO1sjeDBBQkUtI3gwQUM1XSB8Jm5ic3A7WyN4MEFDNy0jeDBBQzldIHwmbmJzcDtbI3gwQUNCLSN4MEFDRF0gfCZuYnNwO1sjeDBCMDEtI3gwQjAzXQ0KK3wmbmJzcDsjeDBCM0MgfCZuYnNwO1sjeDBCM0UtI3gwQjQzXSB8Jm5ic3A7WyN4MEI0Ny0jeDBCNDhdIHwmbmJzcDtbI3gwQjRCLSN4MEI0RF0NCit8Jm5ic3A7WyN4MEI1Ni0jeDBCNTddIHwmbmJzcDtbI3gwQjgyLSN4MEI4M10gfCZuYnNwO1sjeDBCQkUtI3gwQkMyXSB8Jm5ic3A7WyN4MEJDNi0jeDBCQzhdDQorfCZuYnNwO1sjeDBCQ0EtI3gwQkNEXSB8Jm5ic3A7I3gwQkQ3IHwmbmJzcDtbI3gwQzAxLSN4MEMwM10gfCZuYnNwO1sjeDBDM0UtI3gwQzQ0XQ0KK3wmbmJzcDtbI3gwQzQ2LSN4MEM0OF0gfCZuYnNwO1sjeDBDNEEtI3gwQzREXSB8Jm5ic3A7WyN4MEM1NS0jeDBDNTZdIHwmbmJzcDtbI3gwQzgyLSN4MEM4M10NCit8Jm5ic3A7WyN4MENCRS0jeDBDQzRdIHwmbmJzcDtbI3gwQ0M2LSN4MENDOF0gfCZuYnNwO1sjeDBDQ0EtI3gwQ0NEXSB8Jm5ic3A7WyN4MENENS0jeDBDRDZdDQorfCZuYnNwO1sjeDBEMDItI3gwRDAzXSB8Jm5ic3A7WyN4MEQzRS0jeDBENDNdIHwmbmJzcDtbI3gwRDQ2LSN4MEQ0OF0gfCZuYnNwO1sjeDBENEEtI3gwRDREXQ0KK3wmbmJzcDsjeDBENTcgfCZuYnNwOyN4MEUzMSB8Jm5ic3A7WyN4MEUzNC0jeDBFM0FdIHwmbmJzcDtbI3gwRTQ3LSN4MEU0RV0NCit8Jm5ic3A7I3gwRUIxIHwmbmJzcDtbI3gwRUI0LSN4MEVCOV0gfCZuYnNwO1sjeDBFQkItI3gwRUJDXSB8Jm5ic3A7WyN4MEVDOC0jeDBFQ0RdDQorfCZuYnNwO1sjeDBGMTgtI3gwRjE5XSB8Jm5ic3A7I3gwRjM1IHwmbmJzcDsjeDBGMzcgfCZuYnNwOyN4MEYzOSB8Jm5ic3A7I3gwRjNFDQorfCZuYnNwOyN4MEYzRiB8Jm5ic3A7WyN4MEY3MS0jeDBGODRdIHwmbmJzcDtbI3gwRjg2LSN4MEY4Ql0gfCZuYnNwO1sjeDBGOTAtI3gwRjk1XQ0KK3wmbmJzcDsjeDBGOTcgfCZuYnNwO1sjeDBGOTktI3gwRkFEXSB8Jm5ic3A7WyN4MEZCMS0jeDBGQjddIHwmbmJzcDsjeDBGQjkNCit8Jm5ic3A7WyN4MjBEMC0jeDIwRENdIHwmbmJzcDsjeDIwRTEgfCZuYnNwO1sjeDMwMkEtI3gzMDJGXSB8Jm5ic3A7I3gzMDk5DQorfCZuYnNwOyN4MzA5QSA8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtRGlnaXQiPjwvYT5bODhdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+RGlnaXQ8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+WyN4MDAzMC0jeDAwMzldIHwmbmJzcDtbI3gwNjYwLSN4MDY2OV0gfCZuYnNwO1sjeDA2RjAtI3gwNkY5XSB8Jm5ic3A7WyN4MDk2Ni0jeDA5NkZdDQorfCZuYnNwO1sjeDA5RTYtI3gwOUVGXSB8Jm5ic3A7WyN4MEE2Ni0jeDBBNkZdIHwmbmJzcDtbI3gwQUU2LSN4MEFFRl0gfCZuYnNwO1sjeDBCNjYtI3gwQjZGXQ0KK3wmbmJzcDtbI3gwQkU3LSN4MEJFRl0gfCZuYnNwO1sjeDBDNjYtI3gwQzZGXSB8Jm5ic3A7WyN4MENFNi0jeDBDRUZdIHwmbmJzcDtbI3gwRDY2LSN4MEQ2Rl0NCit8Jm5ic3A7WyN4MEU1MC0jeDBFNTldIHwmbmJzcDtbI3gwRUQwLSN4MEVEOV0gfCZuYnNwO1sjeDBGMjAtI3gwRjI5XSA8L2NvZGU+PC90ZD4NCis8L3RyPg0KKzx0ciB2YWxpZ249ImJhc2VsaW5lIj4NCis8dGQ+PGEgbmFtZT0iTlQtRXh0ZW5kZXIiPjwvYT5bODldJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+RXh0ZW5kZXI8L2NvZGU+PC90ZD4NCis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4NCis8dGQ+PGNvZGU+I3gwMEI3IHwmbmJzcDsjeDAyRDAgfCZuYnNwOyN4MDJEMSB8Jm5ic3A7I3gwMzg3IHwmbmJzcDsjeDA2NDAgfCZuYnNwOyN4MEU0Ng0KK3wmbmJzcDsjeDBFQzYgfCZuYnNwOyN4MzAwNSB8Jm5ic3A7WyN4MzAzMS0jeDMwMzVdIHwmbmJzcDtbI3gzMDlELSN4MzA5RV0NCit8Jm5ic3A7WyN4MzBGQy0jeDMwRkVdIDwvY29kZT48L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5UaGUgY2hhcmFjdGVyIGNsYXNzZXMgZGVmaW5lZCBoZXJlIGNhbiBiZSBkZXJpdmVkIGZyb20NCit0aGUgVW5pY29kZSAyLjAgY2hhcmFjdGVyIGRhdGFiYXNlIGFzIGZvbGxvd3M6PC9wPiA8dWw+DQorPGxpPjxwPk5hbWUgc3RhcnQgY2hhcmFjdGVycyBtdXN0IGhhdmUgb25lIG9mIHRoZSBjYXRlZ29yaWVzIExsLCBMdSwgTG8sIEx0LA0KK05sLjwvcD48L2xpPg0KKzxsaT48cD5OYW1lIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBOYW1lLXN0YXJ0IGNoYXJhY3RlcnMgbXVzdCBoYXZlIG9uZSBvZiB0aGUNCitjYXRlZ29yaWVzIE1jLCBNZSwgTW4sIExtLCBvciBOZC48L3A+PC9saT4NCis8bGk+PHA+Q2hhcmFjdGVycyBpbiB0aGUgY29tcGF0aWJpbGl0eSBhcmVhIChpLmUuIHdpdGggY2hhcmFjdGVyIGNvZGUgZ3JlYXRlcg0KK3RoYW4gI3hGOTAwIGFuZCBsZXNzIHRoYW4gI3hGRkZFKSBhcmUgbm90IGFsbG93ZWQgaW4gWE1MIG5hbWVzLjwvcD48L2xpPg0KKzxsaT48cD5DaGFyYWN0ZXJzIHdoaWNoIGhhdmUgYSBmb250IG9yIGNvbXBhdGliaWxpdHkgZGVjb21wb3NpdGlvbiAoaS5lLiB0aG9zZQ0KK3dpdGggYSAiY29tcGF0aWJpbGl0eSBmb3JtYXR0aW5nIHRhZyIgaW4gZmllbGQgNSBvZiB0aGUgZGF0YWJhc2UgLS0gbWFya2VkDQorYnkgZmllbGQgNSBiZWdpbm5pbmcgd2l0aCBhICImbHQ7IikgYXJlIG5vdCBhbGxvd2VkLjwvcD48L2xpPg0KKzxsaT48cD5UaGUgZm9sbG93aW5nIGNoYXJhY3RlcnMgYXJlIHRyZWF0ZWQgYXMgbmFtZS1zdGFydCBjaGFyYWN0ZXJzIHJhdGhlcg0KK3RoYW4gbmFtZSBjaGFyYWN0ZXJzLCBiZWNhdXNlIHRoZSBwcm9wZXJ0eSBmaWxlIGNsYXNzaWZpZXMgdGhlbSBhcyBBbHBoYWJldGljOg0KK1sjeDAyQkItI3gwMkMxXSwgI3gwNTU5LCAjeDA2RTUsICN4MDZFNi48L3A+PC9saT4NCis8bGk+PHA+Q2hhcmFjdGVycyAjeDIwREQtI3gyMEUwIGFyZSBleGNsdWRlZCAoaW4gYWNjb3JkYW5jZSB3aXRoIFVuaWNvZGUgMi4wLA0KK3NlY3Rpb24gNS4xNCkuPC9wPjwvbGk+DQorPGxpPjxwPkNoYXJhY3RlciAjeDAwQjcgaXMgY2xhc3NpZmllZCBhcyBhbiBleHRlbmRlciwgYmVjYXVzZSB0aGUgcHJvcGVydHkNCitsaXN0IHNvIGlkZW50aWZpZXMgaXQuPC9wPjwvbGk+DQorPGxpPjxwPkNoYXJhY3RlciAjeDAzODcgaXMgYWRkZWQgYXMgYSBuYW1lIGNoYXJhY3RlciwgYmVjYXVzZSAjeDAwQjcgaXMgaXRzDQorY2Fub25pY2FsIGVxdWl2YWxlbnQuPC9wPjwvbGk+DQorPGxpPjxwPkNoYXJhY3RlcnMgJzonIGFuZCAnXycgYXJlIGFsbG93ZWQgYXMgbmFtZS1zdGFydCBjaGFyYWN0ZXJzLjwvcD4gPC9saT4NCis8bGk+PHA+Q2hhcmFjdGVycyAnLScgYW5kICcuJyBhcmUgYWxsb3dlZCBhcyBuYW1lIGNoYXJhY3RlcnMuPC9wPjwvbGk+DQorPC91bD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjEiPiA8aDI+PGEgbmFtZT0ic2VjLXhtbC1hbmQtc2dtbCI+PC9hPkMgWE1MIGFuZA0KK1NHTUwgKE5vbi1Ob3JtYXRpdmUpPC9oMj4gPHA+WE1MIGlzIGRlc2lnbmVkIHRvIGJlIGEgc3Vic2V0IG9mIFNHTUwsIGluIHRoYXQNCitldmVyeSBYTUwgZG9jdW1lbnQgc2hvdWxkIGFsc28gYmUgYSBjb25mb3JtaW5nIFNHTUwgZG9jdW1lbnQuIEZvciBhIGRldGFpbGVkDQorY29tcGFyaXNvbiBvZiB0aGUgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgdGhhdCBYTUwgcGxhY2VzIG9uIGRvY3VtZW50cyBiZXlvbmQNCit0aG9zZSBvZiBTR01MLCBzZWUgPGEgaHJlZj0iI0NsYXJrIj5bQ2xhcmtdPC9hPi48L3A+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYxIj4gPGgyPjxhDQorbmFtZT0ic2VjLWVudGV4cGFuZCI+PC9hPkQgRXhwYW5zaW9uIG9mIEVudGl0eSBhbmQgQ2hhcmFjdGVyIFJlZmVyZW5jZXMgKE5vbi1Ob3JtYXRpdmUpPC9oMj4gPHA+VGhpcw0KK2FwcGVuZGl4IGNvbnRhaW5zIHNvbWUgZXhhbXBsZXMgaWxsdXN0cmF0aW5nIHRoZSBzZXF1ZW5jZSBvZiBlbnRpdHktIGFuZCBjaGFyYWN0ZXItcmVmZXJlbmNlDQorcmVjb2duaXRpb24gYW5kIGV4cGFuc2lvbiwgYXMgc3BlY2lmaWVkIGluIDxhIGhyZWY9IiNlbnRwcm9jIj48Yj40LjQgWE1MIFByb2Nlc3Nvcg0KK1RyZWF0bWVudCBvZiBFbnRpdGllcyBhbmQgUmVmZXJlbmNlczwvYj48L2E+LjwvcD4gPHA+SWYgdGhlIERURCBjb250YWlucyB0aGUNCitkZWNsYXJhdGlvbjwvcD4gPHRhYmxlIGNsYXNzPSJlZyIgd2lkdGg9IjEwMCUiIGJvcmRlcj0iMSIgY2VsbHBhZGRpbmc9IjUiDQorYmdjb2xvcj0iIzk5ZmZmZiI+DQorPHRyPg0KKzx0ZD48cHJlPiZsdDshRU5USVRZIGV4YW1wbGUgIiZsdDtwPkFuIGFtcGVyc2FuZCAoJmFtcDsjMzg7IzM4OykgbWF5IGJlIGVzY2FwZWQNCitudW1lcmljYWxseSAoJmFtcDsjMzg7IzM4OyMzODspIG9yIHdpdGggYSBnZW5lcmFsIGVudGl0eQ0KKygmYW1wO2FtcDthbXA7KS4mbHQ7L3A+IiA+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDxwPnRoZW4gdGhlIFhNTCBwcm9jZXNzb3Igd2lsbCByZWNvZ25pemUgdGhlIGNoYXJhY3RlciByZWZlcmVuY2VzDQord2hlbiBpdCBwYXJzZXMgdGhlIGVudGl0eSBkZWNsYXJhdGlvbiwgYW5kIHJlc29sdmUgdGhlbSBiZWZvcmUgc3RvcmluZyB0aGUNCitmb2xsb3dpbmcgc3RyaW5nIGFzIHRoZSB2YWx1ZSBvZiB0aGUgZW50aXR5ICI8Y29kZT5leGFtcGxlPC9jb2RlPiI6PC9wPiA8dGFibGUNCitjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+Jmx0O3A+QW4gYW1wZXJzYW5kICgmYW1wOyMzODspIG1heSBiZSBlc2NhcGVkDQorbnVtZXJpY2FsbHkgKCZhbXA7IzM4OyMzODspIG9yIHdpdGggYSBnZW5lcmFsIGVudGl0eQ0KKygmYW1wO2FtcDthbXA7KS4mbHQ7L3A+PC9wcmU+PC90ZD4NCis8L3RyPg0KKzwvdGFibGU+IDxwPkEgcmVmZXJlbmNlIGluIHRoZSBkb2N1bWVudCB0byAiPGNvZGU+JmFtcDtleGFtcGxlOzwvY29kZT4iIHdpbGwNCitjYXVzZSB0aGUgdGV4dCB0byBiZSByZXBhcnNlZCwgYXQgd2hpY2ggdGltZSB0aGUgc3RhcnQtIGFuZCBlbmQtdGFncyBvZiB0aGUgPGNvZGU+cDwvY29kZT4NCitlbGVtZW50IHdpbGwgYmUgcmVjb2duaXplZCBhbmQgdGhlIHRocmVlIHJlZmVyZW5jZXMgd2lsbCBiZSByZWNvZ25pemVkIGFuZA0KK2V4cGFuZGVkLCByZXN1bHRpbmcgaW4gYSA8Y29kZT5wPC9jb2RlPiBlbGVtZW50IHdpdGggdGhlIGZvbGxvd2luZyBjb250ZW50DQorKGFsbCBkYXRhLCBubyBkZWxpbWl0ZXJzIG9yIG1hcmt1cCk6PC9wPiA8dGFibGUgY2xhc3M9ImVnIiB3aWR0aD0iMTAwJSIgYm9yZGVyPSIxIg0KK2NlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+QW4gYW1wZXJzYW5kICgmYW1wOykgbWF5IGJlIGVzY2FwZWQNCitudW1lcmljYWxseSAoJmFtcDsjMzg7KSBvciB3aXRoIGEgZ2VuZXJhbCBlbnRpdHkNCisoJmFtcDthbXA7KS48L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPHA+QSBtb3JlIGNvbXBsZXggZXhhbXBsZSB3aWxsIGlsbHVzdHJhdGUgdGhlIHJ1bGVzIGFuZCB0aGVpciBlZmZlY3RzDQorZnVsbHkuIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIGxpbmUgbnVtYmVycyBhcmUgc29sZWx5IGZvciByZWZlcmVuY2UuPC9wPiA8dGFibGUNCitjbGFzcz0iZWciIHdpZHRoPSIxMDAlIiBib3JkZXI9IjEiIGNlbGxwYWRkaW5nPSI1IiBiZ2NvbG9yPSIjOTlmZmZmIj4NCis8dHI+DQorPHRkPjxwcmU+MSAmbHQ7P3htbCB2ZXJzaW9uPScxLjAnPz4NCisyICZsdDshRE9DVFlQRSB0ZXN0IFsNCiszICZsdDshRUxFTUVOVCB0ZXN0ICgjUENEQVRBKSA+DQorNCAmbHQ7IUVOVElUWSAlIHh4ICcmYW1wOyMzNzt6ejsnPg0KKzUgJmx0OyFFTlRJVFkgJSB6eiAnJmFtcDsjNjA7IUVOVElUWSB0cmlja3kgImVycm9yLXByb25lIiA+JyA+DQorNiAleHg7DQorNyBdPg0KKzggJmx0O3Rlc3Q+VGhpcyBzYW1wbGUgc2hvd3MgYSAmYW1wO3RyaWNreTsgbWV0aG9kLiZsdDsvdGVzdD48L3ByZT48L3RkPg0KKzwvdHI+DQorPC90YWJsZT4gPHA+VGhpcyBwcm9kdWNlcyB0aGUgZm9sbG93aW5nOjwvcD4gPHVsPg0KKzxsaT48cD5pbiBsaW5lIDQsIHRoZSByZWZlcmVuY2UgdG8gY2hhcmFjdGVyIDM3IGlzIGV4cGFuZGVkIGltbWVkaWF0ZWx5LCBhbmQNCit0aGUgcGFyYW1ldGVyIGVudGl0eSAiPGNvZGU+eHg8L2NvZGU+IiBpcyBzdG9yZWQgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aXRoDQordGhlIHZhbHVlICI8Y29kZT4leno7PC9jb2RlPiIuIFNpbmNlIHRoZSByZXBsYWNlbWVudCB0ZXh0IGlzIG5vdCByZXNjYW5uZWQsDQordGhlIHJlZmVyZW5jZSB0byBwYXJhbWV0ZXIgZW50aXR5ICI8Y29kZT56ejwvY29kZT4iIGlzIG5vdCByZWNvZ25pemVkLiAoQW5kDQoraXQgd291bGQgYmUgYW4gZXJyb3IgaWYgaXQgd2VyZSwgc2luY2UgIjxjb2RlPnp6PC9jb2RlPiIgaXMgbm90IHlldCBkZWNsYXJlZC4pPC9wPjwvbGk+DQorPGxpPjxwPmluIGxpbmUgNSwgdGhlIGNoYXJhY3RlciByZWZlcmVuY2UgIjxjb2RlPiZhbXA7IzYwOzwvY29kZT4iIGlzIGV4cGFuZGVkDQoraW1tZWRpYXRlbHkgYW5kIHRoZSBwYXJhbWV0ZXIgZW50aXR5ICI8Y29kZT56ejwvY29kZT4iIGlzIHN0b3JlZCB3aXRoIHRoZQ0KK3JlcGxhY2VtZW50IHRleHQgIjxjb2RlPiZsdDshRU5USVRZIHRyaWNreSAiZXJyb3ItcHJvbmUiID48L2NvZGU+Iiwgd2hpY2gNCitpcyBhIHdlbGwtZm9ybWVkIGVudGl0eSBkZWNsYXJhdGlvbi48L3A+PC9saT4NCis8bGk+PHA+aW4gbGluZSA2LCB0aGUgcmVmZXJlbmNlIHRvICI8Y29kZT54eDwvY29kZT4iIGlzIHJlY29nbml6ZWQsIGFuZCB0aGUNCityZXBsYWNlbWVudCB0ZXh0IG9mICI8Y29kZT54eDwvY29kZT4iIChuYW1lbHkgIjxjb2RlPiV6ejs8L2NvZGU+IikgaXMgcGFyc2VkLg0KK1RoZSByZWZlcmVuY2UgdG8gIjxjb2RlPnp6PC9jb2RlPiIgaXMgcmVjb2duaXplZCBpbiBpdHMgdHVybiwgYW5kIGl0cyByZXBsYWNlbWVudA0KK3RleHQgKCI8Y29kZT4mbHQ7IUVOVElUWSB0cmlja3kgImVycm9yLXByb25lIiA+PC9jb2RlPiIpIGlzIHBhcnNlZC4gVGhlIGdlbmVyYWwNCitlbnRpdHkgIjxjb2RlPnRyaWNreTwvY29kZT4iIGhhcyBub3cgYmVlbiBkZWNsYXJlZCwgd2l0aCB0aGUgcmVwbGFjZW1lbnQgdGV4dA0KKyI8Y29kZT5lcnJvci1wcm9uZTwvY29kZT4iLjwvcD4gPC9saT4NCis8bGk+PHA+aW4gbGluZSA4LCB0aGUgcmVmZXJlbmNlIHRvIHRoZSBnZW5lcmFsIGVudGl0eSAiPGNvZGU+dHJpY2t5PC9jb2RlPiINCitpcyByZWNvZ25pemVkLCBhbmQgaXQgaXMgZXhwYW5kZWQsIHNvIHRoZSBmdWxsIGNvbnRlbnQgb2YgdGhlIDxjb2RlPnRlc3Q8L2NvZGU+DQorZWxlbWVudCBpcyB0aGUgc2VsZi1kZXNjcmliaW5nIChhbmQgdW5ncmFtbWF0aWNhbCkgc3RyaW5nIDxlbT5UaGlzIHNhbXBsZQ0KK3Nob3dzIGEgZXJyb3ItcHJvbmUgbWV0aG9kLjwvZW0+PC9wPjwvbGk+DQorPC91bD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjEiPiA8aDI+PGEgbmFtZT0iZGV0ZXJtaW5pc20iPjwvYT5FIERldGVybWluaXN0aWMNCitDb250ZW50IE1vZGVscyAoTm9uLU5vcm1hdGl2ZSk8L2gyPiA8cD5BcyBub3RlZCBpbiA8YSBocmVmPSIjc2VjLWVsZW1lbnQtY29udGVudCI+PGI+My4yLjENCitFbGVtZW50IENvbnRlbnQ8L2I+PC9hPiwgaXQgaXMgcmVxdWlyZWQgdGhhdCBjb250ZW50IG1vZGVscyBpbiBlbGVtZW50IHR5cGUNCitkZWNsYXJhdGlvbnMgYmUgZGV0ZXJtaW5pc3RpYy4gVGhpcyByZXF1aXJlbWVudCBpcyA8YSB0aXRsZT0iRm9yIENvbXBhdGliaWxpdHkiDQoraHJlZj0iI2R0LWNvbXBhdCI+Zm9yIGNvbXBhdGliaWxpdHk8L2E+IHdpdGggU0dNTCAod2hpY2ggY2FsbHMgZGV0ZXJtaW5pc3RpYw0KK2NvbnRlbnQgbW9kZWxzICJ1bmFtYmlndW91cyIpOyBYTUwgcHJvY2Vzc29ycyBidWlsdCB1c2luZyBTR01MIHN5c3RlbXMgbWF5DQorZmxhZyBub24tZGV0ZXJtaW5pc3RpYyBjb250ZW50IG1vZGVscyBhcyBlcnJvcnMuPC9wPiA8cD5Gb3IgZXhhbXBsZSwgdGhlIGNvbnRlbnQNCittb2RlbCA8Y29kZT4oKGIsIGMpIHwgKGIsIGQpKTwvY29kZT4gaXMgbm9uLWRldGVybWluaXN0aWMsIGJlY2F1c2UgZ2l2ZW4gYW4NCitpbml0aWFsIDxjb2RlPmI8L2NvZGU+IHRoZSBYTUwgcHJvY2Vzc29yIGNhbm5vdCBrbm93IHdoaWNoIDxjb2RlPmI8L2NvZGU+DQoraW4gdGhlIG1vZGVsIGlzIGJlaW5nIG1hdGNoZWQgd2l0aG91dCBsb29raW5nIGFoZWFkIHRvIHNlZSB3aGljaCBlbGVtZW50IGZvbGxvd3MNCit0aGUgPGNvZGU+YjwvY29kZT4uIEluIHRoaXMgY2FzZSwgdGhlIHR3byByZWZlcmVuY2VzIHRvIDxjb2RlPmI8L2NvZGU+IGNhbg0KK2JlIGNvbGxhcHNlZCBpbnRvIGEgc2luZ2xlIHJlZmVyZW5jZSwgbWFraW5nIHRoZSBtb2RlbCByZWFkIDxjb2RlPihiLCAoYyB8DQorZCkpPC9jb2RlPi4gQW4gaW5pdGlhbCA8Y29kZT5iPC9jb2RlPiBub3cgY2xlYXJseSBtYXRjaGVzIG9ubHkgYSBzaW5nbGUgbmFtZQ0KK2luIHRoZSBjb250ZW50IG1vZGVsLiBUaGUgcHJvY2Vzc29yIGRvZXNuJ3QgbmVlZCB0byBsb29rIGFoZWFkIHRvIHNlZSB3aGF0DQorZm9sbG93czsgZWl0aGVyIDxjb2RlPmM8L2NvZGU+IG9yIDxjb2RlPmQ8L2NvZGU+IHdvdWxkIGJlIGFjY2VwdGVkLjwvcD4gPHA+TW9yZQ0KK2Zvcm1hbGx5OiBhIGZpbml0ZSBzdGF0ZSBhdXRvbWF0b24gbWF5IGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGNvbnRlbnQgbW9kZWwNCit1c2luZyB0aGUgc3RhbmRhcmQgYWxnb3JpdGhtcywgZS5nLiBhbGdvcml0aG0gMy41IGluIHNlY3Rpb24gMy45IG9mIEFobywgU2V0aGksDQorYW5kIFVsbG1hbiA8YSBocmVmPSIjQWhvIj5bQWhvL1VsbG1hbl08L2E+LiBJbiBtYW55IHN1Y2ggYWxnb3JpdGhtcywgYSBmb2xsb3cNCitzZXQgaXMgY29uc3RydWN0ZWQgZm9yIGVhY2ggcG9zaXRpb24gaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiAoaS5lLiwgZWFjaA0KK2xlYWYgbm9kZSBpbiB0aGUgc3ludGF4IHRyZWUgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb24pOyBpZiBhbnkgcG9zaXRpb24NCitoYXMgYSBmb2xsb3cgc2V0IGluIHdoaWNoIG1vcmUgdGhhbiBvbmUgZm9sbG93aW5nIHBvc2l0aW9uIGlzIGxhYmVsZWQgd2l0aA0KK3RoZSBzYW1lIGVsZW1lbnQgdHlwZSBuYW1lLCB0aGVuIHRoZSBjb250ZW50IG1vZGVsIGlzIGluIGVycm9yIGFuZCBtYXkgYmUNCityZXBvcnRlZCBhcyBhbiBlcnJvci48L3A+IDxwPkFsZ29yaXRobXMgZXhpc3Qgd2hpY2ggYWxsb3cgbWFueSBidXQgbm90IGFsbA0KK25vbi1kZXRlcm1pbmlzdGljIGNvbnRlbnQgbW9kZWxzIHRvIGJlIHJlZHVjZWQgYXV0b21hdGljYWxseSB0byBlcXVpdmFsZW50DQorZGV0ZXJtaW5pc3RpYyBtb2RlbHM7IHNlZSBCciZ1dW1sO2dnZW1hbm4tS2xlaW4gMTk5MSA8YSBocmVmPSIjQUJLIj5bQnImdXVtbDtnZ2VtYW5uLUtsZWluXTwvYT4uPC9wPiA8L2Rpdj4gPGRpdg0KK2NsYXNzPSJkaXYxIj4gPGgyPjxhIG5hbWU9InNlYy1ndWVzc2luZyI+PC9hPkYgQXV0b2RldGVjdGlvbiBvZiBDaGFyYWN0ZXINCitFbmNvZGluZ3MgKE5vbi1Ob3JtYXRpdmUpPC9oMj4gPHA+VGhlIFhNTCBlbmNvZGluZyBkZWNsYXJhdGlvbiBmdW5jdGlvbnMgYXMNCithbiBpbnRlcm5hbCBsYWJlbCBvbiBlYWNoIGVudGl0eSwgaW5kaWNhdGluZyB3aGljaCBjaGFyYWN0ZXIgZW5jb2RpbmcgaXMgaW4NCit1c2UuIEJlZm9yZSBhbiBYTUwgcHJvY2Vzc29yIGNhbiByZWFkIHRoZSBpbnRlcm5hbCBsYWJlbCwgaG93ZXZlciwgaXQgYXBwYXJlbnRseQ0KK2hhcyB0byBrbm93IHdoYXQgY2hhcmFjdGVyIGVuY29kaW5nIGlzIGluIHVzZS0td2hpY2ggaXMgd2hhdCB0aGUgaW50ZXJuYWwNCitsYWJlbCBpcyB0cnlpbmcgdG8gaW5kaWNhdGUuIEluIHRoZSBnZW5lcmFsIGNhc2UsIHRoaXMgaXMgYSBob3BlbGVzcyBzaXR1YXRpb24uDQorSXQgaXMgbm90IGVudGlyZWx5IGhvcGVsZXNzIGluIFhNTCwgaG93ZXZlciwgYmVjYXVzZSBYTUwgbGltaXRzIHRoZSBnZW5lcmFsDQorY2FzZSBpbiB0d28gd2F5czogZWFjaCBpbXBsZW1lbnRhdGlvbiBpcyBhc3N1bWVkIHRvIHN1cHBvcnQgb25seSBhIGZpbml0ZQ0KK3NldCBvZiBjaGFyYWN0ZXIgZW5jb2RpbmdzLCBhbmQgdGhlIFhNTCBlbmNvZGluZyBkZWNsYXJhdGlvbiBpcyByZXN0cmljdGVkDQoraW4gcG9zaXRpb24gYW5kIGNvbnRlbnQgaW4gb3JkZXIgdG8gbWFrZSBpdCBmZWFzaWJsZSB0byBhdXRvZGV0ZWN0IHRoZSBjaGFyYWN0ZXINCitlbmNvZGluZyBpbiB1c2UgaW4gZWFjaCBlbnRpdHkgaW4gbm9ybWFsIGNhc2VzLiBBbHNvLCBpbiBtYW55IGNhc2VzIG90aGVyDQorc291cmNlcyBvZiBpbmZvcm1hdGlvbiBhcmUgYXZhaWxhYmxlIGluIGFkZGl0aW9uIHRvIHRoZSBYTUwgZGF0YSBzdHJlYW0gaXRzZWxmLg0KK1R3byBjYXNlcyBtYXkgYmUgZGlzdGluZ3Vpc2hlZCwgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIFhNTCBlbnRpdHkgaXMgcHJlc2VudGVkDQordG8gdGhlIHByb2Nlc3NvciB3aXRob3V0LCBvciB3aXRoLCBhbnkgYWNjb21wYW55aW5nIChleHRlcm5hbCkgaW5mb3JtYXRpb24uDQorV2UgY29uc2lkZXIgdGhlIGZpcnN0IGNhc2UgZmlyc3QuPC9wPiA8ZGl2IGNsYXNzPSJkaXYyIj4gPGgzPjxhIG5hbWU9InNlYy1ndWVzc2luZy1uby1leHQtaW5mbyI+PC9hPkYuMQ0KK0RldGVjdGlvbiBXaXRob3V0IEV4dGVybmFsIEVuY29kaW5nIEluZm9ybWF0aW9uPC9oMz4gPHA+QmVjYXVzZSBlYWNoIFhNTCBlbnRpdHkNCitub3QgYWNjb21wYW5pZWQgYnkgZXh0ZXJuYWwgZW5jb2RpbmcgaW5mb3JtYXRpb24gYW5kIG5vdCBpbiBVVEYtOCBvciBVVEYtMTYNCitlbmNvZGluZyA8ZW0+bXVzdDwvZW0+IGJlZ2luIHdpdGggYW4gWE1MIGVuY29kaW5nIGRlY2xhcmF0aW9uLCBpbiB3aGljaCB0aGUNCitmaXJzdCBjaGFyYWN0ZXJzIG11c3QgYmUgJzxjb2RlPiZsdDs/eG1sPC9jb2RlPicsIGFueSBjb25mb3JtaW5nIHByb2Nlc3Nvcg0KK2NhbiBkZXRlY3QsIGFmdGVyIHR3byB0byBmb3VyIG9jdGV0cyBvZiBpbnB1dCwgd2hpY2ggb2YgdGhlIGZvbGxvd2luZyBjYXNlcw0KK2FwcGx5LiBJbiByZWFkaW5nIHRoaXMgbGlzdCwgaXQgbWF5IGhlbHAgdG8ga25vdyB0aGF0IGluIFVDUy00LCAnJmx0OycgaXMNCisiPGNvZGU+I3gwMDAwMDAzQzwvY29kZT4iIGFuZCAnPycgaXMgIjxjb2RlPiN4MDAwMDAwM0Y8L2NvZGU+IiwgYW5kIHRoZSBCeXRlDQorT3JkZXIgTWFyayByZXF1aXJlZCBvZiBVVEYtMTYgZGF0YSBzdHJlYW1zIGlzICI8Y29kZT4jeEZFRkY8L2NvZGU+Ii4gVGhlIG5vdGF0aW9uIDx2YXI+IyM8L3Zhcj4NCitpcyB1c2VkIHRvIGRlbm90ZSBhbnkgYnl0ZSB2YWx1ZSBleGNlcHQgdGhhdCB0d28gY29uc2VjdXRpdmUgPHZhcj4jIzwvdmFyPnMNCitjYW5ub3QgYmUgYm90aCAwMC48L3A+IDxwPldpdGggYSBCeXRlIE9yZGVyIE1hcms6PC9wPiA8dGFibGUgYm9yZGVyPSIxIiBmcmFtZT0iYm9yZGVyIj4NCis8dGJvZHk+DQorPHRyPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48Y29kZT4wMCAwMCBGRSBGRjwvY29kZT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj5VQ1MtNCwgYmlnLWVuZGlhbiBtYWNoaW5lICgxMjM0IG9yZGVyKTwvdGQ+DQorPC90cj4NCis8dHI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPkZGIEZFIDAwIDAwPC9jb2RlPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPlVDUy00LCBsaXR0bGUtZW5kaWFuIG1hY2hpbmUgKDQzMjEgb3JkZXIpPC90ZD4NCis8L3RyPg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGNvZGU+MDAgMDAgRkYgRkU8L2NvZGU+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+VUNTLTQsIHVudXN1YWwgb2N0ZXQgb3JkZXIgKDIxNDMpPC90ZD4NCis8L3RyPg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGNvZGU+RkUgRkYgMDAgMDA8L2NvZGU+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+VUNTLTQsIHVudXN1YWwgb2N0ZXQgb3JkZXIgKDM0MTIpPC90ZD4NCis8L3RyPg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGNvZGU+RkUgRkYgIyMgIyM8L2NvZGU+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+VVRGLTE2LCBiaWctZW5kaWFuPC90ZD4NCis8L3RyPg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGNvZGU+RkYgRkUgIyMgIyM8L2NvZGU+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+VVRGLTE2LCBsaXR0bGUtZW5kaWFuPC90ZD4NCis8L3RyPg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGNvZGU+RUYgQkIgQkY8L2NvZGU+PC90ZD4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+VVRGLTg8L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8cD5XaXRob3V0IGEgQnl0ZSBPcmRlciBNYXJrOjwvcD4gPHRhYmxlIGJvcmRlcj0iMSIgZnJhbWU9ImJvcmRlciI+DQorPHRib2R5Pg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+PGNvZGU+MDAmbmJzcDswMCZuYnNwOzAwJm5ic3A7M0M8L2NvZGU+PC90ZD4NCis8dGQgcm93c3Bhbj0iNCIgY29sc3Bhbj0iMSI+VUNTLTQgb3Igb3RoZXIgZW5jb2Rpbmcgd2l0aCBhIDMyLWJpdCBjb2RlIHVuaXQNCithbmQgQVNDSUkgY2hhcmFjdGVycyBlbmNvZGVkIGFzIEFTQ0lJIHZhbHVlcywgaW4gcmVzcGVjdGl2ZWx5IGJpZy1lbmRpYW4gKDEyMzQpLA0KK2xpdHRsZS1lbmRpYW4gKDQzMjEpIGFuZCB0d28gdW51c3VhbCBieXRlIG9yZGVycyAoMjE0MyBhbmQgMzQxMikuIFRoZSBlbmNvZGluZw0KK2RlY2xhcmF0aW9uIG11c3QgYmUgcmVhZCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgVUNTLTQgb3Igb3RoZXIgc3VwcG9ydGVkIDMyLWJpdA0KK2VuY29kaW5ncyBhcHBsaWVzLjwvdGQ+DQorPC90cj4NCis8dHI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPjNDIDAwIDAwIDAwPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPjAwIDAwIDNDIDAwPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPjAwIDNDIDAwIDAwPC9jb2RlPjwvdGQ+DQorPC90cj4NCis8dHI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPjAwIDNDIDAwIDNGPC9jb2RlPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPlVURi0xNkJFIG9yIGJpZy1lbmRpYW4gSVNPLTEwNjQ2LVVDUy0yIG9yIG90aGVyDQorZW5jb2Rpbmcgd2l0aCBhIDE2LWJpdCBjb2RlIHVuaXQgaW4gYmlnLWVuZGlhbiBvcmRlciBhbmQgQVNDSUkgY2hhcmFjdGVycw0KK2VuY29kZWQgYXMgQVNDSUkgdmFsdWVzICh0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb24gbXVzdCBiZSByZWFkIHRvIGRldGVybWluZQ0KK3doaWNoKTwvdGQ+DQorPC90cj4NCis8dHI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPjNDIDAwIDNGIDAwPC9jb2RlPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPlVURi0xNkxFIG9yIGxpdHRsZS1lbmRpYW4gSVNPLTEwNjQ2LVVDUy0yIG9yIG90aGVyDQorZW5jb2Rpbmcgd2l0aCBhIDE2LWJpdCBjb2RlIHVuaXQgaW4gbGl0dGxlLWVuZGlhbiBvcmRlciBhbmQgQVNDSUkgY2hhcmFjdGVycw0KK2VuY29kZWQgYXMgQVNDSUkgdmFsdWVzICh0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb24gbXVzdCBiZSByZWFkIHRvIGRldGVybWluZQ0KK3doaWNoKTwvdGQ+DQorPC90cj4NCis8dHI+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPjxjb2RlPjNDIDNGIDc4IDZEPC9jb2RlPjwvdGQ+DQorPHRkIHJvd3NwYW49IjEiIGNvbHNwYW49IjEiPlVURi04LCBJU08gNjQ2LCBBU0NJSSwgc29tZSBwYXJ0IG9mIElTTyA4ODU5LA0KK1NoaWZ0LUpJUywgRVVDLCBvciBhbnkgb3RoZXIgNy1iaXQsIDgtYml0LCBvciBtaXhlZC13aWR0aCBlbmNvZGluZyB3aGljaCBlbnN1cmVzDQordGhhdCB0aGUgY2hhcmFjdGVycyBvZiBBU0NJSSBoYXZlIHRoZWlyIG5vcm1hbCBwb3NpdGlvbnMsIHdpZHRoLCBhbmQgdmFsdWVzOw0KK3RoZSBhY3R1YWwgZW5jb2RpbmcgZGVjbGFyYXRpb24gbXVzdCBiZSByZWFkIHRvIGRldGVjdCB3aGljaCBvZiB0aGVzZSBhcHBsaWVzLA0KK2J1dCBzaW5jZSBhbGwgb2YgdGhlc2UgZW5jb2RpbmdzIHVzZSB0aGUgc2FtZSBiaXQgcGF0dGVybnMgZm9yIHRoZSByZWxldmFudA0KK0FTQ0lJIGNoYXJhY3RlcnMsIHRoZSBlbmNvZGluZyBkZWNsYXJhdGlvbiBpdHNlbGYgbWF5IGJlIHJlYWQgcmVsaWFibHk8L3RkPg0KKzwvdHI+DQorPHRyPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj48Y29kZT40QyA2RiBBNyA5NDwvY29kZT48L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj5FQkNESUMgKGluIHNvbWUgZmxhdm9yOyB0aGUgZnVsbCBlbmNvZGluZyBkZWNsYXJhdGlvbg0KK211c3QgYmUgcmVhZCB0byB0ZWxsIHdoaWNoIGNvZGUgcGFnZSBpcyBpbiB1c2UpPC90ZD4NCis8L3RyPg0KKzx0cj4NCis8dGQgcm93c3Bhbj0iMSIgY29sc3Bhbj0iMSI+T3RoZXI8L3RkPg0KKzx0ZCByb3dzcGFuPSIxIiBjb2xzcGFuPSIxIj5VVEYtOCB3aXRob3V0IGFuIGVuY29kaW5nIGRlY2xhcmF0aW9uLCBvciBlbHNlDQordGhlIGRhdGEgc3RyZWFtIGlzIG1pc2xhYmVsZWQgKGxhY2tpbmcgYSByZXF1aXJlZCBlbmNvZGluZyBkZWNsYXJhdGlvbiksIGNvcnJ1cHQsDQorZnJhZ21lbnRhcnksIG9yIGVuY2xvc2VkIGluIGEgd3JhcHBlciBvZiBzb21lIGtpbmQ8L3RkPg0KKzwvdHI+DQorPC90Ym9keT48L3RhYmxlPiA8ZGl2IGNsYXNzPSJub3RlIj48cCBjbGFzcz0icHJlZml4Ij48Yj5Ob3RlOjwvYj48L3A+IDxwPkluDQorY2FzZXMgYWJvdmUgd2hpY2ggZG8gbm90IHJlcXVpcmUgcmVhZGluZyB0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb24gdG8gZGV0ZXJtaW5lDQordGhlIGVuY29kaW5nLCBzZWN0aW9uIDQuMy4zIHN0aWxsIHJlcXVpcmVzIHRoYXQgdGhlIGVuY29kaW5nIGRlY2xhcmF0aW9uLA0KK2lmIHByZXNlbnQsIGJlIHJlYWQgYW5kIHRoYXQgdGhlIGVuY29kaW5nIG5hbWUgYmUgY2hlY2tlZCB0byBtYXRjaCB0aGUgYWN0dWFsDQorZW5jb2Rpbmcgb2YgdGhlIGVudGl0eS4gQWxzbywgaXQgaXMgcG9zc2libGUgdGhhdCBuZXcgY2hhcmFjdGVyIGVuY29kaW5ncw0KK3dpbGwgYmUgaW52ZW50ZWQgdGhhdCB3aWxsIG1ha2UgaXQgbmVjZXNzYXJ5IHRvIHVzZSB0aGUgZW5jb2RpbmcgZGVjbGFyYXRpb24NCit0byBkZXRlcm1pbmUgdGhlIGVuY29kaW5nLCBpbiBjYXNlcyB3aGVyZSB0aGlzIGlzIG5vdCByZXF1aXJlZCBhdCBwcmVzZW50LjwvcD4gPC9kaXY+IDxwPlRoaXMNCitsZXZlbCBvZiBhdXRvZGV0ZWN0aW9uIGlzIGVub3VnaCB0byByZWFkIHRoZSBYTUwgZW5jb2RpbmcgZGVjbGFyYXRpb24gYW5kDQorcGFyc2UgdGhlIGNoYXJhY3Rlci1lbmNvZGluZyBpZGVudGlmaWVyLCB3aGljaCBpcyBzdGlsbCBuZWNlc3NhcnkgdG8gZGlzdGluZ3Vpc2gNCit0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIG9mIGVhY2ggZmFtaWx5IG9mIGVuY29kaW5ncyAoZS5nLiB0byB0ZWxsIFVURi04IGZyb20NCis4ODU5LCBhbmQgdGhlIHBhcnRzIG9mIDg4NTkgZnJvbSBlYWNoIG90aGVyLCBvciB0byBkaXN0aW5ndWlzaCB0aGUgc3BlY2lmaWMNCitFQkNESUMgY29kZSBwYWdlIGluIHVzZSwgYW5kIHNvIG9uKS48L3A+IDxwPkJlY2F1c2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBlbmNvZGluZw0KK2RlY2xhcmF0aW9uIGFyZSByZXN0cmljdGVkIHRvIGNoYXJhY3RlcnMgZnJvbSB0aGUgQVNDSUkgcmVwZXJ0b2lyZSAoaG93ZXZlcg0KK2VuY29kZWQpLCBhIHByb2Nlc3NvciBjYW4gcmVsaWFibHkgcmVhZCB0aGUgZW50aXJlIGVuY29kaW5nIGRlY2xhcmF0aW9uIGFzDQorc29vbiBhcyBpdCBoYXMgZGV0ZWN0ZWQgd2hpY2ggZmFtaWx5IG9mIGVuY29kaW5ncyBpcyBpbiB1c2UuIFNpbmNlIGluIHByYWN0aWNlLA0KK2FsbCB3aWRlbHkgdXNlZCBjaGFyYWN0ZXIgZW5jb2RpbmdzIGZhbGwgaW50byBvbmUgb2YgdGhlIGNhdGVnb3JpZXMgYWJvdmUsDQordGhlIFhNTCBlbmNvZGluZyBkZWNsYXJhdGlvbiBhbGxvd3MgcmVhc29uYWJseSByZWxpYWJsZSBpbi1iYW5kIGxhYmVsaW5nIG9mDQorY2hhcmFjdGVyIGVuY29kaW5ncywgZXZlbiB3aGVuIGV4dGVybmFsIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gYXQgdGhlIG9wZXJhdGluZy1zeXN0ZW0NCitvciB0cmFuc3BvcnQtcHJvdG9jb2wgbGV2ZWwgYXJlIHVucmVsaWFibGUuIENoYXJhY3RlciBlbmNvZGluZ3Mgc3VjaCBhcyBVVEYtNw0KK3RoYXQgbWFrZSBvdmVybG9hZGVkIHVzYWdlIG9mIEFTQ0lJLXZhbHVlZCBieXRlcyBtYXkgZmFpbCB0byBiZSByZWxpYWJseSBkZXRlY3RlZC48L3A+IDxwPk9uY2UNCit0aGUgcHJvY2Vzc29yIGhhcyBkZXRlY3RlZCB0aGUgY2hhcmFjdGVyIGVuY29kaW5nIGluIHVzZSwgaXQgY2FuIGFjdCBhcHByb3ByaWF0ZWx5LA0KK3doZXRoZXIgYnkgaW52b2tpbmcgYSBzZXBhcmF0ZSBpbnB1dCByb3V0aW5lIGZvciBlYWNoIGNhc2UsIG9yIGJ5IGNhbGxpbmcNCit0aGUgcHJvcGVyIGNvbnZlcnNpb24gZnVuY3Rpb24gb24gZWFjaCBjaGFyYWN0ZXIgb2YgaW5wdXQuPC9wPiA8cD5MaWtlIGFueQ0KK3NlbGYtbGFiZWxpbmcgc3lzdGVtLCB0aGUgWE1MIGVuY29kaW5nIGRlY2xhcmF0aW9uIHdpbGwgbm90IHdvcmsgaWYgYW55IHNvZnR3YXJlDQorY2hhbmdlcyB0aGUgZW50aXR5J3MgY2hhcmFjdGVyIHNldCBvciBlbmNvZGluZyB3aXRob3V0IHVwZGF0aW5nIHRoZSBlbmNvZGluZw0KK2RlY2xhcmF0aW9uLiBJbXBsZW1lbnRvcnMgb2YgY2hhcmFjdGVyLWVuY29kaW5nIHJvdXRpbmVzIHNob3VsZCBiZSBjYXJlZnVsDQordG8gZW5zdXJlIHRoZSBhY2N1cmFjeSBvZiB0aGUgaW50ZXJuYWwgYW5kIGV4dGVybmFsIGluZm9ybWF0aW9uIHVzZWQgdG8gbGFiZWwNCit0aGUgZW50aXR5LjwvcD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjIiPiA8aDM+PGEgbmFtZT0ic2VjLWd1ZXNzaW5nLXdpdGgtZXh0LWluZm8iPjwvYT5GLjINCitQcmlvcml0aWVzIGluIHRoZSBQcmVzZW5jZSBvZiBFeHRlcm5hbCBFbmNvZGluZyBJbmZvcm1hdGlvbjwvaDM+IDxwPlRoZSBzZWNvbmQNCitwb3NzaWJsZSBjYXNlIG9jY3VycyB3aGVuIHRoZSBYTUwgZW50aXR5IGlzIGFjY29tcGFuaWVkIGJ5IGVuY29kaW5nIGluZm9ybWF0aW9uLA0KK2FzIGluIHNvbWUgZmlsZSBzeXN0ZW1zIGFuZCBzb21lIG5ldHdvcmsgcHJvdG9jb2xzLiBXaGVuIG11bHRpcGxlIHNvdXJjZXMNCitvZiBpbmZvcm1hdGlvbiBhcmUgYXZhaWxhYmxlLCB0aGVpciByZWxhdGl2ZSBwcmlvcml0eSBhbmQgdGhlIHByZWZlcnJlZCBtZXRob2QNCitvZiBoYW5kbGluZyBjb25mbGljdCBzaG91bGQgYmUgc3BlY2lmaWVkIGFzIHBhcnQgb2YgdGhlIGhpZ2hlci1sZXZlbCBwcm90b2NvbA0KK3VzZWQgdG8gZGVsaXZlciBYTUwuIEluIHBhcnRpY3VsYXIsIHBsZWFzZSByZWZlciB0byA8YSBocmVmPSIjcmZjMjM3NiI+W0lFVEYNCitSRkMgMjM3Nl08L2E+IG9yIGl0cyBzdWNjZXNzb3IsIHdoaWNoIGRlZmluZXMgdGhlIDxjb2RlPnRleHQveG1sPC9jb2RlPiBhbmQgPGNvZGU+YXBwbGljYXRpb24veG1sPC9jb2RlPg0KK01JTUUgdHlwZXMgYW5kIHByb3ZpZGVzIHNvbWUgdXNlZnVsIGd1aWRhbmNlLiBJbiB0aGUgaW50ZXJlc3RzIG9mIGludGVyb3BlcmFiaWxpdHksDQoraG93ZXZlciwgdGhlIGZvbGxvd2luZyBydWxlIGlzIHJlY29tbWVuZGVkLjwvcD4gPHVsPg0KKzxsaT48cD5JZiBhbiBYTUwgZW50aXR5IGlzIGluIGEgZmlsZSwgdGhlIEJ5dGUtT3JkZXIgTWFyayBhbmQgZW5jb2RpbmcgZGVjbGFyYXRpb24NCithcmUgdXNlZCAoaWYgcHJlc2VudCkgdG8gZGV0ZXJtaW5lIHRoZSBjaGFyYWN0ZXIgZW5jb2RpbmcuPC9wPiA8L2xpPg0KKzwvdWw+ICAgPC9kaXY+IDwvZGl2PiA8ZGl2IGNsYXNzPSJkaXYxIj4gPGgyPjxhIG5hbWU9InNlYy14bWwtd2ciPjwvYT5HIFczQw0KK1hNTCBXb3JraW5nIEdyb3VwIChOb24tTm9ybWF0aXZlKTwvaDI+IDxwPlRoaXMgc3BlY2lmaWNhdGlvbiB3YXMgcHJlcGFyZWQNCithbmQgYXBwcm92ZWQgZm9yIHB1YmxpY2F0aW9uIGJ5IHRoZSBXM0MgWE1MIFdvcmtpbmcgR3JvdXAgKFdHKS4gV0cgYXBwcm92YWwNCitvZiB0aGlzIHNwZWNpZmljYXRpb24gZG9lcyBub3QgbmVjZXNzYXJpbHkgaW1wbHkgdGhhdCBhbGwgV0cgbWVtYmVycyB2b3RlZA0KK2ZvciBpdHMgYXBwcm92YWwuIFRoZSBjdXJyZW50IGFuZCBmb3JtZXIgbWVtYmVycyBvZiB0aGUgWE1MIFdHIGFyZTo8L3A+IDx1bD4NCis8bGk+Sm9uIEJvc2FrLCBTdW4gKDxpPkNoYWlyPC9pPikgIDwvbGk+DQorPGxpPkphbWVzIENsYXJrICg8aT5UZWNobmljYWwgTGVhZDwvaT4pIDwvbGk+DQorPGxpPlRpbSBCcmF5LCBUZXh0dWFsaXR5IGFuZCBOZXRzY2FwZSAgKDxpPlhNTCBDby1lZGl0b3I8L2k+KSA8L2xpPg0KKzxsaT5KZWFuIFBhb2xpLCBNaWNyb3NvZnQgKDxpPlhNTCBDby1lZGl0b3I8L2k+KSA8L2xpPg0KKzxsaT5DLiBNLiBTcGVyYmVyZy1NY1F1ZWVuLCBVLiBvZiBJbGwuICAoPGk+WE1MIENvLWVkaXRvcjwvaT4pIDwvbGk+DQorPGxpPkRhbiBDb25ub2xseSwgVzNDICg8aT5XM0MgTGlhaXNvbjwvaT4pICA8L2xpPg0KKzxsaT5QYXVsYSBBbmdlcnN0ZWluLCBUZXhjZWw8L2xpPg0KKzxsaT5TdGV2ZSBEZVJvc2UsIElOU088L2xpPg0KKzxsaT5EYXZlIEhvbGxhbmRlciwgSFA8L2xpPg0KKzxsaT5FbGlvdCBLaW1iZXIsIElTT0dFTjwvbGk+DQorPGxpPkV2ZSBNYWxlciwgQXJib3JUZXh0PC9saT4NCis8bGk+VG9tIE1hZ2xpZXJ5LCBOQ1NBPC9saT4NCis8bGk+TXVycmF5IE1hbG9uZXksIFNvZnRRdWFkLCBHcmlmIFNBLCBNdXptbyBhbmQgVmVvIFN5c3RlbXM8L2xpPg0KKzxsaT5NVVJBVEEgTWFrb3RvIChGQU1JTFkgR2l2ZW4pLCBGdWppIFhlcm94IEluZm9ybWF0aW9uIFN5c3RlbXM8L2xpPg0KKzxsaT5Kb2VsIE5hdmEsIEFkb2JlPC9saT4NCis8bGk+Q29ubGV0aCBPJ0Nvbm5lbGwsIFZpZ25ldHRlIDwvbGk+DQorPGxpPlBldGVyIFNoYXJwZSwgU29mdFF1YWQ8L2xpPg0KKzxsaT5Kb2huIFRpZ3VlLCBEYXRhQ2hhbm5lbDwvbGk+DQorPC91bD4gPC9kaXY+IDxkaXYgY2xhc3M9ImRpdjEiPiA8aDI+PGEgbmFtZT0ic2VjLWNvcmUtd2ciPjwvYT5IIFczQyBYTUwgQ29yZQ0KK0dyb3VwIChOb24tTm9ybWF0aXZlKTwvaDI+IDxwPlRoZSBzZWNvbmQgZWRpdGlvbiBvZiB0aGlzIHNwZWNpZmljYXRpb24gd2FzDQorcHJlcGFyZWQgYnkgdGhlIFczQyBYTUwgQ29yZSBXb3JraW5nIEdyb3VwIChXRykuIFRoZSBtZW1iZXJzIG9mIHRoZSBXRyBhdA0KK3RoZSB0aW1lIG9mIHB1YmxpY2F0aW9uIG9mIHRoaXMgZWRpdGlvbiB3ZXJlOjwvcD4gPHVsPg0KKzxsaT5QYXVsYSBBbmdlcnN0ZWluLCBWaWduZXR0ZTwvbGk+DQorPGxpPkRhbmllbCBBdXN0aW4sIEFzayBKZWV2ZXM8L2xpPg0KKzxsaT5UaW0gQm9sYW5kPC9saT4NCis8bGk+QWxsZW4gQnJvd24sIE1pY3Jvc29mdDwvbGk+DQorPGxpPkRhbiBDb25ub2xseSwgVzNDICg8aT5TdGFmZiBDb250YWN0PC9pPikgPC9saT4NCis8bGk+Sm9obiBDb3dhbiwgUmV1dGVycyBMaW1pdGVkIDwvbGk+DQorPGxpPkpvaG4gRXZkZW1vbiwgWE1MU29sdXRpb25zIENvcnBvcmF0aW9uIDwvbGk+DQorPGxpPlBhdWwgR3Jvc3NvLCBBcmJvcnRleHQgKDxpPkNvLUNoYWlyPC9pPikgIDwvbGk+DQorPGxpPkFybmF1ZCBMZSBIb3JzLCBJQk0gKDxpPkNvLUNoYWlyPC9pPikgIDwvbGk+DQorPGxpPkV2ZSBNYWxlciwgU3VuIE1pY3Jvc3lzdGVtcyAgKDxpPlNlY29uZCBFZGl0aW9uIEVkaXRvcjwvaT4pIDwvbGk+DQorPGxpPkpvbmF0aGFuIE1hcnNoLCBNaWNyb3NvZnQ8L2xpPg0KKzxsaT5NVVJBVEEgTWFrb3RvIChGQU1JTFkgR2l2ZW4pLCBJQk0gPC9saT4NCis8bGk+TWFyayBOZWVkbGVtYW4sIERhdGEgUmVzZWFyY2ggQXNzb2NpYXRlcyA8L2xpPg0KKzxsaT5EYXZpZCBPcmNoYXJkLCBKYW1jcmFja2VyPC9saT4NCis8bGk+TGV3IFNoYW5ub24sIE5DUjwvbGk+DQorPGxpPlJpY2hhcmQgVG9iaW4sIFVuaXZlcnNpdHkgb2YgRWRpbmJ1cmdoIDwvbGk+DQorPGxpPkRhbmllbCBWZWlsbGFyZCwgVzNDPC9saT4NCis8bGk+RGFuIFZpbnQsIExleGljYTwvbGk+DQorPGxpPk5vcm1hbiBXYWxzaCwgU3VuIE1pY3Jvc3lzdGVtcyA8L2xpPg0KKzxsaT5GcmFuJmNjZWRpbDtvaXMgWWVyZ2VhdSwgQWxpcyBUZWNobm9sb2dpZXMgICg8aT5FcnJhdGEgTGlzdCBFZGl0b3I8L2k+KSA8L2xpPg0KKzxsaT5Lb25neWkgWmhvdSwgT3JhY2xlPC9saT4NCis8L3VsPiA8L2Rpdj4gPGRpdiBjbGFzcz0iZGl2MSI+IDxoMj48YSBuYW1lPSJiNGQyNTBiNmMyMSI+PC9hPkkgUHJvZHVjdGlvbg0KK05vdGVzIChOb24tTm9ybWF0aXZlKTwvaDI+IDxwPlRoaXMgU2Vjb25kIEVkaXRpb24gd2FzIGVuY29kZWQgaW4gdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4LzA2L3htbHNwZWMtdjIxLmR0ZCI+WE1Mc3BlYw0KK0RURDwvYT4gKHdoaWNoIGhhcyA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC8wNi94bWxzcGVjLXJlcG9ydC12MjEuaHRtIj5kb2N1bWVudGF0aW9uPC9hPg0KK2F2YWlsYWJsZSkuIFRoZSBIVE1MIHZlcnNpb25zIHdlcmUgcHJvZHVjZWQgd2l0aCBhIGNvbWJpbmF0aW9uIG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC8wNi94bWxzcGVjLnhzbCI+eG1sc3BlYy54c2w8L2E+LCA8YQ0KK2hyZWY9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4LzA2L2RpZmZzcGVjLnhzbCI+ZGlmZnNwZWMueHNsPC9hPiwgYW5kIDxhDQoraHJlZj0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvMDYvUkVDLXhtbC0yZS54c2wiPlJFQy14bWwtMmUueHNsPC9hPiBYU0xUDQorc3R5bGVzaGVldHMuICBUaGUgUERGIHZlcnNpb24gd2FzIHByb2R1Y2VkIHdpdGggdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudGRiLnV1LnNlL35qYW4vaHRtbDJwcy5odG1sIj5odG1sMnBzPC9hPg0KK2ZhY2lsaXR5IGFuZCBhIGRpc3RpbGxlciBwcm9ncmFtLjwvcD4gPC9kaXY+IDwvZGl2PjwvYm9keT4NCis8L2h0bWw+DQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9kYXRhL29yZy93M2Mvd3d3L1RSL3htbC1zdHlsZXNoZWV0Lmh0bWwgYi9zYW1wbGVzL2RhdGEvb3JnL3czYy93d3cvVFIveG1sLXN0eWxlc2hlZXQuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZThlMTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL29yZy93M2Mvd3d3L1RSL3htbC1zdHlsZXNoZWV0Lmh0bWwKQEAgLTAsMCArMSwzNDEgQEAKKzwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorPHRpdGxlPkFzc29jaWF0aW5nIFN0eWxlIFNoZWV0cyB3aXRoIFhNTCBkb2N1bWVudHM8L3RpdGxlPgorPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvU3R5bGVTaGVldHMvVFIvVzNDLVJFQyI+Cis8c3R5bGUgdHlwZT0idGV4dC9jc3MiPmNvZGUgeyBmb250LWZhbWlseTogbW9ub3NwYWNlIH08L3N0eWxlPgorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGNsYXNzPSJoZWFkIj4KKzxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnLyI+PGltZyBzcmM9Imh0dHA6Ly93d3cudzMub3JnL0ljb25zL1dXVy93M2NfaG9tZSIgYWx0PSJXM0MiIGhlaWdodD0iNDgiIHdpZHRoPSI3MiI+PC9hPgorPGgxPkFzc29jaWF0aW5nIFN0eWxlIFNoZWV0cyB3aXRoIFhNTCBkb2N1bWVudHM8YnI+VmVyc2lvbiAxLjA8L2gxPgorPGgyPlczQyBSZWNvbW1lbmRhdGlvbiAyOSBKdW5lIDE5OTk8L2gyPgorPGRsPgorPGR0PlRoaXMgdmVyc2lvbjo8L2R0PgorPGRkPgorPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wNi9SRUMteG1sLXN0eWxlc2hlZXQtMTk5OTA2MjkiPmh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDYvUkVDLXhtbC1zdHlsZXNoZWV0LTE5OTkwNjI5PC9hPgorPGJyPgorPC9kZD4KKzxkdD5MYXRlc3QgdmVyc2lvbjo8L2R0PgorPGRkPgorPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiPmh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0PC9hPgorPGJyPgorPC9kZD4KKzxkdD5QcmV2aW91cyB2ZXJzaW9uOjwvZHQ+Cis8ZGQ+Cis8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L3htbC1zdHlsZXNoZWV0LTE5OTkwNDI4Ij5odHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L3htbC1zdHlsZXNoZWV0LTE5OTkwNDI4PC9hPgorPGJyPgorPC9kZD4KKzxkdD5FZGl0b3I6PC9kdD4KKzxkZD4KKworSmFtZXMgQ2xhcmsKKzxhIGhyZWY9Im1haWx0bzpqamNAamNsYXJrLmNvbSI+Jmx0O2pqY0BqY2xhcmsuY29tJmd0OzwvYT4KKzxicj4KKzwvZGQ+Cis8L2RsPgorPHAgY2xhc3M9ImNvcHlyaWdodCI+Cis8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2lwci1ub3RpY2UuaHRtbCNDb3B5cmlnaHQiPgorCQlDb3B5cmlnaHQ8L2E+ICZuYnNwOyZjb3B5OyZuYnNwOyAxOTk5IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnIj5XM0M8L2E+CisJCSg8YSBocmVmPSJodHRwOi8vd3d3Lmxjcy5taXQuZWR1Ij5NSVQ8L2E+LAorCQk8YSBocmVmPSJodHRwOi8vd3d3LmlucmlhLmZyLyI+SU5SSUE8L2E+LAorCQk8YSBocmVmPSJodHRwOi8vd3d3LmtlaW8uYWMuanAvIj5LZWlvPC9hPiApLCBBbGwgUmlnaHRzIFJlc2VydmVkLiBXM0MKKwkJPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9pcHItbm90aWNlLmh0bWwjTGVnYWwgRGlzY2xhaW1lciI+bGlhYmlsaXR5LDwvYT48YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2lwci1ub3RpY2UuaHRtbCNXM0MgVHJhZGVtYXJrcyI+dHJhZGVtYXJrPC9hPiwKKwkJPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC9jb3B5cmlnaHQtZG9jdW1lbnRzLmh0bWwiPmRvY3VtZW50IHVzZSA8L2E+YW5kCisJCTxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvY29weXJpZ2h0LXNvZnR3YXJlLmh0bWwiPnNvZnR3YXJlIGxpY2Vuc2luZyA8L2E+cnVsZXMgYXBwbHkuCisJPC9wPgorPGhyIHRpdGxlPSJTZXBhcmF0b3IgZm9yIGhlYWRlciI+Cis8L2Rpdj4KKzxoMj4KKzxhIG5hbWU9ImFic3RyYWN0Ij5BYnN0cmFjdDwvYT4KKzwvaDI+CisKKzxwPlRoaXMgZG9jdW1lbnQgYWxsb3dzIGEgc3R5bGUgc2hlZXQgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFuIFhNTAorZG9jdW1lbnQgYnkgaW5jbHVkaW5nIG9uZSBvciBtb3JlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIHdpdGggYQordGFyZ2V0IG9mIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBpbiB0aGUgZG9jdW1lbnQncyBwcm9sb2cuPC9wPgorCis8aDI+Cis8YSBuYW1lPSJzdGF0dXMiPlN0YXR1cyBvZiB0aGlzIGRvY3VtZW50PC9hPgorPC9oMj4KKworPHA+VGhpcyBkb2N1bWVudCBoYXMgYmVlbiByZXZpZXdlZCBieSBXM0MgTWVtYmVycyBhbmQgb3RoZXIgaW50ZXJlc3RlZAorcGFydGllcyBhbmQgaGFzIGJlZW4gZW5kb3JzZWQgYnkgdGhlIERpcmVjdG9yIGFzIGEgVzNDIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vUHJvY2Vzcy8jUmVjc1czQyI+UmVjb21tZW5kYXRpb248L2E+LiBJdAoraXMgYSBzdGFibGUgZG9jdW1lbnQgYW5kIG1heSBiZSB1c2VkIGFzIHJlZmVyZW5jZSBtYXRlcmlhbCBvciBjaXRlZCBhcworYSBub3JtYXRpdmUgcmVmZXJlbmNlIGZyb20gb3RoZXIgZG9jdW1lbnRzLiBXM0MncyByb2xlIGluIG1ha2luZyB0aGUKK1JlY29tbWVuZGF0aW9uIGlzIHRvIGRyYXcgYXR0ZW50aW9uIHRvIHRoZSBzcGVjaWZpY2F0aW9uIGFuZCB0bworcHJvbW90ZSBpdHMgd2lkZXNwcmVhZCBkZXBsb3ltZW50LiBUaGlzIGVuaGFuY2VzIHRoZSBmdW5jdGlvbmFsaXR5IGFuZAoraW50ZXJvcGVyYWJpbGl0eSBvZiB0aGUgV2ViLjwvcD4KKworPHA+VGhlIGxpc3Qgb2Yga25vd24gZXJyb3JzIGluIHRoaXMgc3BlY2lmaWNhdGlvbnMgaXMgYXZhaWxhYmxlIGF0Cis8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzA2L1JFQy14bWwtc3R5bGVzaGVldC0xOTk5MDYyOS9lcnJhdGEiPmh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkveG1sLXN0eWxlc2hlZXQtMTk5OTA2MjkvZXJyYXRhPC9hPi48L3A+CisKKzxwPkNvbW1lbnRzIG9uIHRoaXMgc3BlY2lmaWNhdGlvbiBtYXkgYmUgc2VudCB0byAmbHQ7PGEgaHJlZj0ibWFpbHRvOnd3dy14bWwtc3R5bGVzaGVldC1jb21tZW50c0B3My5vcmciPnd3dy14bWwtc3R5bGVzaGVldC1jb21tZW50c0B3My5vcmc8L2E+Jmd0Oy4gVGhlIGFyY2hpdmUgb2YgcHVibGljCitjb21tZW50cyBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvQXJjaGl2ZXMvUHVibGljL3d3dy14bWwtc3R5bGVzaGVldC1jb21tZW50cyI+aHR0cDovL3czLm9yZy9BcmNoaXZlcy9QdWJsaWMvd3d3LXhtbC1zdHlsZXNoZWV0LWNvbW1lbnRzPC9hPi48L3A+CisKKzxwPkEgbGlzdCBvZiBjdXJyZW50IFczQyBSZWNvbW1lbmRhdGlvbnMgYW5kIG90aGVyIHRlY2huaWNhbCBkb2N1bWVudHMKK2NhbiBiZSBmb3VuZCBhdCA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUiI+aHR0cDovL3d3dy53My5vcmcvVFI8L2E+LjwvcD4KKworPHA+VGhlIFdvcmtpbmcgR3JvdXAgZXhwZWN0cyBhZGRpdGlvbmFsIG1lY2hhbmlzbXMgZm9yIGxpbmtpbmcgc3R5bGUKK3NoZWV0cyB0byBYTUwgZG9jdW1lbnQgdG8gYmUgZGVmaW5lZCBpbiBhIGZ1dHVyZSBzcGVjaWZpY2F0aW9uLjwvcD4KKworPHA+VGhlIHVzZSBvZiBYTUwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMgaW4gdGhpcyBzcGVjaWZpY2F0aW9uIHNob3VsZAorbm90IGJlIHRha2VuIGFzIGEgcHJlY2VkZW50LiAgVGhlIFczQyBkb2VzIG5vdCBhbnRpY2lwYXRlIHJlY29tbWVuZGluZwordGhlIHVzZSBvZiBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBpbiBhbnkgZnV0dXJlIHNwZWNpZmljYXRpb24uICBUaGUKKzxhIGhyZWY9IiNyYXRpb25hbGUiPlJhdGlvbmFsZTwvYT4gZXhwbGFpbnMgd2h5IHRoZXkgd2VyZSB1c2VkIGluCit0aGlzIHNwZWNpZmljYXRpb24uPC9wPgorCis8cD5UaGlzIGRvY3VtZW50IHdhcyBwcm9kdWNlZCBhcyBwYXJ0IG9mIHRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvQWN0aXZpdHkiPlczQyBYTUwgQWN0aXZpdHk8L2E+LjwvcD4KKworCis8aDI+Cis8YSBuYW1lPSJjb250ZW50cyI+VGFibGUgb2YgY29udGVudHM8L2E+Cis8L2gyPjEgPGEgaHJlZj0iI1RoZSB4bWwtc3R5bGVzaGVldCBwcm9jZXNzaW5nIGluc3RydWN0aW9uIj5UaGUgeG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjwvYT4KKzxicj4KKzxoMz5BcHBlbmRpY2VzPC9oMz5BIDxhIGhyZWY9IiNSZWZlcmVuY2VzIj5SZWZlcmVuY2VzPC9hPgorPGJyPkIgPGEgaHJlZj0iI3JhdGlvbmFsZSI+UmF0aW9uYWxlPC9hPgorPGJyPgorPGhyPgorCis8aDI+Cis8YSBuYW1lPSJUaGUgeG1sLXN0eWxlc2hlZXQgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiI+PC9hPjEgVGhlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBwcm9jZXNzaW5nIGluc3RydWN0aW9uPC9oMj4KKworPHA+U3R5bGUgU2hlZXRzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW4gWE1MPGEgaHJlZj0iI1hNTCI+W1hNTDEwXTwvYT4KK2RvY3VtZW50IGJ5IHVzaW5nIGEgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiB3aG9zZSB0YXJnZXQgaXMKKzxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPi4gIFRoaXMgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBmb2xsb3dzIHRoZQorYmVoYXZpb3VyIG9mIHRoZSBIVE1MIDQuMCA8Y29kZT4mbHQ7TElOSworUkVMPSJzdHlsZXNoZWV0IiZndDs8L2NvZGU+PGEgaHJlZj0iI0hUTUwiPltIVE1MNDBdPC9hPi48L3A+CisKKzxwPlRoZSA8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbiBpcyBwYXJzZWQgaW4KK3RoZSBzYW1lIHdheSBhcyBhIHN0YXJ0LXRhZywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgZW50aXRpZXMgb3RoZXIKK3RoYW4gcHJlZGVmaW5lZCBlbnRpdGllcyBtdXN0IG5vdCBiZSByZWZlcmVuY2VkLjwvcD4KKworPHA+VGhlIGZvbGxvd2luZyBncmFtbWFyIGlzIGdpdmVuIHVzaW5nIHRoZSBzYW1lIG5vdGF0aW9uIGFzIHRoZQorZ3JhbW1hciBpbiB0aGUgWE1MIFJlY29tbWVuZGF0aW9uPGEgaHJlZj0iI1hNTCI+W1hNTDEwXTwvYT4uICBTeW1ib2xzIGluIHRoZQorZ3JhbW1hciB0aGF0IGFyZSBub3QgZGVmaW5lZCBoZXJlIGFyZSBkZWZpbmVkIGluIHRoZSBYTUwKK1JlY29tbWVuZGF0aW9uLjwvcD4KKworPGg1PnhtbC1zdHlsZXNoZWV0IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb248L2g1PgorPHRhYmxlIGNsYXNzPSJzY3JhcCI+Cis8dGJvZHk+Cis8dHIgdmFsaWduPSJiYXNlbGluZSI+Cis8dGQ+Cis8YSBuYW1lPSJOVC1TdHlsZVNoZWV0UEkiPjwvYT5bMV0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPgorPHRkPlN0eWxlU2hlZXRQSTwvdGQ+Cis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4KKzx0ZD4nJmx0Oz94bWwtc3R5bGVzaGVldCcgKDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtUyI+UzwvYT4gPGEgaHJlZj0iI05ULVBzZXVkb0F0dCI+UHNldWRvQXR0PC9hPikqIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtUyI+UzwvYT4/ICc/Jmd0Oyc8L3RkPgorPHRkPgorPC90ZD4KKzwvdHI+Cis8dHIgdmFsaWduPSJiYXNlbGluZSI+Cis8dGQ+Cis8YSBuYW1lPSJOVC1Qc2V1ZG9BdHQiPjwvYT5bMl0mbmJzcDsmbmJzcDsmbmJzcDs8L3RkPgorPHRkPlBzZXVkb0F0dDwvdGQ+Cis8dGQ+Jm5ic3A7Jm5ic3A7Jm5ic3A7Ojo9Jm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4KKzx0ZD4KKzxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtTmFtZSI+TmFtZTwvYT4gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1TIj5TPC9hPj8gJz0nIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtUyI+UzwvYT4/IDxhIGhyZWY9IiNOVC1Qc2V1ZG9BdHRWYWx1ZSI+UHNldWRvQXR0VmFsdWU8L2E+Cis8L3RkPgorPHRkPgorPC90ZD4KKzwvdHI+Cis8dHIgdmFsaWduPSJiYXNlbGluZSI+Cis8dGQ+Cis8YSBuYW1lPSJOVC1Qc2V1ZG9BdHRWYWx1ZSI+PC9hPlszXSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+Cis8dGQ+UHNldWRvQXR0VmFsdWU8L3RkPgorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+Cis8dGQ+KCciJyAoW14iJmx0OyZhbXA7XSB8IDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtQ2hhclJlZiI+Q2hhclJlZjwvYT4gfCA8YSBocmVmPSIjTlQtUHJlZGVmRW50aXR5UmVmIj5QcmVkZWZFbnRpdHlSZWY8L2E+KSogJyInPC90ZD4KKzx0ZD4KKzwvdGQ+Cis8L3RyPgorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPgorPHRkPgorPC90ZD4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8L3RkPgorPHRkPnwgIiciIChbXicmbHQ7JmFtcDtdIHwgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1DaGFyUmVmIj5DaGFyUmVmPC9hPiB8IDxhIGhyZWY9IiNOVC1QcmVkZWZFbnRpdHlSZWYiPlByZWRlZkVudGl0eVJlZjwvYT4pKiAiJyIpPC90ZD4KKzx0ZD4KKzwvdGQ+Cis8L3RyPgorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPgorPHRkPgorPC90ZD4KKzx0ZD4KKzwvdGQ+Cis8dGQ+Cis8L3RkPgorPHRkPi0gKDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy14bWwjTlQtQ2hhciI+Q2hhcjwvYT4qICc/Jmd0OycgPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCNOVC1DaGFyIj5DaGFyPC9hPiopPC90ZD4KKzx0ZD4KKzwvdGQ+Cis8L3RyPgorPHRyIHZhbGlnbj0iYmFzZWxpbmUiPgorPHRkPgorPGEgbmFtZT0iTlQtUHJlZGVmRW50aXR5UmVmIj48L2E+WzRdJm5ic3A7Jm5ic3A7Jm5ic3A7PC90ZD4KKzx0ZD5QcmVkZWZFbnRpdHlSZWY8L3RkPgorPHRkPiZuYnNwOyZuYnNwOyZuYnNwOzo6PSZuYnNwOyZuYnNwOyZuYnNwOzwvdGQ+Cis8dGQ+JyZhbXA7YW1wOycgfCAnJmFtcDtsdDsnIHwgJyZhbXA7Z3Q7JyB8ICcmYW1wO3F1b3Q7JyB8ICcmYW1wO2Fwb3M7JzwvdGQ+Cis8dGQ+Cis8L3RkPgorPC90cj4KKzwvdGJvZHk+Cis8L3RhYmxlPgorCis8cD5JbiA8YSBocmVmPSIjTlQtUHNldWRvQXR0VmFsdWUiPlBzZXVkb0F0dFZhbHVlPC9hPiwgYSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMteG1sI05ULUNoYXJSZWYiPkNoYXJSZWY8L2E+IG9yIGEgPGEgaHJlZj0iI05ULVByZWRlZkVudGl0eVJlZiI+UHJlZGVmRW50aXR5UmVmPC9hPiBpcyBpbnRlcnByZXRlZCBpbiB0aGUKK3NhbWUgbWFubmVyIGFzIGluIGEgbm9ybWFsIFhNTCBhdHRyaWJ1dGUgdmFsdWUuICBUaGUgYWN0dWFsIHZhbHVlIG9mCit0aGUgcHNldWRvLWF0dHJpYnV0ZSBpcyB0aGUgdmFsdWUgYWZ0ZXIgZWFjaCByZWZlcmVuY2UgaXMgcmVwbGFjZWQgYnkKK3RoZSBjaGFyYWN0ZXIgaXQgcmVmZXJlbmNlcy4gIFRoaXMgcmVwbGFjZW1lbnQgaXMgbm90IHBlcmZvcm1lZAorYXV0b21hdGljYWxseSBieSBhbiBYTUwgcHJvY2Vzc29yLjwvcD4KKworPHA+VGhlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGlzIGFsbG93ZWQKK29ubHkgaW4gdGhlIHByb2xvZyBvZiBhbiBYTUwgZG9jdW1lbnQuIFRoZSBzeW50YXggb2YgWE1MIGNvbnN0cmFpbnMKK3doZXJlIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBhbGxvd2VkIGluIHRoZSBwcm9sb2c7IHRoZQorPGNvZGU+eG1sLXN0eWxlc2hlZXQ8L2NvZGU+IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gaXMgYWxsb3dlZCBhbnl3aGVyZQoraW4gdGhlIHByb2xvZyB0aGF0IG1lZXRzIHRoZXNlIGNvbnN0cmFpbnRzLjwvcD4KKworPGJsb2NrcXVvdGU+Cis8Yj5OT1RFOiA8L2I+SWYgdGhlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBwcm9jZXNzaW5nIGluc3RydWN0aW9uCitvY2N1cnMgaW4gdGhlIGV4dGVybmFsIERURCBzdWJzZXQgb3IgaW4gYSBwYXJhbWV0ZXIgZW50aXR5LCBpdCBpcworcG9zc2libGUgdGhhdCBpdCBtYXkgbm90IGJlIHByb2Nlc3NlZCBieSBhIG5vbi12YWxpZGF0aW5nIFhNTAorcHJvY2Vzc29yIChzZWUgPGEgaHJlZj0iI1hNTCI+W1hNTDEwXTwvYT4pLjwvYmxvY2txdW90ZT4KKworPHA+VGhlIGZvbGxvd2luZyBwc2V1ZG8gYXR0cmlidXRlcyBhcmUgZGVmaW5lZDwvcD4KKworPHByZT5ocmVmIENEQVRBICNSRVFVSVJFRAordHlwZSBDREFUQSAjUkVRVUlSRUQKK3RpdGxlIENEQVRBICNJTVBMSUVECittZWRpYSBDREFUQSAjSU1QTElFRAorY2hhcnNldCBDREFUQSAjSU1QTElFRAorYWx0ZXJuYXRlICh5ZXN8bm8pICJubyI8L3ByZT4KKworPHA+VGhlIHNlbWFudGljcyBvZiB0aGUgcHNldWRvLWF0dHJpYnV0ZXMgYXJlIGV4YWN0bHkgYXMgd2l0aAorPGNvZGU+Jmx0O0xJTksgUkVMPSJzdHlsZXNoZWV0IiZndDs8L2NvZGU+IGluIEhUTUwgNC4wLCB3aXRoIHRoZQorZXhjZXB0aW9uIG9mIHRoZSA8Y29kZT5hbHRlcm5hdGU8L2NvZGU+IHBzZXVkby1hdHRyaWJ1dGUuICBJZgorPGNvZGU+YWx0ZXJuYXRlPSJ5ZXMiPC9jb2RlPiBpcyBzcGVjaWZpZWQsIHRoZW4gdGhlIHByb2Nlc3NpbmcKK2luc3RydWN0aW9uIGhhcyB0aGUgc2VtYW50aWNzIG9mIDxjb2RlPiZsdDtMSU5LIFJFTD0iYWx0ZXJuYXRlCitzdHlsZXNoZWV0IiZndDs8L2NvZGU+IGluc3RlYWQgb2YgPGNvZGU+Jmx0O0xJTksKK1JFTD0ic3R5bGVzaGVldCImZ3Q7PC9jb2RlPi48L3A+CisKKzxibG9ja3F1b3RlPgorPGI+Tk9URTogPC9iPlNpbmNlIHRoZSB2YWx1ZSBvZiB0aGUgPGNvZGU+aHJlZjwvY29kZT4gYXR0cmlidXRlIGlzIGEgVVJJCityZWZlcmVuY2UsIGl0IG1heSBiZSBhIHJlbGF0aXZlIFVSSSBhbmQgaXQgbWF5IGNvbnRhaW4gYSBmcmFnbWVudAoraWRlbnRpZmllci4gSW4gcGFydGljdWxhciB0aGUgVVJJIHJlZmVyZW5jZSBtYXkgY29udGFpbiBvbmx5IGEKK2ZyYWdtZW50IGlkZW50aWZpZXIuICBTdWNoIGEgVVJJIHJlZmVyZW5jZSBpcyBhIHJlZmVyZW5jZSB0byBhIHBhcnQgb2YKK3RoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSA8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4gcHJvY2Vzc2luZworaW5zdHJ1Y3Rpb24gKHNlZSA8YSBocmVmPSIjUkZDMjM5NiI+W1JGQzIzOTZdPC9hPikuIFRoZSBjb25zZXF1ZW5jZSBpcyB0aGF0IHRoZQorPGNvZGU+eG1sLXN0eWxlc2hlZXQ8L2NvZGU+IHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gYWxsb3dzIHN0eWxlIHNoZWV0cwordG8gYmUgZW1iZWRkZWQgaW4gdGhlIHNhbWUgZG9jdW1lbnQgYXMgdGhlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPgorcHJvY2Vzc2luZyBpbnN0cnVjdGlvbi48L2Jsb2NrcXVvdGU+CisKKzxwPkluIHNvbWUgY2FzZXMsIHN0eWxlIHNoZWV0cyBtYXkgYmUgbGlua2VkIHdpdGggYW4gWE1MIGRvY3VtZW50IGJ5CittZWFucyBleHRlcm5hbCB0byB0aGUgZG9jdW1lbnQuIEZvciBleGFtcGxlLCBlYXJsaWVyIHZlcnNpb25zIG9mIEhUVFAKKzxhIGhyZWY9IiNSRkMyMDY4Ij5bUkZDMjA2OF08L2E+IChzZWN0aW9uIDE5LjYuMi40KSBhbGxvd2VkIHN0eWxlIHNoZWV0cyB0byBiZQorYXNzb2NpYXRlZCB3aXRoIFhNTCBkb2N1bWVudHMgYnkgbWVhbnMgb2YgdGhlIDxjb2RlPkxpbms8L2NvZGU+CitoZWFkZXIuICBBbnkgbGlua3MgdG8gc3R5bGUgc2hlZXRzIHRoYXQgYXJlIHNwZWNpZmllZCBleHRlcm5hbGx5IHRvIHRoZQorZG9jdW1lbnQgYXJlIGNvbnNpZGVyZWQgdG8gb2NjdXIgYmVmb3JlIHRoZSBsaW5rcyBzcGVjaWZpZWQgYnkgdGhlCis8Y29kZT54bWwtc3R5bGVzaGVldDwvY29kZT4gcHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMuICBUaGlzIGlzIHRoZSBzYW1lCithcyBpbiBIVE1MIDQuMCAoc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL1JFQy1odG1sNDAvcHJlc2VudC9zdHlsZXMuaHRtbCNoLTE0LjYiPnNlY3Rpb24KKzE0LjY8L2E+KS48L3A+CisKKzxwPkhlcmUgYXJlIHNvbWUgZXhhbXBsZXMgZnJvbSBIVE1MIDQuMCB3aXRoIHRoZSBjb3JyZXNwb25kaW5nCitwcm9jZXNzaW5nIGluc3RydWN0aW9uOjwvcD4KKworPHByZT4mbHQ7TElOSyBocmVmPSJteXN0eWxlLmNzcyIgcmVsPSJzdHlsZSBzaGVldCIgdHlwZT0idGV4dC9jc3MiJmd0OworJmx0Oz94bWwtc3R5bGVzaGVldCBocmVmPSJteXN0eWxlLmNzcyIgdHlwZT0idGV4dC9jc3MiPyZndDsKKworJmx0O0xJTksgaHJlZj0ibXlzdHlsZS5jc3MiIHRpdGxlPSJDb21wYWN0IiByZWw9InN0eWxlc2hlZXQiCit0eXBlPSJ0ZXh0L2NzcyImZ3Q7CismbHQ7P3htbC1zdHlsZXNoZWV0IGhyZWY9Im15c3R5bGUuY3NzIiB0aXRsZT0iQ29tcGFjdCIgdHlwZT0idGV4dC9jc3MiPyZndDsKKworJmx0O0xJTksgaHJlZj0ibXlzdHlsZS5jc3MiIHRpdGxlPSJNZWRpdW0iIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiCit0eXBlPSJ0ZXh0L2NzcyImZ3Q7CismbHQ7P3htbC1zdHlsZXNoZWV0IGFsdGVybmF0ZT0ieWVzIiBocmVmPSJteXN0eWxlLmNzcyIgdGl0bGU9Ik1lZGl1bSIKK3R5cGU9InRleHQvY3NzIj8mZ3Q7PC9wcmU+CisKKzxwPk11bHRpcGxlIDxjb2RlPnhtbC1zdHlsZXNoZWV0PC9jb2RlPiBwcm9jZXNzaW5nIGluc3RydWN0aW9ucyBhcmUKK2Fsc28gYWxsb3dlZCB3aXRoIGV4YWN0bHkgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHdpdGggPGNvZGU+TElOSworUkVMPSJzdHlsZXNoZWV0IjwvY29kZT4uIEZvciBleGFtcGxlLDwvcD4KKworPHByZT4mbHQ7TElOSyByZWw9ImFsdGVybmF0ZSBzdHlsZXNoZWV0IiB0aXRsZT0iY29tcGFjdCIgaHJlZj0ic21hbGwtYmFzZS5jc3MiCit0eXBlPSJ0ZXh0L2NzcyImZ3Q7CismbHQ7TElOSyByZWw9ImFsdGVybmF0ZSBzdHlsZXNoZWV0IiB0aXRsZT0iY29tcGFjdCIgaHJlZj0ic21hbGwtZXh0cmFzLmNzcyIKK3R5cGU9InRleHQvY3NzIiZndDsKKyZsdDtMSU5LIHJlbD0iYWx0ZXJuYXRlIHN0eWxlc2hlZXQiIHRpdGxlPSJiaWcgcHJpbnQiIGhyZWY9ImJpZ3ByaW50LmNzcyIKK3R5cGU9InRleHQvY3NzIiZndDsKKyZsdDtMSU5LIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiJmd0OzwvcHJlPgorCis8cD53b3VsZCBiZSBlcXVpdmFsZW50IHRvOjwvcD4KKworPHByZT4mbHQ7P3htbC1zdHlsZXNoZWV0IGFsdGVybmF0ZT0ieWVzIiB0aXRsZT0iY29tcGFjdCIgaHJlZj0ic21hbGwtYmFzZS5jc3MiCit0eXBlPSJ0ZXh0L2NzcyI/Jmd0OworJmx0Oz94bWwtc3R5bGVzaGVldCBhbHRlcm5hdGU9InllcyIgdGl0bGU9ImNvbXBhY3QiIGhyZWY9InNtYWxsLWV4dHJhcy5jc3MiCit0eXBlPSJ0ZXh0L2NzcyI/Jmd0OworJmx0Oz94bWwtc3R5bGVzaGVldCBhbHRlcm5hdGU9InllcyIgdGl0bGU9ImJpZyBwcmludCIgaHJlZj0iYmlncHJpbnQuY3NzIgordHlwZT0idGV4dC9jc3MiPyZndDsKKyZsdDs/eG1sLXN0eWxlc2hlZXQgaHJlZj0iY29tbW9uLmNzcyIgdHlwZT0idGV4dC9jc3MiPyZndDs8L3ByZT4KKworCisKKzxociB0aXRsZT0iU2VwYXJhdG9yIGZyb20gZm9vdGVyIj4KKworPGgyPgorPGEgbmFtZT0iUmVmZXJlbmNlcyI+PC9hPkEgUmVmZXJlbmNlczwvaDI+CisKKzxkbD4KKworPGR0PgorPGEgbmFtZT0iSFRNTCI+SFRNTDQwPC9hPgorPC9kdD4KKzxkZD5Xb3JsZCBXaWRlIFdlYgorQ29uc29ydGl1bS4gPGk+SFRNTCA0LjAgU3BlY2lmaWNhdGlvbi48L2k+IFczQyBSZWNvbW1lbmRhdGlvbi4gU2VlCis8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwIj5odHRwOi8vd3d3LnczLm9yZy9UUi9SRUMtaHRtbDQwPC9hPgorPC9kZD4KKworPGR0PgorPGEgbmFtZT0iUkZDMjA2OCI+UkZDMjA2ODwvYT4KKzwvZHQ+Cis8ZGQ+Ui4gRmllbGRpbmcsIEouIEdldHR5cywgSi4gTW9ndWwsCitILiBGcnlzdHlrIE5pZWxzZW4sIGFuZCBULiBCZXJuZXJzLUxlZS4gIDxpPkh5cGVydGV4dCBUcmFuc2ZlcgorUHJvdG9jb2wgLS0gSFRUUC8xLjEuPC9pPi4gSUVURiBSRkMgMjA2OC4gU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNjgudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDY4LnR4dDwvYT4uPC9kZD4KKworPGR0PgorPGEgbmFtZT0iUkZDMjM5NiI+UkZDMjM5NjwvYT4KKzwvZHQ+Cis8ZGQ+VC4gQmVybmVycy1MZWUsIFIuIEZpZWxkaW5nLCBhbmQKK0wuIE1hc2ludGVyLiAgPGk+VW5pZm9ybSBSZXNvdXJjZSBJZGVudGlmaWVycyAoVVJJKTogR2VuZXJpYworU3ludGF4PC9pPi4gSUVURiBSRkMgMjM5Ni4gU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzOTYudHh0Ij5odHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzk2LnR4dDwvYT4uPC9kZD4KKworPGR0PgorPGEgbmFtZT0iWE1MIj5YTUwxMDwvYT4KKzwvZHQ+Cis8ZGQ+V29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bS4gPGk+RXh0ZW5zaWJsZQorTWFya3VwIExhbmd1YWdlIChYTUwpIDEuMC48L2k+IFczQyBSZWNvbW1lbmRhdGlvbi4gU2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSLzE5OTgvUkVDLXhtbC0xOTk4MDIxMCI+aHR0cDovL3d3dy53My5vcmcvVFIvMTk5OC9SRUMteG1sLTE5OTgwMjEwPC9hPgorPC9kZD4KKworPC9kbD4KKworCisKKworPGgyPgorPGEgbmFtZT0icmF0aW9uYWxlIj48L2E+QiBSYXRpb25hbGU8L2gyPgorCis8cD5UaGVyZSB3YXMgYW4gdXJnZW50IHJlcXVpcmVtZW50IGZvciBhIHNwZWNpZmljYXRpb24gZm9yIHN0eWxlIHNoZWV0CitsaW5raW5nIHRoYXQgY291bGQgYmUgY29tcGxldGVkIGluIHRpbWUgZm9yIHRoZSBuZXh0IHJlbGVhc2UgZnJvbQorbWFqb3IgYnJvd3NlciB2ZW5kb3JzLiAgT25seSBieSBjaG9vc2luZyBhIHNpbXBsZSBtZWNoYW5pc20gY2xvc2VseQorYmFzZWQgb24gYSBwcm92ZW4gZXhpc3RpbmcgbWVjaGFuaXNtIGNvdWxkIHRoZSBzcGVjaWZpY2F0aW9uIGJlCitjb21wbGV0ZWQgaW4gdGltZSB0byBtZWV0IHRoaXMgcmVxdWlyZW1lbnQuPC9wPgorCis8cD5Vc2Ugb2YgYSBwcm9jZXNzaW5nIGluc3RydWN0aW9uIGF2b2lkcyBwb2xsdXRpbmcgdGhlIG1haW4gZG9jdW1lbnQKK3N0cnVjdHVyZSB3aXRoIGFwcGxpY2F0aW9uIHNwZWNpZmljIHByb2Nlc3NpbmcgaW5mb3JtYXRpb24uPC9wPgorCis8cD5UaGUgbWVjaGFuaXNtIGNob3NlbiBmb3IgdGhpcyB2ZXJzaW9uIG9mIHRoZSBzcGVjaWZpY2F0aW9uIGlzIG5vdCBhCitjb25zdHJhaW50IG9uIHRoZSBhZGRpdGlvbmFsIG1lY2hhbmlzbXMgcGxhbm5lZCBmb3IgZnV0dXJlIHZlcnNpb25zLgorVGhlcmUgaXMgbm8gZXhwZWN0YXRpb24gdGhhdCB0aGVzZSB3aWxsIHVzZSBwcm9jZXNzaW5nIGluc3RydWN0aW9uczsKK2luZGVlZCB0aGV5IG1heSBub3QgaW5jbHVkZSB0aGUgbGlua2luZyBpbmZvcm1hdGlvbiBpbiB0aGUgc291cmNlCitkb2N1bWVudC48L3A+CisKKworCisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3NhbXBsZXMvZGF0YS94bWxkc2lnLWNvcmUtc2NoZW1hLnhzZCBiL3NhbXBsZXMvZGF0YS94bWxkc2lnLWNvcmUtc2NoZW1hLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjEyNmIzCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9kYXRhL3htbGRzaWctY29yZS1zY2hlbWEueHNkCkBAIC0wLDAgKzEsMzE4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCFET0NUWVBFIHNjaGVtYQorICBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNjaGVtYSAyMDAxMDIvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEuZHRkIgorIFsKKyAgIDwhQVRUTElTVCBzY2hlbWEgCisgICAgIHhtbG5zOmRzIENEQVRBICNGSVhFRCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgICA8IUVOVElUWSBkc2lnICdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz4KKyAgIDwhRU5USVRZICUgcCAnJz4KKyAgIDwhRU5USVRZICUgcyAnJz4KKyAgXT4KKworPCEtLSBTY2hlbWEgZm9yIFhNTCBTaWduYXR1cmVzCisgICAgaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIworICAgICRSZXZpc2lvbjogMS4xICQgb24gJERhdGU6IDIwMDIvMDIvMDggMjA6MzI6MjYgJCBieSAkQXV0aG9yOiByZWFnbGUgJAorCisgICAgQ29weXJpZ2h0IDIwMDEgVGhlIEludGVybmV0IFNvY2lldHkgYW5kIFczQyAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUKKyAgICBvZiBUZWNobm9sb2d5LCBJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuCisgICAgQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgICAgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KKworICAgIFRoaXMgZG9jdW1lbnQgaXMgZ292ZXJuZWQgYnkgdGhlIFczQyBTb2Z0d2FyZSBMaWNlbnNlIFsxXSBhcyBkZXNjcmliZWQKKyAgICBpbiB0aGUgRkFRIFsyXS4KKworICAgIFsxXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL2NvcHlyaWdodC1zb2Z0d2FyZS0xOTk4MDcyMAorICAgIFsyXSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsL0lQUi1GQVEtMjAwMDA2MjAuaHRtbCNEVEQKKy0tPgorCisKKzxzY2hlbWEgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICAgICB4bWxuczpkcz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIKKyAgICAgICAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIgorICAgICAgICB2ZXJzaW9uPSIwLjEiIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4gCisKKzwhLS0gQmFzaWMgVHlwZXMgRGVmaW5lZCBmb3IgU2lnbmF0dXJlcyAtLT4KKworPHNpbXBsZVR5cGUgbmFtZT0iQ3J5cHRvQmluYXJ5Ij4KKyAgPHJlc3RyaWN0aW9uIGJhc2U9ImJhc2U2NEJpbmFyeSI+CisgIDwvcmVzdHJpY3Rpb24+Cis8L3NpbXBsZVR5cGU+CisKKzwhLS0gU3RhcnQgU2lnbmF0dXJlIC0tPgorCis8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmUiIHR5cGU9ImRzOlNpZ25hdHVyZVR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVUeXBlIj4KKyAgPHNlcXVlbmNlPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25lZEluZm8iLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVWYWx1ZSIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOktleUluZm8iIG1pbk9jY3Vycz0iMCIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOk9iamVjdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAKKyAgPC9zZXF1ZW5jZT4gIAorICA8YXR0cmlidXRlIG5hbWU9IklkIiB0eXBlPSJJRCIgdXNlPSJvcHRpb25hbCIvPgorPC9jb21wbGV4VHlwZT4KKworICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVWYWx1ZSIgdHlwZT0iZHM6U2lnbmF0dXJlVmFsdWVUeXBlIi8+IAorICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlVmFsdWVUeXBlIj4KKyAgICA8c2ltcGxlQ29udGVudD4KKyAgICAgIDxleHRlbnNpb24gYmFzZT0iYmFzZTY0QmluYXJ5Ij4KKyAgICAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4KKyAgICAgIDwvZXh0ZW5zaW9uPgorICAgIDwvc2ltcGxlQ29udGVudD4KKyAgPC9jb21wbGV4VHlwZT4KKworPCEtLSBTdGFydCBTaWduZWRJbmZvIC0tPgorCis8ZWxlbWVudCBuYW1lPSJTaWduZWRJbmZvIiB0eXBlPSJkczpTaWduZWRJbmZvVHlwZSIvPgorPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25lZEluZm9UeXBlIj4KKyAgPHNlcXVlbmNlPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOkNhbm9uaWNhbGl6YXRpb25NZXRob2QiLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpTaWduYXR1cmVNZXRob2QiLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpSZWZlcmVuY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+IAorICA8L3NlcXVlbmNlPiAgCisgIDxhdHRyaWJ1dGUgbmFtZT0iSWQiIHR5cGU9IklEIiB1c2U9Im9wdGlvbmFsIi8+IAorPC9jb21wbGV4VHlwZT4KKworICA8ZWxlbWVudCBuYW1lPSJDYW5vbmljYWxpemF0aW9uTWV0aG9kIiB0eXBlPSJkczpDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSIvPiAKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IkNhbm9uaWNhbGl6YXRpb25NZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGFueSBuYW1lc3BhY2U9IiMjYW55IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8IS0tICgwLHVuYm91bmRlZCkgZWxlbWVudHMgZnJvbSAoMSwxKSBuYW1lc3BhY2UgLS0+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAorICA8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IlNpZ25hdHVyZU1ldGhvZCIgdHlwZT0iZHM6U2lnbmF0dXJlTWV0aG9kVHlwZSIvPgorICA8Y29tcGxleFR5cGUgbmFtZT0iU2lnbmF0dXJlTWV0aG9kVHlwZSIgbWl4ZWQ9InRydWUiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9IkhNQUNPdXRwdXRMZW5ndGgiIG1pbk9jY3Vycz0iMCIgdHlwZT0iZHM6SE1BQ091dHB1dExlbmd0aFR5cGUiLz4KKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8IS0tICgwLHVuYm91bmRlZCkgZWxlbWVudHMgZnJvbSAoMSwxKSBleHRlcm5hbCBuYW1lc3BhY2UgLS0+CisgICAgPC9zZXF1ZW5jZT4KKyAgICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAorICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIFN0YXJ0IFJlZmVyZW5jZSAtLT4KKworPGVsZW1lbnQgbmFtZT0iUmVmZXJlbmNlIiB0eXBlPSJkczpSZWZlcmVuY2VUeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iUmVmZXJlbmNlVHlwZSI+CisgIDxzZXF1ZW5jZT4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpUcmFuc2Zvcm1zIiBtaW5PY2N1cnM9IjAiLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpEaWdlc3RNZXRob2QiLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpEaWdlc3RWYWx1ZSIvPiAKKyAgPC9zZXF1ZW5jZT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCisgIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiIHVzZT0ib3B0aW9uYWwiLz4gCisgIDxhdHRyaWJ1dGUgbmFtZT0iVHlwZSIgdHlwZT0iYW55VVJJIiB1c2U9Im9wdGlvbmFsIi8+IAorPC9jb21wbGV4VHlwZT4KKworICA8ZWxlbWVudCBuYW1lPSJUcmFuc2Zvcm1zIiB0eXBlPSJkczpUcmFuc2Zvcm1zVHlwZSIvPgorICA8Y29tcGxleFR5cGUgbmFtZT0iVHJhbnNmb3Jtc1R5cGUiPgorICAgIDxzZXF1ZW5jZT4KKyAgICAgIDxlbGVtZW50IHJlZj0iZHM6VHJhbnNmb3JtIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAgCisgICAgPC9zZXF1ZW5jZT4KKyAgPC9jb21wbGV4VHlwZT4KKworICA8ZWxlbWVudCBuYW1lPSJUcmFuc2Zvcm0iIHR5cGU9ImRzOlRyYW5zZm9ybVR5cGUiLz4KKyAgPGNvbXBsZXhUeXBlIG5hbWU9IlRyYW5zZm9ybVR5cGUiIG1peGVkPSJ0cnVlIj4KKyAgICA8Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPiAKKyAgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgPCEtLSAoMSwxKSBlbGVtZW50cyBmcm9tICgwLHVuYm91bmRlZCkgbmFtZXNwYWNlcyAtLT4KKyAgICAgIDxlbGVtZW50IG5hbWU9IlhQYXRoIiB0eXBlPSJzdHJpbmciLz4gCisgICAgPC9jaG9pY2U+CisgICAgPGF0dHJpYnV0ZSBuYW1lPSJBbGdvcml0aG0iIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiAKKyAgPC9jb21wbGV4VHlwZT4KKworPCEtLSBFbmQgUmVmZXJlbmNlIC0tPgorCis8ZWxlbWVudCBuYW1lPSJEaWdlc3RNZXRob2QiIHR5cGU9ImRzOkRpZ2VzdE1ldGhvZFR5cGUiLz4KKzxjb21wbGV4VHlwZSBuYW1lPSJEaWdlc3RNZXRob2RUeXBlIiBtaXhlZD0idHJ1ZSI+IAorICA8c2VxdWVuY2U+CisgICAgPGFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgIDwvc2VxdWVuY2U+ICAgIAorICA8YXR0cmlidXRlIG5hbWU9IkFsZ29yaXRobSIgdHlwZT0iYW55VVJJIiB1c2U9InJlcXVpcmVkIi8+IAorPC9jb21wbGV4VHlwZT4KKworPGVsZW1lbnQgbmFtZT0iRGlnZXN0VmFsdWUiIHR5cGU9ImRzOkRpZ2VzdFZhbHVlVHlwZSIvPgorPHNpbXBsZVR5cGUgbmFtZT0iRGlnZXN0VmFsdWVUeXBlIj4KKyAgPHJlc3RyaWN0aW9uIGJhc2U9ImJhc2U2NEJpbmFyeSIvPgorPC9zaW1wbGVUeXBlPgorCis8IS0tIEVuZCBTaWduZWRJbmZvIC0tPgorCis8IS0tIFN0YXJ0IEtleUluZm8gLS0+CisKKzxlbGVtZW50IG5hbWU9IktleUluZm8iIHR5cGU9ImRzOktleUluZm9UeXBlIi8+IAorPGNvbXBsZXhUeXBlIG5hbWU9IktleUluZm9UeXBlIiBtaXhlZD0idHJ1ZSI+CisgIDxjaG9pY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPiAgICAgCisgICAgPGVsZW1lbnQgcmVmPSJkczpLZXlOYW1lIi8+IAorICAgIDxlbGVtZW50IHJlZj0iZHM6S2V5VmFsdWUiLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpSZXRyaWV2YWxNZXRob2QiLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpYNTA5RGF0YSIvPiAKKyAgICA8ZWxlbWVudCByZWY9ImRzOlBHUERhdGEiLz4gCisgICAgPGVsZW1lbnQgcmVmPSJkczpTUEtJRGF0YSIvPgorICAgIDxlbGVtZW50IHJlZj0iZHM6TWdtdERhdGEiLz4KKyAgICA8YW55IHByb2Nlc3NDb250ZW50cz0ibGF4IiBuYW1lc3BhY2U9IiMjb3RoZXIiLz4KKyAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDAsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgorICA8L2Nob2ljZT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCis8L2NvbXBsZXhUeXBlPgorCisgIDxlbGVtZW50IG5hbWU9IktleU5hbWUiIHR5cGU9InN0cmluZyIvPgorICA8ZWxlbWVudCBuYW1lPSJNZ210RGF0YSIgdHlwZT0ic3RyaW5nIi8+CisKKyAgPGVsZW1lbnQgbmFtZT0iS2V5VmFsdWUiIHR5cGU9ImRzOktleVZhbHVlVHlwZSIvPiAKKyAgPGNvbXBsZXhUeXBlIG5hbWU9IktleVZhbHVlVHlwZSIgbWl4ZWQ9InRydWUiPgorICAgPGNob2ljZT4KKyAgICAgPGVsZW1lbnQgcmVmPSJkczpEU0FLZXlWYWx1ZSIvPgorICAgICA8ZWxlbWVudCByZWY9ImRzOlJTQUtleVZhbHVlIi8+CisgICAgIDxhbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgPC9jaG9pY2U+CisgIDwvY29tcGxleFR5cGU+CisKKyAgPGVsZW1lbnQgbmFtZT0iUmV0cmlldmFsTWV0aG9kIiB0eXBlPSJkczpSZXRyaWV2YWxNZXRob2RUeXBlIi8+IAorICA8Y29tcGxleFR5cGUgbmFtZT0iUmV0cmlldmFsTWV0aG9kVHlwZSI+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgcmVmPSJkczpUcmFuc2Zvcm1zIiBtaW5PY2N1cnM9IjAiLz4gCisgICAgPC9zZXF1ZW5jZT4gIAorICAgIDxhdHRyaWJ1dGUgbmFtZT0iVVJJIiB0eXBlPSJhbnlVUkkiLz4KKyAgICA8YXR0cmlidXRlIG5hbWU9IlR5cGUiIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPgorICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIFN0YXJ0IFg1MDlEYXRhIC0tPgorCis8ZWxlbWVudCBuYW1lPSJYNTA5RGF0YSIgdHlwZT0iZHM6WDUwOURhdGFUeXBlIi8+IAorPGNvbXBsZXhUeXBlIG5hbWU9Ilg1MDlEYXRhVHlwZSI+CisgIDxzZXF1ZW5jZSBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgPGNob2ljZT4KKyAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlJc3N1ZXJTZXJpYWwiIHR5cGU9ImRzOlg1MDlJc3N1ZXJTZXJpYWxUeXBlIi8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5U0tJIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KKyAgICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlTdWJqZWN0TmFtZSIgdHlwZT0ic3RyaW5nIi8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJYNTA5Q2VydGlmaWNhdGUiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iWDUwOUNSTCIgdHlwZT0iYmFzZTY0QmluYXJ5Ii8+CisgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L2Nob2ljZT4KKyAgPC9zZXF1ZW5jZT4KKzwvY29tcGxleFR5cGU+CisKKzxjb21wbGV4VHlwZSBuYW1lPSJYNTA5SXNzdWVyU2VyaWFsVHlwZSI+IAorICA8c2VxdWVuY2U+IAorICAgIDxlbGVtZW50IG5hbWU9Ilg1MDlJc3N1ZXJOYW1lIiB0eXBlPSJzdHJpbmciLz4gCisgICAgPGVsZW1lbnQgbmFtZT0iWDUwOVNlcmlhbE51bWJlciIgdHlwZT0iaW50ZWdlciIvPiAKKyAgPC9zZXF1ZW5jZT4KKzwvY29tcGxleFR5cGU+CisKKzwhLS0gRW5kIFg1MDlEYXRhIC0tPgorCis8IS0tIEJlZ2luIFBHUERhdGEgLS0+CisKKzxlbGVtZW50IG5hbWU9IlBHUERhdGEiIHR5cGU9ImRzOlBHUERhdGFUeXBlIi8+IAorPGNvbXBsZXhUeXBlIG5hbWU9IlBHUERhdGFUeXBlIj4gCisgIDxjaG9pY2U+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iUEdQS2V5SUQiIHR5cGU9ImJhc2U2NEJpbmFyeSIvPiAKKyAgICAgIDxlbGVtZW50IG5hbWU9IlBHUEtleVBhY2tldCIgdHlwZT0iYmFzZTY0QmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4gCisgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKKyAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwvc2VxdWVuY2U+CisgICAgPHNlcXVlbmNlPgorICAgICAgPGVsZW1lbnQgbmFtZT0iUEdQS2V5UGFja2V0IiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4gCisgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKKyAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvY2hvaWNlPgorPC9jb21wbGV4VHlwZT4KKworPCEtLSBFbmQgUEdQRGF0YSAtLT4KKworPCEtLSBCZWdpbiBTUEtJRGF0YSAtLT4KKworPGVsZW1lbnQgbmFtZT0iU1BLSURhdGEiIHR5cGU9ImRzOlNQS0lEYXRhVHlwZSIvPiAKKzxjb21wbGV4VHlwZSBuYW1lPSJTUEtJRGF0YVR5cGUiPgorICA8c2VxdWVuY2UgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgIDxlbGVtZW50IG5hbWU9IlNQS0lTZXhwIiB0eXBlPSJiYXNlNjRCaW5hcnkiLz4KKyAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIvPgorICA8L3NlcXVlbmNlPgorPC9jb21wbGV4VHlwZT4gCisKKzwhLS0gRW5kIFNQS0lEYXRhIC0tPgorCis8IS0tIEVuZCBLZXlJbmZvIC0tPgorCis8IS0tIFN0YXJ0IE9iamVjdCAoTWFuaWZlc3QsIFNpZ25hdHVyZVByb3BlcnR5KSAtLT4KKworPGVsZW1lbnQgbmFtZT0iT2JqZWN0IiB0eXBlPSJkczpPYmplY3RUeXBlIi8+IAorPGNvbXBsZXhUeXBlIG5hbWU9Ik9iamVjdFR5cGUiIG1peGVkPSJ0cnVlIj4KKyAgPHNlcXVlbmNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgIDxhbnkgbmFtZXNwYWNlPSIjI2FueSIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgPC9zZXF1ZW5jZT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCisgIDxhdHRyaWJ1dGUgbmFtZT0iTWltZVR5cGUiIHR5cGU9InN0cmluZyIgdXNlPSJvcHRpb25hbCIvPiA8IS0tIGFkZCBhIGdyZXAgZmFjZXQgLS0+CisgIDxhdHRyaWJ1dGUgbmFtZT0iRW5jb2RpbmciIHR5cGU9ImFueVVSSSIgdXNlPSJvcHRpb25hbCIvPiAKKzwvY29tcGxleFR5cGU+CisKKzxlbGVtZW50IG5hbWU9Ik1hbmlmZXN0IiB0eXBlPSJkczpNYW5pZmVzdFR5cGUiLz4gCis8Y29tcGxleFR5cGUgbmFtZT0iTWFuaWZlc3RUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IHJlZj0iZHM6UmVmZXJlbmNlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAKKyAgPC9zZXF1ZW5jZT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCis8L2NvbXBsZXhUeXBlPgorCis8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0aWVzIiB0eXBlPSJkczpTaWduYXR1cmVQcm9wZXJ0aWVzVHlwZSIvPiAKKzxjb21wbGV4VHlwZSBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0aWVzVHlwZSI+CisgIDxzZXF1ZW5jZT4KKyAgICA8ZWxlbWVudCByZWY9ImRzOlNpZ25hdHVyZVByb3BlcnR5IiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPiAKKyAgPC9zZXF1ZW5jZT4KKyAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCis8L2NvbXBsZXhUeXBlPgorCisgICA8ZWxlbWVudCBuYW1lPSJTaWduYXR1cmVQcm9wZXJ0eSIgdHlwZT0iZHM6U2lnbmF0dXJlUHJvcGVydHlUeXBlIi8+IAorICAgPGNvbXBsZXhUeXBlIG5hbWU9IlNpZ25hdHVyZVByb3BlcnR5VHlwZSIgbWl4ZWQ9InRydWUiPgorICAgICA8Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICA8YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICAgICA8IS0tICgxLDEpIGVsZW1lbnRzIGZyb20gKDEsdW5ib3VuZGVkKSBuYW1lc3BhY2VzIC0tPgorICAgICA8L2Nob2ljZT4KKyAgICAgPGF0dHJpYnV0ZSBuYW1lPSJUYXJnZXQiIHR5cGU9ImFueVVSSSIgdXNlPSJyZXF1aXJlZCIvPiAKKyAgICAgPGF0dHJpYnV0ZSBuYW1lPSJJZCIgdHlwZT0iSUQiIHVzZT0ib3B0aW9uYWwiLz4gCisgICA8L2NvbXBsZXhUeXBlPgorCis8IS0tIEVuZCBPYmplY3QgKE1hbmlmZXN0LCBTaWduYXR1cmVQcm9wZXJ0eSkgLS0+CisKKzwhLS0gU3RhcnQgQWxnb3JpdGhtIFBhcmFtZXRlcnMgLS0+CisKKzxzaW1wbGVUeXBlIG5hbWU9IkhNQUNPdXRwdXRMZW5ndGhUeXBlIj4KKyAgPHJlc3RyaWN0aW9uIGJhc2U9ImludGVnZXIiLz4KKzwvc2ltcGxlVHlwZT4KKworPCEtLSBTdGFydCBLZXlWYWx1ZSBFbGVtZW50LXR5cGVzIC0tPgorCis8ZWxlbWVudCBuYW1lPSJEU0FLZXlWYWx1ZSIgdHlwZT0iZHM6RFNBS2V5VmFsdWVUeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iRFNBS2V5VmFsdWVUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxzZXF1ZW5jZSBtaW5PY2N1cnM9IjAiPgorICAgICAgPGVsZW1lbnQgbmFtZT0iUCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+CisgICAgICA8ZWxlbWVudCBuYW1lPSJRIiB0eXBlPSJkczpDcnlwdG9CaW5hcnkiLz4KKyAgICA8L3NlcXVlbmNlPgorICAgIDxlbGVtZW50IG5hbWU9IkciIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIgbWluT2NjdXJzPSIwIi8+CisgICAgPGVsZW1lbnQgbmFtZT0iWSIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+CisgICAgPGVsZW1lbnQgbmFtZT0iSiIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5IiBtaW5PY2N1cnM9IjAiLz4KKyAgICA8c2VxdWVuY2UgbWluT2NjdXJzPSIwIj4KKyAgICAgIDxlbGVtZW50IG5hbWU9IlNlZWQiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgorICAgICAgPGVsZW1lbnQgbmFtZT0iUGdlbkNvdW50ZXIiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPgorICAgIDwvc2VxdWVuY2U+CisgIDwvc2VxdWVuY2U+Cis8L2NvbXBsZXhUeXBlPgorCis8ZWxlbWVudCBuYW1lPSJSU0FLZXlWYWx1ZSIgdHlwZT0iZHM6UlNBS2V5VmFsdWVUeXBlIi8+Cis8Y29tcGxleFR5cGUgbmFtZT0iUlNBS2V5VmFsdWVUeXBlIj4KKyAgPHNlcXVlbmNlPgorICAgIDxlbGVtZW50IG5hbWU9Ik1vZHVsdXMiIHR5cGU9ImRzOkNyeXB0b0JpbmFyeSIvPiAKKyAgICA8ZWxlbWVudCBuYW1lPSJFeHBvbmVudCIgdHlwZT0iZHM6Q3J5cHRvQmluYXJ5Ii8+IAorICA8L3NlcXVlbmNlPgorPC9jb21wbGV4VHlwZT4gCisKKzwhLS0gRW5kIEtleVZhbHVlIEVsZW1lbnQtdHlwZXMgLS0+CisKKzwhLS0gRW5kIFNpZ25hdHVyZSAtLT4KKworPC9zY2hlbWE+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL0dlbkRldGFjaGVkLmphdmEgYi9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL0dlbkRldGFjaGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJjMmUyYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvamF2YXgveG1sL2NyeXB0by9kc2lnL3NhbXBsZXMvR2VuRGV0YWNoZWQuamF2YQpAQCAtMCwwICsxLDE1NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGphdmF4LnhtbC5jcnlwdG8uZHNpZy5zYW1wbGVzOworCitpbXBvcnQgamF2YXgueG1sLmNyeXB0by4qOworaW1wb3J0IGphdmF4LnhtbC5jcnlwdG8uZHNpZy4qOworaW1wb3J0IGphdmF4LnhtbC5jcnlwdG8uZG9tLio7CitpbXBvcnQgamF2YXgueG1sLmNyeXB0by5kc2lnLmRvbS5ET01TaWduQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRzaWcua2V5aW5mby4qOworaW1wb3J0IGphdmF4LnhtbC5jcnlwdG8uZHNpZy5zcGVjLkMxNE5NZXRob2RQYXJhbWV0ZXJTcGVjOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisKKy8qKgorICogVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGdlbmVyYXRpbmcgYSBEZXRhY2hlZCBYTUwKKyAqIFNpZ25hdHVyZSB1c2luZyB0aGUgSlNSIDEwNSBBUEkuIFRoZSByZXN1bHRpbmcgc2lnbmF0dXJlIHdpbGwgbG9vaworICogbGlrZSAoa2V5IGFuZCBzaWduYXR1cmUgdmFsdWVzIHdpbGwgYmUgZGlmZmVyZW50KToKKyAqCisgKiA8cHJlPjxjb2RlPgorICogPFNpZ25hdHVyZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+CisgKiAgIDxTaWduZWRJbmZvPgorICogICAgIDxDYW5vbmljYWxpemF0aW9uTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUiLz4KKyAqICAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIi8+CisgKiAgICAgPFJlZmVyZW5jZSBVUkk9Imh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Ij4KKyAqICAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIvPgorICogICAgICAgPERpZ2VzdFZhbHVlPjYwTnZadnRkVEIrN1VubExwL0gyNHA3aDRicz08L0RpZ2VzdFZhbHVlPgorICogICAgIDwvUmVmZXJlbmNlPgorICogICA8L1NpZ25lZEluZm8+CisgKiAgIDxTaWduYXR1cmVWYWx1ZT4KKyAqICAgICBEcEV5bGhRb2lVS0JvS1dtWWZhalhPN0xaeGlEWWdWdFV0Q055VGd3WmdvQ2h6b3JBMm5oa1E9PQorICogICA8L1NpZ25hdHVyZVZhbHVlPgorICogICA8S2V5SW5mbz4KKyAqICAgICA8S2V5VmFsdWU+CisgKiAgICAgICA8RFNBS2V5VmFsdWU+CisgKgkgICA8UD4KKyAqICAgICAgICAgICByRnRvOHVQUU02eTM0RkxQbURoNDBCTEoxclZyQzhWZVJxdXVoUFo2allORmtRdXd4bnUvd0N2SUFNaHVrUEJMCisgKiAgICAgICAgICAgRkVUOGJKZi9iMmVmK29xeFphakViKzg4emxab3lHOGcvd01mREJIVHh6K0Nub3dMYWhuQ0NUWUJwNWt0N0c4cQorICogICAgICAgICAgIFVvYkp1dmp5bHdqMXN0N1Y5THN1MDNpWE1YdGJpcmlVakZhNWdVUmFzTjg9CisgKiAgICAgICAgIDwvUD4KKyAqICAgICAgICAgPFE+CisgKiAgICAgICAgICAga0VqQUZwQ2U0bGNVT2R3cGhwemYrdEJhVWRzPQorICogICAgICAgICA8L1E+CisgKiAgICAgICAgIDxHPgorICogICAgICAgICAgIG9lMTRSMk90eUt4K3MrNjBPNUJSTk1PWXBJZzJUVS9mMTVOM2JzREVyS09XdEtYZU5LOUZTN2RXU3RyZUR4bzIKKyAqICAgICAgICAgICBTU2dPb25xQWQ0RnVKLzR1dmE3R2dOTDRVTElxWTdFK21XNWl3SjduL1dURUxoOThtRW9jc0xYa05oMjRIY0g0CisgKiAgICAgICAgICAgQlpmU0NUcnV1em1DeWpkVjFLU3FYL0V1eDA0SGZDV1ltZHhOM1NRL3Fxdz0KKyAqICAgICAgICAgPC9HPgorICogICAgICAgICA8WT4KKyAqICAgICAgICAgICBwQTVOblp2Y2Q1NzRXUlh1T0E3WmZDLzdMcXQ0Y0IwTVJMV3RIdWJ0Sm9WT2FvOWliNXJ5NHJUazByNmRkbk92CisgKiAgICAgICAgICAgQUlHS2t0dXR6SzN5bXZLbGVTM0RPcndaUWdKKy9CRFdEVzhrTzlSNjZvNnJkamlTb2JCaS8wYzJWMStka3FPZworICogICAgICAgICAgIGpGbUt6Mzk1bXZDT1pHaEM3ZnFBVmhIYXQyRWpHUE1mZ1NaeUFCYTcrMWs9CisgKiAgICAgICAgIDwvWT4KKyAqICAgICAgIDwvRFNBS2V5VmFsdWU+CisgKiAgICAgPC9LZXlWYWx1ZT4KKyAqICAgPC9LZXlJbmZvPgorICogPC9TaWduYXR1cmU+CisgKiA8L2NvZGU+PC9wcmU+CisgKi8KK3B1YmxpYyBjbGFzcyBHZW5EZXRhY2hlZCB7CisKKyAgICAvLworICAgIC8vIFN5bm9wc2lzOiBqYXZhIEdlbkRldGFjaGVkIFtvdXRwdXRdCisgICAgLy8KKyAgICAvLyB3aGVyZSBvdXRwdXQgaXMgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCB3aWxsIGNvbnRhaW4gdGhlIGRldGFjaGVkCisgICAgLy8gc2lnbmF0dXJlLiBJZiBub3Qgc3BlY2lmaWVkLCBzdGFuZGFyZCBvdXRwdXQgaXMgdXNlZC4KKyAgICAvLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEZpcnN0LCBjcmVhdGUgYSBET00gWE1MU2lnbmF0dXJlRmFjdG9yeSB0aGF0IHdpbGwgYmUgdXNlZCB0bworICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgWE1MU2lnbmF0dXJlIGFuZCBtYXJzaGFsIGl0IHRvIERPTS4KKyAgICAgICAgU3RyaW5nIHByb3ZpZGVyTmFtZSA9IFN5c3RlbS5nZXRQcm9wZXJ0eQorICAgICAgICAgICAgKCJqc3IxMDVQcm92aWRlciIsICJvcmcuYXBhY2hlLmpjcC54bWwuZHNpZy5pbnRlcm5hbC5kb20uWE1MRFNpZ1JJIik7CisgICAgICAgIFhNTFNpZ25hdHVyZUZhY3RvcnkgZmFjID0gWE1MU2lnbmF0dXJlRmFjdG9yeS5nZXRJbnN0YW5jZSgiRE9NIiwKKyAgICAgICAgICAgIChQcm92aWRlcikgQ2xhc3MuZm9yTmFtZShwcm92aWRlck5hbWUpLm5ld0luc3RhbmNlKCkpOworCisgICAgICAgIC8vIENyZWF0ZSBhIFJlZmVyZW5jZSB0byBhbiBleHRlcm5hbCBVUkkgdGhhdCB3aWxsIGJlIGRpZ2VzdGVkCisgICAgICAgIC8vIHVzaW5nIHRoZSBTSEExIGRpZ2VzdCBhbGdvcml0aG0KKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9CisgICAgICAgICAgICBmYWMubmV3UmVmZXJlbmNlKAorICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCIsCisgICAgICAgICAgICAgICAgZmFjLm5ld0RpZ2VzdE1ldGhvZChEaWdlc3RNZXRob2QuU0hBMSwgbnVsbCkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBTaWduZWRJbmZvCisgICAgICAgIFNpZ25lZEluZm8gc2kgPSBmYWMubmV3U2lnbmVkSW5mbygKKyAgICAgICAgICAgIGZhYy5uZXdDYW5vbmljYWxpemF0aW9uTWV0aG9kCisgICAgICAgICAgICAgICAgKENhbm9uaWNhbGl6YXRpb25NZXRob2QuSU5DTFVTSVZFX1dJVEhfQ09NTUVOVFMsCisgICAgICAgICAgICAgICAgIChDMTROTWV0aG9kUGFyYW1ldGVyU3BlYykgbnVsbCksCisgICAgICAgICAgICBmYWMubmV3U2lnbmF0dXJlTWV0aG9kKFNpZ25hdHVyZU1ldGhvZC5EU0FfU0hBMSwgbnVsbCksCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlZikpOworCisgICAgICAgIC8vIENyZWF0ZSBhIERTQSBLZXlQYWlyCisgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga3BnID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZSgiRFNBIik7CisgICAgICAgIGtwZy5pbml0aWFsaXplKDUxMik7CisgICAgICAgIEtleVBhaXIga3AgPSBrcGcuZ2VuZXJhdGVLZXlQYWlyKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgS2V5VmFsdWUgY29udGFpbmluZyB0aGUgRFNBIFB1YmxpY0tleSB0aGF0IHdhcyBnZW5lcmF0ZWQKKyAgICAgICAgS2V5SW5mb0ZhY3Rvcnkga2lmID0gZmFjLmdldEtleUluZm9GYWN0b3J5KCk7CisgICAgICAgIEtleVZhbHVlIGt2ID0ga2lmLm5ld0tleVZhbHVlKGtwLmdldFB1YmxpYygpKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBLZXlJbmZvIGFuZCBhZGQgdGhlIEtleVZhbHVlIHRvIGl0CisgICAgICAgIEtleUluZm8ga2kgPSBraWYubmV3S2V5SW5mbyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGt2KSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBYTUxTaWduYXR1cmUgKGJ1dCBkb24ndCBzaWduIGl0IHlldCkKKyAgICAgICAgWE1MU2lnbmF0dXJlIHNpZ25hdHVyZSA9IGZhYy5uZXdYTUxTaWduYXR1cmUoc2ksIGtpKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIERvY3VtZW50IHRoYXQgd2lsbCBob2xkIHRoZSByZXN1bHRpbmcgWE1MU2lnbmF0dXJlCisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7IC8vIG11c3QgYmUgc2V0CisgICAgICAgIERvY3VtZW50IGRvYyA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworCisgICAgICAgIC8vIENyZWF0ZSBhIERPTVNpZ25Db250ZXh0IGFuZCBzZXQgdGhlIHNpZ25pbmcgS2V5IHRvIHRoZSBEU0EKKyAgICAgICAgLy8gUHJpdmF0ZUtleSBhbmQgc3BlY2lmeSB3aGVyZSB0aGUgWE1MU2lnbmF0dXJlIHNob3VsZCBiZSBpbnNlcnRlZAorICAgICAgICAvLyBpbiB0aGUgdGFyZ2V0IGRvY3VtZW50IChpbiB0aGlzIGNhc2UsIHRoZSBkb2N1bWVudCByb290KQorICAgICAgICBET01TaWduQ29udGV4dCBzaWduQ29udGV4dCA9IG5ldyBET01TaWduQ29udGV4dChrcC5nZXRQcml2YXRlKCksIGRvYyk7CisKKyAgICAgICAgLy8gTWFyc2hhbCwgZ2VuZXJhdGUgKGFuZCBzaWduKSB0aGUgZGV0YWNoZWQgWE1MU2lnbmF0dXJlLiBUaGUgRE9NCisgICAgICAgIC8vIERvY3VtZW50IHdpbGwgY29udGFpbiB0aGUgWE1MIFNpZ25hdHVyZSBpZiB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICAgIC8vIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgc2lnbmF0dXJlLnNpZ24oc2lnbkNvbnRleHQpOworCisgICAgICAgIC8vIG91dHB1dCB0aGUgcmVzdWx0aW5nIGRvY3VtZW50CisgICAgICAgIE91dHB1dFN0cmVhbSBvczsKKyAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMCkgeworICAgICAgICAgICBvcyA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFyZ3NbMF0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICBvcyA9IFN5c3RlbS5vdXQ7CisgICAgICAgIH0KKworICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdGYgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnMgPSB0Zi5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICB0cmFucy50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2MpLCBuZXcgU3RyZWFtUmVzdWx0KG9zKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9qYXZheC94bWwvY3J5cHRvL2RzaWcvc2FtcGxlcy9HZW5FbnZlbG9wZWQuamF2YSBiL3NhbXBsZXMvamF2YXgveG1sL2NyeXB0by9kc2lnL3NhbXBsZXMvR2VuRW52ZWxvcGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1Yjc2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvamF2YXgveG1sL2NyeXB0by9kc2lnL3NhbXBsZXMvR2VuRW52ZWxvcGVkLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBqYXZheC54bWwuY3J5cHRvLmRzaWcuc2FtcGxlczsKKworaW1wb3J0IGphdmF4LnhtbC5jcnlwdG8uKjsKK2ltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRzaWcuKjsKK2ltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRvbS4qOworaW1wb3J0IGphdmF4LnhtbC5jcnlwdG8uZHNpZy5kb20uRE9NU2lnbkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmNyeXB0by5kc2lnLmtleWluZm8uKjsKK2ltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRzaWcuc3BlYy4qOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lio7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS4qOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisKKy8qKgorICogVGhpcyBpcyBhIHNpbXBsZSBleGFtcGxlIG9mIGdlbmVyYXRpbmcgYW4gRW52ZWxvcGVkIFhNTAorICogU2lnbmF0dXJlIHVzaW5nIHRoZSBKU1IgMTA1IEFQSS4gVGhlIHJlc3VsdGluZyBzaWduYXR1cmUgd2lsbCBsb29rCisgKiBsaWtlIChrZXkgYW5kIHNpZ25hdHVyZSB2YWx1ZXMgd2lsbCBiZSBkaWZmZXJlbnQpOgorICoKKyAqIDxwcmU+PGNvZGU+CisgKjxFbnZlbG9wZSB4bWxucz0idXJuOmVudmVsb3BlIj4KKyAqIDxTaWduYXR1cmUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPgorICogICA8U2lnbmVkSW5mbz4KKyAqICAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuCistMjAwMTAzMTUiLz4KKyAqICAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIi8+CisgKiAgICAgPFJlZmVyZW5jZSBVUkk9IiI+CisgKiAgICAgICA8VHJhbnNmb3Jtcz4KKyAqICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlIi8+CisgKiAgICAgICA8L1RyYW5zZm9ybXM+CisgKiAgICAgICA8RGlnZXN0TWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTEiLz4KKyAqICAgICAgIDxEaWdlc3RWYWx1ZT5LOE0vbFBiS251TURzTzBVenVqNzVsUXR6UUk9PERpZ2VzdFZhbHVlPgorICogICAgIDwvUmVmZXJlbmNlPgorICogICA8L1NpZ25lZEluZm8+CisgKiAgIDxTaWduYXR1cmVWYWx1ZT4KKyAqICAgICBEcEV5bGhRb2lVS0JvS1dtWWZhalhPN0xaeGlEWWdWdFV0Q055VGd3WmdvQ2h6b3JBMm5oa1E9PQorICogICA8L1NpZ25hdHVyZVZhbHVlPgorICogICA8S2V5SW5mbz4KKyAqICAgICA8S2V5VmFsdWU+CisgKiAgICAgICA8RFNBS2V5VmFsdWU+CisgKiAgICAgICAgIDxQPgorICogICAgICAgICAgIHJGdG84dVBRTTZ5MzRGTFBtRGg0MEJMSjFyVnJDOFZlUnF1dWhQWjZqWU5Ga1F1d3hudS93Q3ZJQU1odWtQQkwKKyAqICAgICAgICAgICBGRVQ4YkpmL2IyZWYrb3F4WmFqRWIrODh6bFpveUc4Zy93TWZEQkhUeHorQ25vd0xhaG5DQ1RZQnA1a3Q3RzhxCisgKiAgICAgICAgICAgVW9iSnV2anlsd2oxc3Q3VjlMc3UwM2lYTVh0YmlyaVVqRmE1Z1VSYXNOOD0KKyAqICAgICAgICAgPC9QPgorICogICAgICAgICA8UT4KKyAqICAgICAgICAgICBrRWpBRnBDZTRsY1VPZHdwaHB6Zit0QmFVZHM9CisgKiAgICAgICAgIDwvUT4KKyAqICAgICAgICAgPEc+CisgKiAgICAgICAgICAgb2UxNFIyT3R5S3grcys2ME81QlJOTU9ZcElnMlRVL2YxNU4zYnNERXJLT1d0S1hlTks5RlM3ZFdTdHJlRHhvMgorICogICAgICAgICAgIFNTZ09vbnFBZDRGdUovNHV2YTdHZ05MNFVMSXFZN0UrbVc1aXdKN24vV1RFTGg5OG1Fb2NzTFhrTmgyNEhjSDQKKyAqICAgICAgICAgICBCWmZTQ1RydXV6bUN5amRWMUtTcVgvRXV4MDRIZkNXWW1keE4zU1EvcXF3PQorICogICAgICAgICA8L0c+CisgKiAgICAgICAgIDxZPgorICogICAgICAgICAgIHBBNU5uWnZjZDU3NFdSWHVPQTdaZkMvN0xxdDRjQjBNUkxXdEh1YnRKb1ZPYW85aWI1cnk0clRrMHI2ZGRuT3YKKyAqICAgICAgICAgICBBSUdLa3R1dHpLM3ltdktsZVMzRE9yd1pRZ0orL0JEV0RXOGtPOVI2Nm82cmRqaVNvYkJpLzBjMlYxK2RrcU9nCisgKiAgICAgICAgICAgakZtS3ozOTVtdkNPWkdoQzdmcUFWaEhhdDJFakdQTWZnU1p5QUJhNysxaz0KKyAqICAgICAgICAgPC9ZPgorICogICAgICAgPC9EU0FLZXlWYWx1ZT4KKyAqICAgICA8L0tleVZhbHVlPgorICogICA8L0tleUluZm8+CisgKiA8L1NpZ25hdHVyZT4KKyAqPC9FbnZlbG9wZT4KKyAqIDwvY29kZT48L3ByZT4KKyAqLworcHVibGljIGNsYXNzIEdlbkVudmVsb3BlZCB7CisKKyAgICAvLworICAgIC8vIFN5bm9wc2lzOiBqYXZhIEdlbkVudmVsb3BlZCBbZG9jdW1lbnRdIFtvdXRwdXRdCisgICAgLy8KKyAgICAvLyAgICB3aGVyZSAiZG9jdW1lbnQiIGlzIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSBYTUwgZG9jdW1lbnQKKyAgICAvLyAgICB0byBiZSBzaWduZWQsIGFuZCAib3V0cHV0IiBpcyB0aGUgbmFtZSBvZiB0aGUgZmlsZSB0byBzdG9yZSB0aGUKKyAgICAvLyAgICBzaWduZWQgZG9jdW1lbnQuIFRoZSAybmQgYXJndW1lbnQgaXMgb3B0aW9uYWwgLSBpZiBub3Qgc3BlY2lmaWVkLAorICAgIC8vICAgIHN0YW5kYXJkIG91dHB1dCB3aWxsIGJlIHVzZWQuCisgICAgLy8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBDcmVhdGUgYSBET00gWE1MU2lnbmF0dXJlRmFjdG9yeSB0aGF0IHdpbGwgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUKKyAgICAgICAgLy8gZW52ZWxvcGVkIHNpZ25hdHVyZQorICAgICAgICBTdHJpbmcgcHJvdmlkZXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5CisgICAgICAgICAgICAoImpzcjEwNVByb3ZpZGVyIiwgIm9yZy5hcGFjaGUuamNwLnhtbC5kc2lnLmludGVybmFsLmRvbS5YTUxEU2lnUkkiKTsKKyAgICAgICAgWE1MU2lnbmF0dXJlRmFjdG9yeSBmYWMgPSBYTUxTaWduYXR1cmVGYWN0b3J5LmdldEluc3RhbmNlKCJET00iLAorICAgICAgICAgICAgIChQcm92aWRlcikgQ2xhc3MuZm9yTmFtZShwcm92aWRlck5hbWUpLm5ld0luc3RhbmNlKCkpOworCisgICAgICAgIC8vIENyZWF0ZSBhIFJlZmVyZW5jZSB0byB0aGUgZW52ZWxvcGVkIGRvY3VtZW50IChpbiB0aGlzIGNhc2Ugd2UgYXJlCisgICAgICAgIC8vIHNpZ25pbmcgdGhlIHdob2xlIGRvY3VtZW50LCBzbyBhIFVSSSBvZiAiIiBzaWduaWZpZXMgdGhhdCkgYW5kCisgICAgICAgIC8vIGFsc28gc3BlY2lmeSB0aGUgU0hBMSBkaWdlc3QgYWxnb3JpdGhtIGFuZCB0aGUgRU5WRUxPUEVEIFRyYW5zZm9ybS4KKyAgICAgICAgUmVmZXJlbmNlIHJlZiA9IGZhYy5uZXdSZWZlcmVuY2UKKyAgICAgICAgICAgICgiIiwgZmFjLm5ld0RpZ2VzdE1ldGhvZChEaWdlc3RNZXRob2QuU0hBMSwgbnVsbCksCisgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdAorICAgICAgICAgICAgICAoZmFjLm5ld1RyYW5zZm9ybQorICAgICAgICAgICAgICAgIChUcmFuc2Zvcm0uRU5WRUxPUEVELCAoVHJhbnNmb3JtUGFyYW1ldGVyU3BlYykgbnVsbCkpLAorICAgICAgICAgICAgIG51bGwsIG51bGwpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgU2lnbmVkSW5mbworICAgICAgICBTaWduZWRJbmZvIHNpID0gZmFjLm5ld1NpZ25lZEluZm8KKyAgICAgICAgICAgIChmYWMubmV3Q2Fub25pY2FsaXphdGlvbk1ldGhvZAorICAgICAgICAgICAgIChDYW5vbmljYWxpemF0aW9uTWV0aG9kLklOQ0xVU0lWRV9XSVRIX0NPTU1FTlRTLAorICAgICAgICAgICAgICAoQzE0Tk1ldGhvZFBhcmFtZXRlclNwZWMpIG51bGwpLAorICAgICAgICAgICAgIGZhYy5uZXdTaWduYXR1cmVNZXRob2QoU2lnbmF0dXJlTWV0aG9kLkRTQV9TSEExLCBudWxsKSwKKyAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHJlZikpOworCisgICAgICAgIC8vIENyZWF0ZSBhIERTQSBLZXlQYWlyCisgICAgICAgIEtleVBhaXJHZW5lcmF0b3Iga3BnID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZSgiRFNBIik7CisgICAgICAgIGtwZy5pbml0aWFsaXplKDUxMik7CisgICAgICAgIEtleVBhaXIga3AgPSBrcGcuZ2VuZXJhdGVLZXlQYWlyKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgS2V5VmFsdWUgY29udGFpbmluZyB0aGUgRFNBIFB1YmxpY0tleSB0aGF0IHdhcyBnZW5lcmF0ZWQKKyAgICAgICAgS2V5SW5mb0ZhY3Rvcnkga2lmID0gZmFjLmdldEtleUluZm9GYWN0b3J5KCk7CisgICAgICAgIEtleVZhbHVlIGt2ID0ga2lmLm5ld0tleVZhbHVlKGtwLmdldFB1YmxpYygpKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBLZXlJbmZvIGFuZCBhZGQgdGhlIEtleVZhbHVlIHRvIGl0CisgICAgICAgIEtleUluZm8ga2kgPSBraWYubmV3S2V5SW5mbyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGt2KSk7CisKKyAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIGRvY3VtZW50IHRvIGJlIHNpZ25lZAorICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBEb2N1bWVudCBkb2MgPQorICAgICAgICAgICAgZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oYXJnc1swXSkpOworCisgICAgICAgIC8vIENyZWF0ZSBhIERPTVNpZ25Db250ZXh0IGFuZCBzcGVjaWZ5IHRoZSBEU0EgUHJpdmF0ZUtleSBhbmQKKyAgICAgICAgLy8gbG9jYXRpb24gb2YgdGhlIHJlc3VsdGluZyBYTUxTaWduYXR1cmUncyBwYXJlbnQgZWxlbWVudAorICAgICAgICBET01TaWduQ29udGV4dCBkc2MgPSBuZXcgRE9NU2lnbkNvbnRleHQKKyAgICAgICAgICAgIChrcC5nZXRQcml2YXRlKCksIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBYTUxTaWduYXR1cmUgKGJ1dCBkb24ndCBzaWduIGl0IHlldCkKKyAgICAgICAgWE1MU2lnbmF0dXJlIHNpZ25hdHVyZSA9IGZhYy5uZXdYTUxTaWduYXR1cmUoc2ksIGtpKTsKKworICAgICAgICAvLyBNYXJzaGFsLCBnZW5lcmF0ZSAoYW5kIHNpZ24pIHRoZSBlbnZlbG9wZWQgc2lnbmF0dXJlCisgICAgICAgIHNpZ25hdHVyZS5zaWduKGRzYyk7CisKKyAgICAgICAgLy8gb3V0cHV0IHRoZSByZXN1bHRpbmcgZG9jdW1lbnQKKyAgICAgICAgT3V0cHV0U3RyZWFtIG9zOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7CisgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYXJnc1sxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIG9zID0gU3lzdGVtLm91dDsKKyAgICAgICAgfQorCisgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IHRmLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgIHRyYW5zLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvYyksIG5ldyBTdHJlYW1SZXN1bHQob3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL0dlbkVudmVsb3BpbmcuamF2YSBiL3NhbXBsZXMvamF2YXgveG1sL2NyeXB0by9kc2lnL3NhbXBsZXMvR2VuRW52ZWxvcGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyODlmZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL0dlbkVudmVsb3BpbmcuamF2YQpAQCAtMCwwICsxLDE2MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGphdmF4LnhtbC5jcnlwdG8uZHNpZy5zYW1wbGVzOworCitpbXBvcnQgamF2YXgueG1sLmNyeXB0by4qOworaW1wb3J0IGphdmF4LnhtbC5jcnlwdG8uZHNpZy4qOworaW1wb3J0IGphdmF4LnhtbC5jcnlwdG8uZG9tLio7CitpbXBvcnQgamF2YXgueG1sLmNyeXB0by5kc2lnLmRvbS5ET01TaWduQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRzaWcua2V5aW5mby4qOworaW1wb3J0IGphdmF4LnhtbC5jcnlwdG8uZHNpZy5zcGVjLkMxNE5NZXRob2RQYXJhbWV0ZXJTcGVjOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLio7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCisvKioKKyAqIFRoaXMgaXMgYSBzaW1wbGUgZXhhbXBsZSBvZiBnZW5lcmF0aW5nIGFuIEVudmVsb3BpbmcgWE1MCisgKiBTaWduYXR1cmUgdXNpbmcgdGhlIEpTUiAxMDUgQVBJLiBUaGUgc2lnbmF0dXJlIGluIHRoaXMgY2FzZSByZWZlcmVuY2VzIGEKKyAqIGxvY2FsIFVSSSB0aGF0IHBvaW50cyB0byBhbiBPYmplY3QgZWxlbWVudC4KKyAqIFRoZSByZXN1bHRpbmcgc2lnbmF0dXJlIHdpbGwgbG9vayBsaWtlIChjZXJ0aWZpY2F0ZSBhbmQKKyAqIHNpZ25hdHVyZSB2YWx1ZXMgd2lsbCBiZSBkaWZmZXJlbnQpOgorICoKKyAqIDxwcmU+PGNvZGU+CisgKiA8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj4KKyAqICAgPFNpZ25lZEluZm8+CisgKiAgICAgPENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMiLz4KKyAqICAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2RzYS1zaGExIi8+CisgKiAgICAgPFJlZmVyZW5jZSBVUkk9IiNvYmplY3QiPgorICogICAgICAgPERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIi8+CisgKiAgICAgICA8RGlnZXN0VmFsdWU+Ny9YVHNIYUJTT25KL2pYRDV2MHpMNlZLWXNrPTwvRGlnZXN0VmFsdWU+CisgKiAgICAgPC9SZWZlcmVuY2U+CisgKiAgIDwvU2lnbmVkSW5mbz4KKyAqICAgPFNpZ25hdHVyZVZhbHVlPgorICogICAgIFJwTVJidE1ITGEwc2lTUytCd1VwTElFbVRmaC8wZnNsZDJKWVFXWnpDemZhNWtCVHoyNStYQT09CisgKiAgIDwvU2lnbmF0dXJlVmFsdWU+CisgKiAgIDxLZXlJbmZvPgorICogICAgIDxLZXlWYWx1ZT4KKyAqICAgICAgIDxEU0FLZXlWYWx1ZT4KKyAqICAgICAgICAgPFA+CisgKiAgICAgICAgICAgL0thQ3pvNFN5cm9tNzh6M0VRNVNiYkI0c0Y3ZXk4MGV0S0lJODY0V0Y2NEI4MXVScEg1dDlqUVR4ZUV1MEltYnoKKyAqICAgICAgICAgICBSTXF6VkRaa1ZHOXhEN25OMWt1Rnc9PQorICogICAgICAgICA8L1A+CisgKiAgICAgICAgIDxRPgorICogICAgICAgICAgIGxpN2R6RGFjdW82N0pnN210cUVtMlRSdU9NVT0KKyAqICAgICAgICAgPC9RPgorICogICAgICAgICA8Rz4KKyAqICAgICAgICAgICBaNFJ4c25xYzlFN3BHa25GRkgyeHFhcnlSUEJhUTAxa2hwTWRMUlFuRzU0MUF3dHgvWFBhRjVCcHN5NHBOV01PSAorICogICAgICAgICAgIENCaU5VME5vZ3BzUVc1UXZubE1wQT09CisgKiAgICAgICAgIDwvRz4KKyAqICAgICAgICAgPFk+CisgKiAgICAgICAgICAgd2JFVWFDZ0haWHFLNHFMdmJkWXJBYzYrRG8wWFZjc3ppQ0pxeHpuNGNKSlJ4d2MzRTF4bkVYSHNjVmdyMUNxbDkKKyAqICAgICAgICAgICBpNWZhbk9LUWJGWHptYitiQ2hxaWc9PQorICogICAgICAgICA8L1k+CisgKiAgICAgICA8L0RTQUtleVZhbHVlPgorICogICAgIDwvS2V5VmFsdWU+CisgKiAgIDwvS2V5SW5mbz4KKyAqICAgPE9iamVjdCBJZD0ib2JqZWN0Ij5zb21lIHRleHQ8L09iamVjdD4KKyAqIDwvU2lnbmF0dXJlPgorICoKKyAqIDwvY29kZT48L3ByZT4KKyAqLworcHVibGljIGNsYXNzIEdlbkVudmVsb3BpbmcgeworCisgICAgLy8KKyAgICAvLyBTeW5vcGlzOiBqYXZhIEdlbkVudmVsb3BpbmcgW291dHB1dF0KKyAgICAvLworICAgIC8vICAgd2hlcmUgIm91dHB1dCIgaXMgdGhlIG5hbWUgb2YgYSBmaWxlIHRoYXQgd2lsbCBjb250YWluIHRoZQorICAgIC8vICAgZ2VuZXJhdGVkIHNpZ25hdHVyZS4gSWYgbm90IHNwZWNpZmllZCwgc3RhbmRhcmQgb3VwdXQgd2lsbCBiZSB1c2VkLgorICAgIC8vCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gRmlyc3QsIGNyZWF0ZSB0aGUgRE9NIFhNTFNpZ25hdHVyZUZhY3RvcnkgdGhhdCB3aWxsIGJlIHVzZWQgdG8KKyAgICAgICAgLy8gZ2VuZXJhdGUgdGhlIFhNTFNpZ25hdHVyZQorICAgICAgICBTdHJpbmcgcHJvdmlkZXJOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5CisgICAgICAgICAgICAoImpzcjEwNVByb3ZpZGVyIiwgIm9yZy5hcGFjaGUuamNwLnhtbC5kc2lnLmludGVybmFsLmRvbS5YTUxEU2lnUkkiKTsKKyAgICAgICAgWE1MU2lnbmF0dXJlRmFjdG9yeSBmYWMgPSBYTUxTaWduYXR1cmVGYWN0b3J5LmdldEluc3RhbmNlKCJET00iLAorICAgICAgICAgICAgKFByb3ZpZGVyKSBDbGFzcy5mb3JOYW1lKHByb3ZpZGVyTmFtZSkubmV3SW5zdGFuY2UoKSk7CisKKyAgICAgICAgLy8gTmV4dCwgY3JlYXRlIGEgUmVmZXJlbmNlIHRvIGEgc2FtZS1kb2N1bWVudCBVUkkgdGhhdCBpcyBhbiBPYmplY3QKKyAgICAgICAgLy8gZWxlbWVudCBhbmQgc3BlY2lmeSB0aGUgU0hBMSBkaWdlc3QgYWxnb3JpdGhtCisgICAgICAgIFJlZmVyZW5jZSByZWYgPSBmYWMubmV3UmVmZXJlbmNlKCIjb2JqZWN0IiwKKyAgICAgICAgICAgIGZhYy5uZXdEaWdlc3RNZXRob2QoRGlnZXN0TWV0aG9kLlNIQTEsIG51bGwpKTsKKworICAgICAgICAvLyBOZXh0LCBjcmVhdGUgdGhlIHJlZmVyZW5jZWQgT2JqZWN0CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIERvY3VtZW50IGRvYyA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5uZXdEb2N1bWVudCgpOworICAgICAgICBOb2RlIHRleHQgPSBkb2MuY3JlYXRlVGV4dE5vZGUoInNvbWUgdGV4dCIpOworICAgICAgICBYTUxTdHJ1Y3R1cmUgY29udGVudCA9IG5ldyBET01TdHJ1Y3R1cmUodGV4dCk7CisgICAgICAgIFhNTE9iamVjdCBvYmogPSBmYWMubmV3WE1MT2JqZWN0CisgICAgICAgICAgICAoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb250ZW50KSwgIm9iamVjdCIsIG51bGwsIG51bGwpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgU2lnbmVkSW5mbworICAgICAgICBTaWduZWRJbmZvIHNpID0gZmFjLm5ld1NpZ25lZEluZm8oCisgICAgICAgICAgICBmYWMubmV3Q2Fub25pY2FsaXphdGlvbk1ldGhvZAorICAgICAgICAgICAgICAgIChDYW5vbmljYWxpemF0aW9uTWV0aG9kLklOQ0xVU0lWRV9XSVRIX0NPTU1FTlRTLAorICAgICAgICAgICAgICAgICAoQzE0Tk1ldGhvZFBhcmFtZXRlclNwZWMpIG51bGwpLAorICAgICAgICAgICAgZmFjLm5ld1NpZ25hdHVyZU1ldGhvZChTaWduYXR1cmVNZXRob2QuRFNBX1NIQTEsIG51bGwpLAorICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChyZWYpKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBEU0EgS2V5UGFpcgorICAgICAgICBLZXlQYWlyR2VuZXJhdG9yIGtwZyA9IEtleVBhaXJHZW5lcmF0b3IuZ2V0SW5zdGFuY2UoIkRTQSIpOworICAgICAgICBrcGcuaW5pdGlhbGl6ZSg1MTIpOworICAgICAgICBLZXlQYWlyIGtwID0ga3BnLmdlbmVyYXRlS2V5UGFpcigpOworCisgICAgICAgIC8vIENyZWF0ZSBhIEtleVZhbHVlIGNvbnRhaW5pbmcgdGhlIERTQSBQdWJsaWNLZXkgdGhhdCB3YXMgZ2VuZXJhdGVkCisgICAgICAgIEtleUluZm9GYWN0b3J5IGtpZiA9IGZhYy5nZXRLZXlJbmZvRmFjdG9yeSgpOworICAgICAgICBLZXlWYWx1ZSBrdiA9IGtpZi5uZXdLZXlWYWx1ZShrcC5nZXRQdWJsaWMoKSk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgS2V5SW5mbyBhbmQgYWRkIHRoZSBLZXlWYWx1ZSB0byBpdAorICAgICAgICBLZXlJbmZvIGtpID0ga2lmLm5ld0tleUluZm8oQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChrdikpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgWE1MU2lnbmF0dXJlIChidXQgZG9uJ3Qgc2lnbiBpdCB5ZXQpCisgICAgICAgIFhNTFNpZ25hdHVyZSBzaWduYXR1cmUgPSBmYWMubmV3WE1MU2lnbmF0dXJlKHNpLCBraSwKKyAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qob2JqKSwgbnVsbCwgbnVsbCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGEgRE9NU2lnbkNvbnRleHQgYW5kIHNwZWNpZnkgdGhlIERTQSBQcml2YXRlS2V5IGZvciBzaWduaW5nCisgICAgICAgIC8vIGFuZCB0aGUgZG9jdW1lbnQgbG9jYXRpb24gb2YgdGhlIFhNTFNpZ25hdHVyZQorICAgICAgICBET01TaWduQ29udGV4dCBkc2MgPSBuZXcgRE9NU2lnbkNvbnRleHQoa3AuZ2V0UHJpdmF0ZSgpLCBkb2MpOworCisgICAgICAgIC8vIExhc3RseSwgZ2VuZXJhdGUgdGhlIGVudmVsb3Bpbmcgc2lnbmF0dXJlIHVzaW5nIHRoZSBQcml2YXRlS2V5CisgICAgICAgIHNpZ25hdHVyZS5zaWduKGRzYyk7CisKKyAgICAgICAgLy8gb3V0cHV0IHRoZSByZXN1bHRpbmcgZG9jdW1lbnQKKyAgICAgICAgT3V0cHV0U3RyZWFtIG9zOworICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgIG9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oYXJnc1swXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgIG9zID0gU3lzdGVtLm91dDsKKyAgICAgICAgfQorCisgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0ZiA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IHRmLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgIHRyYW5zLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvYyksIG5ldyBTdHJlYW1SZXN1bHQob3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL1ZhbGlkYXRlLmphdmEgYi9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL1ZhbGlkYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkNjhiYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvamF2YXgveG1sL2NyeXB0by9kc2lnL3NhbXBsZXMvVmFsaWRhdGUuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgamF2YXgueG1sLmNyeXB0by5kc2lnLnNhbXBsZXM7CisKK2ltcG9ydCBqYXZheC54bWwuY3J5cHRvLio7CitpbXBvcnQgamF2YXgueG1sLmNyeXB0by5kc2lnLio7CitpbXBvcnQgamF2YXgueG1sLmNyeXB0by5kb20uKjsKK2ltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRzaWcuZG9tLkRPTVZhbGlkYXRlQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRzaWcua2V5aW5mby4qOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLyoqCisgKiBUaGlzIGlzIGEgc2ltcGxlIGV4YW1wbGUgb2YgdmFsaWRhdGluZyBhbiBYTUwKKyAqIFNpZ25hdHVyZSB1c2luZyB0aGUgSlNSIDEwNSBBUEkuIEl0IGFzc3VtZXMgdGhlIGtleSBuZWVkZWQgdG8KKyAqIHZhbGlkYXRlIHRoZSBzaWduYXR1cmUgaXMgY29udGFpbmVkIGluIGEgS2V5VmFsdWUgS2V5SW5mby4KKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRlIHsKKworICAgIC8vCisgICAgLy8gU3lub3BzaXM6IGphdmEgVmFsaWRhdGUgW2RvY3VtZW50XQorICAgIC8vCisgICAgLy8JICB3aGVyZSAiZG9jdW1lbnQiIGlzIHRoZSBuYW1lIG9mIGEgZmlsZSBjb250YWluaW5nIHRoZSBYTUwgZG9jdW1lbnQKKyAgICAvLwkgIHRvIGJlIHZhbGlkYXRlZC4KKyAgICAvLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIEluc3RhbnRpYXRlIHRoZSBkb2N1bWVudCB0byBiZSB2YWxpZGF0ZWQKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0KKyAgICAgICAgICAgIGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgRmlsZUlucHV0U3RyZWFtKGFyZ3NbMF0pKTsKKworICAgICAgICAvLyBGaW5kIFNpZ25hdHVyZSBlbGVtZW50CisgICAgICAgIE5vZGVMaXN0IG5sID0KKyAgICAgICAgICAgIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTFNpZ25hdHVyZS5YTUxOUywgIlNpZ25hdHVyZSIpOworICAgICAgICBpZiAobmwuZ2V0TGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgU2lnbmF0dXJlIGVsZW1lbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIERPTSBYTUxTaWduYXR1cmVGYWN0b3J5IHRoYXQgd2lsbCBiZSB1c2VkIHRvIHVubWFyc2hhbCB0aGUKKyAgICAgICAgLy8gZG9jdW1lbnQgY29udGFpbmluZyB0aGUgWE1MU2lnbmF0dXJlCisgICAgICAgIFN0cmluZyBwcm92aWRlck5hbWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkKKyAgICAgICAgICAgICgianNyMTA1UHJvdmlkZXIiLCAib3JnLmFwYWNoZS5qY3AueG1sLmRzaWcuaW50ZXJuYWwuZG9tLlhNTERTaWdSSSIpOworICAgICAgICBYTUxTaWduYXR1cmVGYWN0b3J5IGZhYyA9IFhNTFNpZ25hdHVyZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIkRPTSIsCisgICAgICAgICAgICAoUHJvdmlkZXIpIENsYXNzLmZvck5hbWUocHJvdmlkZXJOYW1lKS5uZXdJbnN0YW5jZSgpKTsKKworICAgICAgICAvLyBDcmVhdGUgYSBET01WYWxpZGF0ZUNvbnRleHQgYW5kIHNwZWNpZnkgYSBLZXlWYWx1ZSBLZXlTZWxlY3RvcgorICAgICAgICAvLyBhbmQgZG9jdW1lbnQgY29udGV4dAorICAgICAgICBET01WYWxpZGF0ZUNvbnRleHQgdmFsQ29udGV4dCA9IG5ldyBET01WYWxpZGF0ZUNvbnRleHQKKyAgICAgICAgICAgIChuZXcgS2V5VmFsdWVLZXlTZWxlY3RvcigpLCBubC5pdGVtKDApKTsKKworICAgICAgICAvLyB1bm1hcnNoYWwgdGhlIFhNTFNpZ25hdHVyZQorICAgICAgICBYTUxTaWduYXR1cmUgc2lnbmF0dXJlID0gZmFjLnVubWFyc2hhbFhNTFNpZ25hdHVyZSh2YWxDb250ZXh0KTsKKworICAgICAgICAvLyBWYWxpZGF0ZSB0aGUgWE1MU2lnbmF0dXJlIChnZW5lcmF0ZWQgYWJvdmUpCisgICAgICAgIGJvb2xlYW4gY29yZVZhbGlkaXR5ID0gc2lnbmF0dXJlLnZhbGlkYXRlKHZhbENvbnRleHQpOworCisgICAgICAgIC8vIENoZWNrIGNvcmUgdmFsaWRhdGlvbiBzdGF0dXMKKyAgICAgICAgaWYgKGNvcmVWYWxpZGl0eSA9PSBmYWxzZSkgeworICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJTaWduYXR1cmUgZmFpbGVkIGNvcmUgdmFsaWRhdGlvbiIpOworICAgICAgICAgICAgYm9vbGVhbiBzdiA9IHNpZ25hdHVyZS5nZXRTaWduYXR1cmVWYWx1ZSgpLnZhbGlkYXRlKHZhbENvbnRleHQpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzaWduYXR1cmUgdmFsaWRhdGlvbiBzdGF0dXM6ICIgKyBzdik7CisgICAgICAgICAgICAvLyBjaGVjayB0aGUgdmFsaWRhdGlvbiBzdGF0dXMgb2YgZWFjaCBSZWZlcmVuY2UKKyAgICAgICAgICAgIEl0ZXJhdG9yIGkgPSBzaWduYXR1cmUuZ2V0U2lnbmVkSW5mbygpLmdldFJlZmVyZW5jZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGkuaGFzTmV4dCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHJlZlZhbGlkID0KKyAgICAgICAgICAgICAgICAgICAgKChSZWZlcmVuY2UpIGkubmV4dCgpKS52YWxpZGF0ZSh2YWxDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlZlsiICsgaiArICJdIHZhbGlkaXR5IHN0YXR1czogIiArIHJlZlZhbGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2lnbmF0dXJlIHBhc3NlZCBjb3JlIHZhbGlkYXRpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEtleVNlbGVjdG9yIHdoaWNoIHJldHJpZXZlcyB0aGUgcHVibGljIGtleSBvdXQgb2YgdGhlCisgICAgICogS2V5VmFsdWUgZWxlbWVudCBhbmQgcmV0dXJucyBpdC4KKyAgICAgKiBOT1RFOiBJZiB0aGUga2V5IGFsZ29yaXRobSBkb2Vzbid0IG1hdGNoIHNpZ25hdHVyZSBhbGdvcml0aG0sCisgICAgICogdGhlbiB0aGUgcHVibGljIGtleSB3aWxsIGJlIGlnbm9yZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgS2V5VmFsdWVLZXlTZWxlY3RvciBleHRlbmRzIEtleVNlbGVjdG9yIHsKKyAgICAgICAgcHVibGljIEtleVNlbGVjdG9yUmVzdWx0IHNlbGVjdChLZXlJbmZvIGtleUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5U2VsZWN0b3IuUHVycG9zZSBwdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsZ29yaXRobU1ldGhvZCBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWE1MQ3J5cHRvQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIEtleVNlbGVjdG9yRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChrZXlJbmZvID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgS2V5U2VsZWN0b3JFeGNlcHRpb24oIk51bGwgS2V5SW5mbyBvYmplY3QhIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTaWduYXR1cmVNZXRob2Qgc20gPSAoU2lnbmF0dXJlTWV0aG9kKSBtZXRob2Q7CisgICAgICAgICAgICBMaXN0IGxpc3QgPSBrZXlJbmZvLmdldENvbnRlbnQoKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgWE1MU3RydWN0dXJlIHhtbFN0cnVjdHVyZSA9IChYTUxTdHJ1Y3R1cmUpIGxpc3QuZ2V0KGkpOworICAgICAgICAgICAgICAgIGlmICh4bWxTdHJ1Y3R1cmUgaW5zdGFuY2VvZiBLZXlWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBQdWJsaWNLZXkgcGsgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGsgPSAoKEtleVZhbHVlKXhtbFN0cnVjdHVyZSkuZ2V0UHVibGljS2V5KCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEtleUV4Y2VwdGlvbiBrZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEtleVNlbGVjdG9yRXhjZXB0aW9uKGtlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgYWxnb3JpdGhtIGlzIGNvbXBhdGlibGUgd2l0aCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsZ0VxdWFscyhzbS5nZXRBbGdvcml0aG0oKSwgcGsuZ2V0QWxnb3JpdGhtKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUtleVNlbGVjdG9yUmVzdWx0KHBrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBLZXlTZWxlY3RvckV4Y2VwdGlvbigiTm8gS2V5VmFsdWUgZWxlbWVudCBmb3VuZCEiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vQEBARklYTUU6IHRoaXMgc2hvdWxkIGFsc28gd29yayBmb3Iga2V5IHR5cGVzIG90aGVyIHRoYW4gRFNBL1JTQQorICAgICAgICBzdGF0aWMgYm9vbGVhbiBhbGdFcXVhbHMoU3RyaW5nIGFsZ1VSSSwgU3RyaW5nIGFsZ05hbWUpIHsKKyAgICAgICAgICAgIGlmIChhbGdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkRTQSIpICYmCisgICAgICAgICAgICAgICAgYWxnVVJJLmVxdWFsc0lnbm9yZUNhc2UoU2lnbmF0dXJlTWV0aG9kLkRTQV9TSEExKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhbGdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIlJTQSIpICYmCisgICAgICAgICAgICAgICAgYWxnVVJJLmVxdWFsc0lnbm9yZUNhc2UoU2lnbmF0dXJlTWV0aG9kLlJTQV9TSEExKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhbGdOYW1lLmVxdWFsc0lnbm9yZUNhc2UoIkVDIikgJiYKKyAgICAgICAgICAgICAgICBhbGdVUkkuZXF1YWxzSWdub3JlQ2FzZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxkc2lnLW1vcmUjZWNkc2Etc2hhMjU2IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlS2V5U2VsZWN0b3JSZXN1bHQgaW1wbGVtZW50cyBLZXlTZWxlY3RvclJlc3VsdCB7CisgICAgICAgIHByaXZhdGUgUHVibGljS2V5IHBrOworICAgICAgICBTaW1wbGVLZXlTZWxlY3RvclJlc3VsdChQdWJsaWNLZXkgcGspIHsKKyAgICAgICAgICAgIHRoaXMucGsgPSBwazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBLZXkgZ2V0S2V5KCkgeyByZXR1cm4gcGs7IH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL2VudmVsb3BlLnhtbCBiL3NhbXBsZXMvamF2YXgveG1sL2NyeXB0by9kc2lnL3NhbXBsZXMvZW52ZWxvcGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMmQ0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL2VudmVsb3BlLnhtbApAQCAtMCwwICsxLDIgQEAKKzxFbnZlbG9wZSB4bWxucz0idXJuOmVudmVsb3BlIj4KKzwvRW52ZWxvcGU+CmRpZmYgLS1naXQgYS9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL2VudmVsb3BlZFNpZ25hdHVyZS54bWwgYi9zYW1wbGVzL2phdmF4L3htbC9jcnlwdG8vZHNpZy9zYW1wbGVzL2VudmVsb3BlZFNpZ25hdHVyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyMDRhMwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvamF2YXgveG1sL2NyeXB0by9kc2lnL3NhbXBsZXMvZW52ZWxvcGVkU2lnbmF0dXJlLnhtbApAQCAtMCwwICsxLDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8RW52ZWxvcGUgeG1sbnM9InVybjplbnZlbG9wZSI+Cis8U2lnbmF0dXJlIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48U2lnbmVkSW5mbyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PENhbm9uaWNhbGl6YXRpb25NZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIi8+PFNpZ25hdHVyZU1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiLz48UmVmZXJlbmNlIFVSST0iIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PFRyYW5zZm9ybXMgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxUcmFuc2Zvcm0gQWxnb3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiLz48L1RyYW5zZm9ybXM+PERpZ2VzdE1ldGhvZCBBbGdvcml0aG09Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNzaGExIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIvPjxEaWdlc3RWYWx1ZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+dW9vcWJXWWE1VkNxY0pDYnV5bUJLcW0xN3ZZPTwvRGlnZXN0VmFsdWU+PC9SZWZlcmVuY2U+PC9TaWduZWRJbmZvPjxTaWduYXR1cmVWYWx1ZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+ZU83SzFCZEMwa3pOdnIxSHBNZjRoS29Xc3ZsK29JMDRuTXc1NUdPK1o1aHlJNkJ5M09paG93PT08L1NpZ25hdHVyZVZhbHVlPjxLZXlJbmZvIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj48S2V5VmFsdWUgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPjxEU0FLZXlWYWx1ZSB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+PFAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiPi9LYUN6bzRTeXJvbTc4ejNFUTVTYmJCNHNGN2V5ODBldEtJSTg2NFdGNjRCODF1UnBINXQ5alFUeGVFdTBJbWJ6Uk1xelZEWmtWRzkKK3hEN25OMWt1Rnc9PTwvUD48USB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+bGk3ZHpEYWN1bzY3Smc3bXRxRW0yVFJ1T01VPTwvUT48RyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyI+WjRSeHNucWM5RTdwR2tuRkZIMnhxYXJ5UlBCYVEwMWtocE1kTFJRbkc1NDFBd3R4L1hQYUY1QnBzeTRwTldNT0hDQmlOVTBOb2dwcworUVc1UXZubE1wQT09PC9HPjxZIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjIj5PcUZpMHNHcHZyb2k2VXQzbTE1NFFOV2M2Z2F2SDNqMlpvUlBEVzdxVkJiZ2s3WG9tcHVLdlplMW93ejB5dnhxKzFLK21XYkw3U1QrCit0NW5yNlVGQkNnPT08L1k+PC9EU0FLZXlWYWx1ZT48L0tleVZhbHVlPjwvS2V5SW5mbz48L1NpZ25hdHVyZT48L0VudmVsb3BlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9BeGlzU2lnbmVyLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvQXhpc1NpZ25lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Mzk5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvQXhpc1NpZ25lci5qYXZhCkBAIC0wLDAgKzEsMTQyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciAkQXV0aG9yJAorICovCitwdWJsaWMgY2xhc3MgQXhpc1NpZ25lciB7CisKKyAgICAvKiogRmllbGQgQVhJU19TSUdOQVRVUkVfRklMRU5BTUUgICAgICAgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVhJU19TSUdOQVRVUkVfRklMRU5BTUUgPSAiYnVpbGQvYXhpc1NpZ25hdHVyZS54bWwiOworCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyB1bnVzZWRbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisKKyAgICAgICAgU3RyaW5nIGtleXN0b3JlVHlwZSA9ICJKS1MiOworICAgICAgICBTdHJpbmcga2V5c3RvcmVGaWxlID0gInNhbXBsZXMvZGF0YS9rZXlzdG9yZS5qa3MiOworICAgICAgICBTdHJpbmcga2V5c3RvcmVQYXNzID0gInhtbHNlY3VyaXR5IjsKKyAgICAgICAgU3RyaW5nIHByaXZhdGVLZXlBbGlhcyA9ICJ0ZXN0IjsKKyAgICAgICAgU3RyaW5nIHByaXZhdGVLZXlQYXNzID0gInhtbHNlY3VyaXR5IjsKKyAgICAgICAgU3RyaW5nIGNlcnRpZmljYXRlQWxpYXMgPSAidGVzdCI7CisgICAgICAgIEZpbGUgc2lnbmF0dXJlRmlsZSA9IG5ldyBGaWxlKEFYSVNfU0lHTkFUVVJFX0ZJTEVOQU1FKTsKKworICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKGtleXN0b3JlVHlwZSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGtleXN0b3JlRmlsZSk7CisKKyAgICAgICAga3MubG9hZChmaXMsIGtleXN0b3JlUGFzcy50b0NoYXJBcnJheSgpKTsKKworICAgICAgICBQcml2YXRlS2V5IHByaXZhdGVLZXkgPQorICAgICAgICAgICAgKFByaXZhdGVLZXkpIGtzLmdldEtleShwcml2YXRlS2V5QWxpYXMsIHByaXZhdGVLZXlQYXNzLnRvQ2hhckFycmF5KCkpOworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0gZGIubmV3RG9jdW1lbnQoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTdGFydCBTT0FQIGluZnJhc3RydWN0dXJlIGNvZGUuIFRoaXMgaXMgdG8gYmUgbWFkZSBjb21wYXRpYmxlIHdpdGggQXhpcy4KKyAgICAgICAgICoKKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBzb2FwTlMgPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMS8xMi9zb2FwLWVudmVsb3BlIjsKKyAgICAgICAgU3RyaW5nIFNPQVBTRUNOUyA9ICJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL3NlY3VyaXR5LzIwMDAtMTIiOworCisgICAgICAgIEVsZW1lbnQgZW52ZWxvcGVFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhzb2FwTlMsICJlbnY6RW52ZWxvcGUiKTsKKworICAgICAgICBlbnZlbG9wZUVsZW1lbnQuc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5hbWVzcGFjZVNwZWNOUywgInhtbG5zOmVudiIsIHNvYXBOUyk7CisgICAgICAgIGRvYy5hcHBlbmRDaGlsZChlbnZlbG9wZUVsZW1lbnQpOworCisgICAgICAgIEVsZW1lbnQgaGVhZGVyRWxlbSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoc29hcE5TLCAiZW52OkhlYWRlciIpOworICAgICAgICBFbGVtZW50IGJvZHlFbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhzb2FwTlMsICJlbnY6Qm9keSIpOworCisgICAgICAgIGVudmVsb3BlRWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOworICAgICAgICBlbnZlbG9wZUVsZW1lbnQuYXBwZW5kQ2hpbGQoaGVhZGVyRWxlbSk7CisgICAgICAgIGVudmVsb3BlRWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOworICAgICAgICBlbnZlbG9wZUVsZW1lbnQuYXBwZW5kQ2hpbGQoYm9keUVsZW0pOworICAgICAgICBlbnZlbG9wZUVsZW1lbnQuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKKyAgICAgICAgYm9keUVsZW0uYXBwZW5kQ2hpbGQoCisgICAgICAgICAgICBkb2MuY3JlYXRlVGV4dE5vZGUoIlRoaXMgaXMgc2lnbmVkIHRvZ2V0aGVyIHdpdGggaXQncyBCb2R5IGFuY2VzdG9yIikKKyAgICAgICAgKTsKKworICAgICAgICBib2R5RWxlbS5zZXRBdHRyaWJ1dGVOUyhTT0FQU0VDTlMsICJTT0FQLVNFQzppZCIsICJCb2R5Iik7CisgICAgICAgIGJvZHlFbGVtLnNldElkQXR0cmlidXRlTlMoU09BUFNFQ05TLCAiaWQiLCB0cnVlKTsKKworICAgICAgICBFbGVtZW50IHNvYXBTaWduYXR1cmVFbGVtID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhTT0FQU0VDTlMsICJTT0FQLVNFQzpTaWduYXR1cmUiKTsKKworICAgICAgICBlbnZlbG9wZUVsZW1lbnQuc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5hbWVzcGFjZVNwZWNOUywgInhtbG5zOlNPQVAtU0VDIiwgU09BUFNFQ05TKTsKKyAgICAgICAgZW52ZWxvcGVFbGVtZW50LnNldEF0dHJpYnV0ZU5TKG51bGwsICJhY3RvciIsICJzb21lLXVyaSIpOworICAgICAgICBlbnZlbG9wZUVsZW1lbnQuc2V0QXR0cmlidXRlTlMobnVsbCwgIm11c3RVbmRlcnN0YW5kIiwgIjEiKTsKKyAgICAgICAgZW52ZWxvcGVFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisgICAgICAgIGhlYWRlckVsZW0uYXBwZW5kQ2hpbGQoc29hcFNpZ25hdHVyZUVsZW0pOworCisgICAgICAgIC8qCisgICAgICAgICAqCisgICAgICAgICAqIEVuZCBTT0FQIGluZnJhc3RydWN0dXJlIGNvZGUuIFRoaXMgaXMgdG8gYmUgbWFkZSBjb21wYXRpYmxlIHdpdGggQXhpcy4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBCYXNlVVJJID0gc2lnbmF0dXJlRmlsZS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKKyAgICAgICAgWE1MU2lnbmF0dXJlIHNpZyA9IG5ldyBYTUxTaWduYXR1cmUoZG9jLCBCYXNlVVJJLCBYTUxTaWduYXR1cmUuQUxHT19JRF9TSUdOQVRVUkVfRFNBKTsKKworICAgICAgICBzb2FwU2lnbmF0dXJlRWxlbS5hcHBlbmRDaGlsZChzaWcuZ2V0RWxlbWVudCgpKTsKKworICAgICAgICB7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiNCb2R5Iik7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9CisgICAgICAgICAgICAgICAgKFg1MDlDZXJ0aWZpY2F0ZSkga3MuZ2V0Q2VydGlmaWNhdGUoY2VydGlmaWNhdGVBbGlhcyk7CisKKyAgICAgICAgICAgIHNpZy5hZGRLZXlJbmZvKGNlcnQpOworICAgICAgICAgICAgc2lnLmFkZEtleUluZm8oY2VydC5nZXRQdWJsaWNLZXkoKSk7CisgICAgICAgICAgICBzaWcuc2lnbihwcml2YXRlS2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZiA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNpZ25hdHVyZUZpbGUpOworCisgICAgICAgIFhNTFV0aWxzLm91dHB1dERPTWMxNG5XaXRoQ29tbWVudHMoZG9jLCBmKTsKKyAgICAgICAgZi5jbG9zZSgpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyb3RlIHNpZ25hdHVyZSB0byAiICsgQmFzZVVSSSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaWcuZ2V0U2lnbmVkSW5mbygpLmdldFNpZ25lZENvbnRlbnRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLSBTaWduZWQgQ29udGVudCBmb2xsb3dzIC0tLSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoc2lnLmdldFNpZ25lZEluZm8oKS5nZXRTaWduZWRDb250ZW50SXRlbShpKSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL0F4aXNWZXJpZmllci5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL0F4aXNWZXJpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZmIzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvQXhpc1ZlcmlmaWVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqLworcHVibGljIGNsYXNzIEF4aXNWZXJpZmllciB7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICBGaWxlIHNpZ25hdHVyZUZpbGUgPSBuZXcgRmlsZShBeGlzU2lnbmVyLkFYSVNfU0lHTkFUVVJFX0ZJTEVOQU1FKTsKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IGRiLnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oc2lnbmF0dXJlRmlsZSkpOworICAgICAgICBTdHJpbmcgQmFzZVVSSSA9IHNpZ25hdHVyZUZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBYUGF0aCB4cGF0aCA9IHhwZi5uZXdYUGF0aCgpOworICAgICAgICBEU05hbWVzcGFjZUNvbnRleHQgY29udGV4dCA9IG5ldyBEU05hbWVzcGFjZUNvbnRleHQoKTsKKyAgICAgICAgeHBhdGguc2V0TmFtZXNwYWNlQ29udGV4dChjb250ZXh0KTsKKworICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9ICIvL2RzOlNpZ25hdHVyZVsxXSI7CisgICAgICAgIEVsZW1lbnQgc2lnRWxlbWVudCA9CisgICAgICAgICAgICAoRWxlbWVudCkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgZG9jLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKworICAgICAgICBleHByZXNzaW9uID0gIi8vZW52OkJvZHlbMV0iOworICAgICAgICBjb250ZXh0LnB1dFByZWZpeCgiZW52IiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvMTIvc29hcC1lbnZlbG9wZSIpOworICAgICAgICBFbGVtZW50IGJvZHlFbGVtZW50ID0KKyAgICAgICAgICAgIChFbGVtZW50KSB4cGF0aC5ldmFsdWF0ZShleHByZXNzaW9uLCBkb2MsIFhQYXRoQ29uc3RhbnRzLk5PREUpOworICAgICAgICBib2R5RWxlbWVudC5zZXRJZEF0dHJpYnV0ZU5TKCJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy9zb2FwL3NlY3VyaXR5LzIwMDAtMTIiLCAiaWQiLCB0cnVlKTsKKworICAgICAgICBYTUxTaWduYXR1cmUgc2lnID0gbmV3IFhNTFNpZ25hdHVyZShzaWdFbGVtZW50LCBCYXNlVVJJKTsKKyAgICAgICAgYm9vbGVhbiB2ZXJpZnkgPSBzaWcuY2hlY2tTaWduYXR1cmVWYWx1ZShzaWcuZ2V0S2V5SW5mbygpLmdldFB1YmxpY0tleSgpKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBzaWduYXR1cmUgaXMiICsgKHZlcmlmeSA/ICIgIiA6ICIgbm90ICIpICsgInZhbGlkIik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaWcuZ2V0U2lnbmVkSW5mbygpLmdldFNpZ25lZENvbnRlbnRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBib29sZWFuIHRoaXNPbmVXYXNTaWduZWQgPQorICAgICAgICAgICAgICAgIHNpZy5nZXRTaWduZWRJbmZvKCkuZ2V0VmVyaWZpY2F0aW9uUmVzdWx0KGkpOworCisgICAgICAgICAgICBpZiAodGhpc09uZVdhc1NpZ25lZCkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tIFNpZ25lZCBDb250ZW50IGZvbGxvd3MgLS0tIik7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoc2lnLmdldFNpZ25lZEluZm8oKS5nZXRTaWduZWRDb250ZW50SXRlbShpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIiKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQcmlvciB0cmFuc2Zvcm1zIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgIG5ldyBTdHJpbmcoc2lnLmdldFNpZ25lZEluZm8oKS5nZXRSZWZlcmVuY2VkQ29udGVudEJlZm9yZVRyYW5zZm9ybXNJdGVtKDApLmdldEJ5dGVzKCkpCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL0RTTmFtZXNwYWNlQ29udGV4dC5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL0RTTmFtZXNwYWNlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Y2NkYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvRFNOYW1lc3BhY2VDb250ZXh0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5OYW1lc3BhY2VDb250ZXh0OworCisvKioKKyAqIEEgTmFtZXNwYWNlQ29udGV4dCBpbXBsZW1lbnRhdGlvbiBmb3IgZGlnaXRhbCBzaWduYXR1cmVzCisgKi8KK3B1YmxpYyBjbGFzcyBEU05hbWVzcGFjZUNvbnRleHQgaW1wbGVtZW50cyBOYW1lc3BhY2VDb250ZXh0IHsKKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VNYXAgPQorICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgIHB1YmxpYyBEU05hbWVzcGFjZUNvbnRleHQoKSB7CisgICAgICAgIG5hbWVzcGFjZU1hcC5wdXQoImRzIiwgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRFNOYW1lc3BhY2VDb250ZXh0KE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZXNwYWNlcykgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIG5hbWVzcGFjZU1hcC5wdXRBbGwobmFtZXNwYWNlcyk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lc3BhY2VVUkkoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgcmV0dXJuIG5hbWVzcGFjZU1hcC5nZXQoYXJnMCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcHV0UHJlZml4KFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UpIHsKKyAgICAgICAgbmFtZXNwYWNlTWFwLnB1dChwcmVmaXgsIG5hbWVzcGFjZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIGFyZzApIHsKKyAgICAgICAgZm9yIChTdHJpbmcga2V5IDogbmFtZXNwYWNlTWFwLmtleVNldCgpKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBuYW1lc3BhY2VNYXAuZ2V0KGtleSk7CisgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKGFyZzApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBnZXRQcmVmaXhlcyhTdHJpbmcgYXJnMCkgeworICAgICAgICByZXR1cm4gbmFtZXNwYWNlTWFwLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL015UmVzb2x2ZXIuamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9NeVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5ODdiZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9NeVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLnJlc29sdmVyLlJlc291cmNlUmVzb2x2ZXJTcGk7CitpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKKworLyoqCisgKiBAYXV0aG9yICRBdXRob3IkCisgKi8KK3B1YmxpYyBjbGFzcyBNeVJlc29sdmVyIGV4dGVuZHMgUmVzb3VyY2VSZXNvbHZlclNwaSB7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZW5naW5lUmVzb2x2ZQorICAgICAqIEBpbmhlcml0RG9jCisgICAgICogQHBhcmFtIHVyaQorICAgICAqIEBwYXJhbSBCYXNlVVJJCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgWE1MU2lnbmF0dXJlSW5wdXQgZW5naW5lUmVzb2x2ZShBdHRyIHVyaSwgU3RyaW5nIEJhc2VVUkkpIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaXMgPQorICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJzdHJpbmciLmdldEJ5dGVzKCkpOworICAgICAgICByZXR1cm4gbmV3IFhNTFNpZ25hdHVyZUlucHV0KGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZW5naW5lQ2FuUmVzb2x2ZQorICAgICAqIEBpbmhlcml0RG9jCisgICAgICogQHBhcmFtIHVyaQorICAgICAqIEBwYXJhbSBCYXNlVVJJCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmdpbmVDYW5SZXNvbHZlKEF0dHIgdXJpLCBTdHJpbmcgQmFzZVVSSSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9TYW1wbGVVdGlscy5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL1NhbXBsZVV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIyNTZjOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9TYW1wbGVVdGlscy5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK3B1YmxpYyBjbGFzcyBTYW1wbGVVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgY3JlYXRlRFNjdHgKKyAgICAgKgorICAgICAqIEBwYXJhbSBkb2MKKyAgICAgKiBAcGFyYW0gcHJlZml4CisgICAgICogQHBhcmFtIG5hbWVzcGFjZQorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50IGNyZWF0ZURTY3R4CisgICAgICAgIChEb2N1bWVudCBkb2MsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBuYW1lc3BhY2UpIHsKKworICAgICAgICBpZiAoKHByZWZpeCA9PSBudWxsKSB8fCAocHJlZml4LnRyaW0oKS5sZW5ndGgoKSA9PSAwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWW91IG11c3Qgc3VwcGx5IGEgcHJlZml4Iik7CisgICAgICAgIH0KKworICAgICAgICBFbGVtZW50IGN0eCA9IGRvYy5jcmVhdGVFbGVtZW50TlMobnVsbCwgIm5hbWVzcGFjZUNvbnRleHQiKTsKKworICAgICAgICBjdHguc2V0QXR0cmlidXRlTlMKKyAgICAgICAgICAgIChDb25zdGFudHMuTmFtZXNwYWNlU3BlY05TLCAieG1sbnM6IiArIHByZWZpeC50cmltKCksIG5hbWVzcGFjZSk7CisKKyAgICAgICAgcmV0dXJuIGN0eDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvYWxnb3JpdGhtcy9ITWFjU0hBMVJvdW5kVHJpcC5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2FsZ29yaXRobXMvSE1hY1NIQTFSb3VuZFRyaXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjRkNjVhCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2FsZ29yaXRobXMvSE1hY1NIQTFSb3VuZFRyaXAuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuYWxnb3JpdGhtczsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKK2ltcG9ydCBqYXZheC5jcnlwdG8uc3BlYy5TZWNyZXRLZXlTcGVjOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYWxnb3JpdGhtcy5TaWduYXR1cmVBbGdvcml0aG07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworCisvKioKKyAqCisgKiBAYXV0aG9yICRBdXRob3IkCisgKi8KK3B1YmxpYyBjbGFzcyBITWFjU0hBMVJvdW5kVHJpcCB7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGtleXN0b3JlVHlwZSA9ICJKS1MiOworICAgICAgICBTdHJpbmcga2V5c3RvcmVGaWxlID0gInNhbXBsZXMvZGF0YS9rZXlzdG9yZS5qa3MiOworICAgICAgICBTdHJpbmcga2V5c3RvcmVQYXNzID0gInhtbHNlY3VyaXR5IjsKKyAgICAgICAgU3RyaW5nIHByaXZhdGVLZXlBbGlhcyA9ICJ0ZXN0IjsKKyAgICAgICAgU3RyaW5nIHByaXZhdGVLZXlQYXNzID0gInhtbHNlY3VyaXR5IjsKKyAgICAgICAgU3RyaW5nIGNlcnRpZmljYXRlQWxpYXMgPSAidGVzdCI7CisgICAgICAgIEZpbGUgc2lnbmF0dXJlRmlsZSA9IG5ldyBGaWxlKCJzaWduYXR1cmUueG1sIik7CisKKyAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShrZXlzdG9yZVR5cGUpOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShrZXlzdG9yZUZpbGUpOworCisgICAgICAgIGtzLmxvYWQoZmlzLCBrZXlzdG9yZVBhc3MudG9DaGFyQXJyYXkoKSk7CisKKyAgICAgICAgUHJpdmF0ZUtleSBwcml2YXRlS2V5ID0KKyAgICAgICAgICAgIChQcml2YXRlS2V5KSBrcy5nZXRLZXkocHJpdmF0ZUtleUFsaWFzLCBwcml2YXRlS2V5UGFzcy50b0NoYXJBcnJheSgpKTsKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPQorICAgICAgICAgICAgKFg1MDlDZXJ0aWZpY2F0ZSkga3MuZ2V0Q2VydGlmaWNhdGUoY2VydGlmaWNhdGVBbGlhcyk7CisgICAgICAgIFB1YmxpY0tleSBwdWJsaWNLZXkgPSBjZXJ0LmdldFB1YmxpY0tleSgpOworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5uZXdEb2N1bWVudCgpOworCisgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobSBzYSA9CisgICAgICAgICAgICBuZXcgU2lnbmF0dXJlQWxnb3JpdGhtKGRvYywgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNkc2Etc2hhMSIpOworCisgICAgICAgIHNhLmluaXRTaWduKHByaXZhdGVLZXkpOworICAgICAgICBzYS51cGRhdGUoInNkamhma2phc2hramYiLmdldEJ5dGVzKCkpOworCisgICAgICAgIGJ5dGUgc2lnbmF0dXJlVmFsdWVbXSA9IHNhLnNpZ24oKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQmFzZTY0LmVuY29kZShzaWduYXR1cmVWYWx1ZSkpOworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoc2EuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgWE1MVXRpbHMub3V0cHV0RE9NKGRvYywgU3lzdGVtLm91dCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisKKyAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtIHZlcmlmaWVyID0KKyAgICAgICAgICAgIG5ldyBTaWduYXR1cmVBbGdvcml0aG0oZG9jLmdldERvY3VtZW50RWxlbWVudCgpLCAiZmlsZToiKTsKKworICAgICAgICB2ZXJpZmllci5pbml0VmVyaWZ5KHB1YmxpY0tleSk7CisgICAgICAgIHZlcmlmaWVyLnVwZGF0ZSgic2RqaGZramFzaGtqZiIuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB2ZXJpZmllci52ZXJpZnkoc2lnbmF0dXJlVmFsdWUpOworCisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSXQgdmVyaWZpZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSXQgZmFpbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpblNoYTEKKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluU2hhMShTdHJpbmcgdW51c2VkW10pIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5uZXdEb2N1bWVudCgpOworCisgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobSBzYSA9CisgICAgICAgICAgICBuZXcgU2lnbmF0dXJlQWxnb3JpdGhtKGRvYywgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNobWFjLXNoYTEiLCAzMyk7CisKKyAgICAgICAgYnl0ZSBrZXlieXRlc1tdID0gIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Ii5nZXRCeXRlcygpOworICAgICAgICBTZWNyZXRLZXkgc2sgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXlieXRlcywgc2EuZ2V0SkNFQWxnb3JpdGhtU3RyaW5nKCkpOworCisgICAgICAgIHNhLmluaXRTaWduKHNrKTsKKyAgICAgICAgc2EudXBkYXRlKCJzZGpoZmtqYXNoa2pmIi5nZXRCeXRlcygpKTsKKworICAgICAgICBieXRlIHNpZ25hdHVyZVZhbHVlW10gPSBzYS5zaWduKCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEJhc2U2NC5lbmNvZGUoc2lnbmF0dXJlVmFsdWUpKTsKKyAgICAgICAgZG9jLmFwcGVuZENoaWxkKHNhLmdldEVsZW1lbnQoKSk7CisgICAgICAgIFhNTFV0aWxzLm91dHB1dERPTShkb2MsIFN5c3RlbS5vdXQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiIpOworCisgICAgICAgIGphdmF4LmNyeXB0by5NYWMgYTsKKyAgICAgICAgU2lnbmF0dXJlQWxnb3JpdGhtIHZlcmlmaWVyID0KKyAgICAgICAgICAgIG5ldyBTaWduYXR1cmVBbGdvcml0aG0oZG9jLmdldERvY3VtZW50RWxlbWVudCgpLCAiZmlsZToiKTsKKyAgICAgICAgU2VjcmV0S2V5IHBrID0KKyAgICAgICAgICAgIG5ldyBTZWNyZXRLZXlTcGVjKCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIuZ2V0Qnl0ZXMoKSwgdmVyaWZpZXIuZ2V0SkNFQWxnb3JpdGhtU3RyaW5nKCkpOworCisgICAgICAgIHZlcmlmaWVyLmluaXRWZXJpZnkocGspOworICAgICAgICB2ZXJpZmllci51cGRhdGUoInNkamhma2phc2hramYiLmdldEJ5dGVzKCkpOworCisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gdmVyaWZpZXIudmVyaWZ5KHNpZ25hdHVyZVZhbHVlKTsKKworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkl0IHZlcmlmaWVkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkl0IGZhaWxlZCIpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvY2Fub25pY2FsaXphdGlvbi9DYW5vbkJ5VHJhbnNmb3JtLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvY2Fub25pY2FsaXphdGlvbi9DYW5vbkJ5VHJhbnNmb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1MzA1MAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9jYW5vbmljYWxpemF0aW9uL0Nhbm9uQnlUcmFuc2Zvcm0uamF2YQpAQCAtMCwwICsxLDkyIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5jYW5vbmljYWxpemF0aW9uOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMuVHJhbnNmb3JtczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCisvKioKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEdldWVyLVBvbGxtYW5uCisgKi8KK3B1YmxpYyBjbGFzcyBDYW5vbkJ5VHJhbnNmb3JtIHsKKyAgICBzdGF0aWMgU3RyaW5nIGlucHV0ID0gIiIKKyAgICAgICAgKyAiPCFET0NUWVBFIGRvYyBbPCFBVFRMSVNUIGU5IGF0dHIgQ0RBVEEgXCJkZWZhdWx0XCI+XT5cbiIKKyAgICAgICAgKyAiPCEtLSBDb21tZW50IDIgLS0+PGRvYz48IS0tIGNvbW1lbnQgaW5zaWRlIC0tPlxuIgorICAgICAgICArICIgICA8ZTEgICAvPlxuIgorICAgICAgICArICIgICA8ZTIgICA+PC9lMj5cbiIKKyAgICAgICAgKyAiICAgPGUzICAgIG5hbWUgPSBcImVsZW0zXCIgICBpZD1cImVsZW0zXCIgICAgLz5cbiIKKyAgICAgICAgKyAiICAgPGU0ICAgIG5hbWU9XCJlbGVtNFwiICAgaWQ9XCJlbGVtNFwiICAgID48L2U0PlxuIgorICAgICAgICArICIgICA8ZTUgYTphdHRyPVwib3V0XCIgYjphdHRyPVwic29ydGVkXCIgYXR0cjI9XCJhbGxcIiBhdHRyPVwiSSdtXCJcbiIKKyAgICAgICAgKyAiICAgICAgIHhtbG5zOmI9XCJodHRwOi8vd3d3LmlldGYub3JnXCJcbiIKKyAgICAgICAgKyAiICAgICAgIHhtbG5zOmE9XCJodHRwOi8vd3d3LnczLm9yZ1wiXG4iCisgICAgICAgICsgIiAgICAgICB4bWxucz1cImh0dHA6Ly9leGFtcGxlLm9yZ1wiLz5cbiIKKyAgICAgICAgKyAiICAgPGU2IHhtbG5zPVwiXCIgeG1sbnM6YT1cImh0dHA6Ly93d3cudzMub3JnXCI+XG4iCisgICAgICAgICsgIiAgICAgICA8ZTcgeG1sbnM9XCJodHRwOi8vd3d3LmlldGYub3JnXCI+XG4iCisgICAgICAgICsgIiAgICAgICAgICAgPGU4IHhtbG5zPVwiXCIgeG1sbnM6YT1cImh0dHA6Ly93d3cudzMub3JnXCI+XG4iCisgICAgICAgICsgIiAgICAgICAgICAgICAgIDxlOSB4bWxucz1cIlwiIHhtbG5zOmE9XCJodHRwOi8vd3d3LmlldGYub3JnXCIvPlxuIgorICAgICAgICArICIgICAgICAgICAgICAgICA8dGV4dD4mIzE2OTs8L3RleHQ+XG4iCisgICAgICAgICsgIiAgICAgICAgICAgPC9lOD5cbiIKKyAgICAgICAgKyAiICAgICAgIDwvZTc+XG4iCisgICAgICAgICsgIiAgIDwvZTY+XG4iCisgICAgICAgICsgIjwvZG9jPjwhLS0gQ29tbWVudCAzIC0tPlxuIgorICAgICAgICA7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBkZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOworCisgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKworICAgICAgICAvLyB0aGlzIGlzIHRvIHRocm93IGF3YXkgYWxsIHZhbGlkYXRpb24gd2FybmluZ3MKKyAgICAgICAgZG9jdW1lbnRCdWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSWdub3JlQWxsRXJyb3JIYW5kbGVyKCkpOworCisgICAgICAgIGJ5dGUgaW5wdXRCeXRlc1tdID0gaW5wdXQuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgRG9jdW1lbnQgaW5wdXREb2MgPQorICAgICAgICAgICAgZG9jdW1lbnRCdWlsZGVyLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dEJ5dGVzKSk7CisKKyAgICAgICAgLy8gYWZ0ZXIgcGxheWluZyBhcm91bmQsIHdlIGhhdmUgb3VyIGRvY3VtZW50IG5vdworICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBzaWduYXR1cmVJbnB1dCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dCgoTm9kZSkgaW5wdXREb2MpOworICAgICAgICBEb2N1bWVudCB0cmFuc2Zvcm1Eb2MgPSBkb2N1bWVudEJ1aWxkZXIubmV3RG9jdW1lbnQoKTsKKworICAgICAgICBUcmFuc2Zvcm1zIGMxNG5UcmFucyA9IG5ldyBUcmFuc2Zvcm1zKHRyYW5zZm9ybURvYyk7CisgICAgICAgIHRyYW5zZm9ybURvYy5hcHBlbmRDaGlsZChjMTRuVHJhbnMuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgYzE0blRyYW5zLmFkZFRyYW5zZm9ybSgiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzIik7CisgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IGMxNG5SZXN1bHQgPSBjMTRuVHJhbnMucGVyZm9ybVRyYW5zZm9ybXMoc2lnbmF0dXJlSW5wdXQpOworICAgICAgICBieXRlIG91dHB1dEJ5dGVzW10gPSBjMTRuUmVzdWx0LmdldEJ5dGVzKCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcob3V0cHV0Qnl0ZXMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvY2Fub25pY2FsaXphdGlvbi9DYW5vbkRpcmVjdC5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2Nhbm9uaWNhbGl6YXRpb24vQ2Fub25EaXJlY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I1OWRkCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2Nhbm9uaWNhbGl6YXRpb24vQ2Fub25EaXJlY3QuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5jYW5vbmljYWxpemF0aW9uOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYzE0bi5DYW5vbmljYWxpemVyOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworCisvKioKKyAqCisgKgorICogQGF1dGhvciBDaHJpc3RpYW4gR2V1ZXItUG9sbG1hbm4KKyAqLworcHVibGljIGNsYXNzIENhbm9uRGlyZWN0IHsKKyAgICBzdGF0aWMgU3RyaW5nIGlucHV0ID0gIiIKKyAgICAgICAgKyAiPCFET0NUWVBFIGRvYyBbPCFBVFRMSVNUIGU5IGF0dHIgQ0RBVEEgXCJkZWZhdWx0XCI+XT5cbiIKKyAgICAgICAgKyAiPCEtLSBDb21tZW50IDIgLS0+PGRvYz5cbiIKKyAgICAgICAgKyAiICAgPGUxICAgLz5cbiIKKyAgICAgICAgKyAiICAgPGUyICAgPjwvZTI+XG4iCisgICAgICAgICsgIiAgIDxlMyAgICBuYW1lID0gXCJlbGVtM1wiICAgaWQ9XCJlbGVtM1wiICAgIC8+XG4iCisgICAgICAgICsgIiAgIDxlNCAgICBuYW1lPVwiZWxlbTRcIiAgIGlkPVwiZWxlbTRcIiAgICA+PC9lND5cbiIKKyAgICAgICAgKyAiICAgPGU1IGE6YXR0cj1cIm91dFwiIGI6YXR0cj1cInNvcnRlZFwiIGF0dHIyPVwiYWxsXCIgYXR0cj1cIkknbVwiXG4iCisgICAgICAgICsgIiAgICAgICB4bWxuczpiPVwiaHR0cDovL3d3dy5pZXRmLm9yZ1wiXG4iCisgICAgICAgICsgIiAgICAgICB4bWxuczphPVwiaHR0cDovL3d3dy53My5vcmdcIlxuIgorICAgICAgICArICIgICAgICAgeG1sbnM9XCJodHRwOi8vZXhhbXBsZS5vcmdcIi8+XG4iCisgICAgICAgICsgIiAgIDxlNiB4bWxucz1cIlwiIHhtbG5zOmE9XCJodHRwOi8vd3d3LnczLm9yZ1wiPlxuIgorICAgICAgICArICIgICAgICAgPGU3IHhtbG5zPVwiaHR0cDovL3d3dy5pZXRmLm9yZ1wiPlxuIgorICAgICAgICArICIgICAgICAgICAgIDxlOCB4bWxucz1cIlwiIHhtbG5zOmE9XCJodHRwOi8vd3d3LnczLm9yZ1wiPlxuIgorICAgICAgICArICIgICAgICAgICAgICAgICA8ZTkgeG1sbnM9XCJcIiB4bWxuczphPVwiaHR0cDovL3d3dy5pZXRmLm9yZ1wiLz5cbiIKKyAgICAgICAgKyAiICAgICAgICAgICAgICAgPHRleHQ+JiMxNjk7PC90ZXh0PlxuIgorICAgICAgICArICIgICAgICAgICAgIDwvZTg+XG4iCisgICAgICAgICsgIiAgICAgICA8L2U3PlxuIgorICAgICAgICArICIgICA8L2U2PlxuIgorICAgICAgICArICI8L2RvYz48IS0tIENvbW1lbnQgMyAtLT5cbiIKKyAgICAgICAgOworCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBkZmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgZGZhY3Rvcnkuc2V0VmFsaWRhdGluZyh0cnVlKTsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisKKyAgICAgICAgLy8gdGhpcyBpcyB0byB0aHJvdyBhd2F5IGFsbCB2YWxpZGF0aW9uIHdhcm5pbmdzCisgICAgICAgIGRvY3VtZW50QnVpbGRlci5zZXRFcnJvckhhbmRsZXIobmV3IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLklnbm9yZUFsbEVycm9ySGFuZGxlcigpKTsKKworICAgICAgICBieXRlIGlucHV0Qnl0ZXNbXSA9IGlucHV0LmdldEJ5dGVzKCk7CisgICAgICAgIERvY3VtZW50IGRvYyA9CisgICAgICAgICAgICBkb2N1bWVudEJ1aWxkZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0Qnl0ZXMpKTsKKworICAgICAgICAvLyBhZnRlciBwbGF5aW5nIGFyb3VuZCwgd2UgaGF2ZSBvdXIgZG9jdW1lbnQgbm93CisgICAgICAgIENhbm9uaWNhbGl6ZXIgYzE0biA9IENhbm9uaWNhbGl6ZXIuZ2V0SW5zdGFuY2UoCisgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzIik7CisgICAgICAgIGJ5dGUgb3V0cHV0Qnl0ZXNbXSA9IGMxNG4uY2Fub25pY2FsaXplU3VidHJlZShkb2MpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKG91dHB1dEJ5dGVzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2Nhbm9uaWNhbGl6YXRpb24vQ2Fub25TdWJUcmVlLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvY2Fub25pY2FsaXphdGlvbi9DYW5vblN1YlRyZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OThmZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2Nhbm9uaWNhbGl6YXRpb24vQ2Fub25TdWJUcmVlLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLmNhbm9uaWNhbGl6YXRpb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYzE0bi5DYW5vbmljYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuRFNOYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuU2FtcGxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworLyoqCisgKgorICogQGF1dGhvciBDaHJpc3RpYW4gR2V1ZXItUG9sbG1hbm4KKyAqLworcHVibGljIGNsYXNzIENhbm9uU3ViVHJlZSB7CisgICAgc3RhdGljIFN0cmluZyBpbnB1dCA9ICIiCisgICAgICAgICsgIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCI/PlxuIgorICAgICAgICArICI8U2lnbmF0dXJlIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1wiPlxuIgorICAgICAgICArICIgIDxTaWduZWRJbmZvPjwhLS0gY29tbWVudCBpbnNpZGUgLS0+XG4iCisgICAgICAgICsgIiAgICA8Q2Fub25pY2FsaXphdGlvbk1ldGhvZCBBbGdvcml0aG09XCJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNVwiIC8+XG4iCisgICAgICAgICsgIiAgICA8U2lnbmF0dXJlTWV0aG9kIEFsZ29yaXRobT1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNyc2Etc2hhMVwiIC8+XG4iCisgICAgICAgICsgIiAgICA8UmVmZXJlbmNlIFVSST1cImh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0XCI+XG4iCisgICAgICAgICsgIiAgICAgIDxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI3NoYTFcIiAvPlxuIgorICAgICAgICArICIgICAgICA8RGlnZXN0VmFsdWU+NjBOdlp2dGRUQis3VW5sTHAvSDI0cDdoNGJzPTwvRGlnZXN0VmFsdWU+XG4iCisgICAgICAgICsgIiAgICA8L1JlZmVyZW5jZT5cbiIKKyAgICAgICAgKyAiICA8L1NpZ25lZEluZm8+XG4iCisgICAgICAgICsgIiAgPFNpZ25hdHVyZVZhbHVlPlxuIgorICAgICAgICArICIgICAgZktNbXk5R1lGMnM4ckxGclpkVnVnVE9GdVd4MTljY1g3amg1SHFGZDR2TU9ZN0xXQWo1MnlralNkdnRXM2ZOWVxuIgorICAgICAgICArICIgICAgUFBZR0M0TUZMMTlvUFNJZDVHRXNNdEZNcEdYQjNYYUN0b0tqTUNIUXNOMytrb204WW5HZjdHZTFKTlJjR3R5NVxuIgorICAgICAgICArICIgICAgMFVzb1A2QXNqNDcrUVI3UUVDVDY0dW96aWhhNFdSRFZ5WGpEcmcyNFcrVT1cbiIKKyAgICAgICAgKyAiICA8L1NpZ25hdHVyZVZhbHVlPlxuIgorICAgICAgICArICIgIDxLZXlJbmZvPlxuIgorICAgICAgICArICIgICAgPEtleU5hbWU+THVnaDwvS2V5TmFtZT5cbiIKKyAgICAgICAgKyAiICA8L0tleUluZm8+XG4iCisgICAgICAgICsgIjwvU2lnbmF0dXJlPlxuIgorICAgICAgICA7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRmYWN0b3J5ID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBkZmFjdG9yeS5zZXRWYWxpZGF0aW5nKHRydWUpOworCisgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBkZmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKworICAgICAgICAvLyB0aGlzIGlzIHRvIHRocm93IGF3YXkgYWxsIHZhbGlkYXRpb24gd2FybmluZ3MKKyAgICAgICAgZG9jdW1lbnRCdWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSWdub3JlQWxsRXJyb3JIYW5kbGVyKCkpOworCisgICAgICAgIGJ5dGUgaW5wdXRCeXRlc1tdID0gaW5wdXQuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0KKyAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXRCeXRlcykpOworICAgICAgICBDYW5vbmljYWxpemVyIGMxNG4gPQorICAgICAgICAgICAgQ2Fub25pY2FsaXplcgorICAgICAgICAgICAgLmdldEluc3RhbmNlKCJodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSIpOworCisgICAgICAgIFhQYXRoRmFjdG9yeSB4cGYgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgWFBhdGggeHBhdGggPSB4cGYubmV3WFBhdGgoKTsKKyAgICAgICAgeHBhdGguc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgRFNOYW1lc3BhY2VDb250ZXh0KCkpOworCisgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gIi8vZHM6U2lnbmVkSW5mb1sxXSI7CisgICAgICAgIEVsZW1lbnQgc2lnbmVkSW5mbyA9CisgICAgICAgICAgICAoRWxlbWVudCkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgZG9jLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKyAgICAgICAgYnl0ZSBvdXRwdXRCeXRlc1tdID0gYzE0bi5jYW5vbmljYWxpemVTdWJ0cmVlKHNpZ25lZEluZm8pOworCisgICAgICAgIGlmIChvdXRwdXRCeXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhvdXRwdXRCeXRlcykpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2VuY3J5cHRpb24vRGVjcnlwdGVyLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvZW5jcnlwdGlvbi9EZWNyeXB0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNjJlMjY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2VuY3J5cHRpb24vRGVjcnlwdGVyLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLmVuY3J5cHRpb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CisKK2ltcG9ydCBqYXZheC5jcnlwdG8uU2VjcmV0S2V5OworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXlGYWN0b3J5OworaW1wb3J0IGphdmF4LmNyeXB0by5zcGVjLkRFU2VkZUtleVNwZWM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5lbmNyeXB0aW9uLlhNTENpcGhlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5KYXZhVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuRW5jcnlwdGlvbkNvbnN0YW50czsKKworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOworCisvKioKKyAqIFRoaXMgc2FtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZGVjcnlwdCBkYXRhIGluc2lkZSBhbiB4bWwgZG9jdW1lbnQuCisgKgorICogQGF1dGhvciBWaXNoYWwgTWFoYWphbiAoU3VuIE1pY3Jvc3lzdGVtcykKKyAqLworcHVibGljIGNsYXNzIERlY3J5cHRlciB7CisKKyAgICBzdGF0aWMgb3JnLnNsZjRqLkxvZ2dlciBsb2cgPQorICAgICAgICBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoCisgICAgICAgICAgICBEZWNyeXB0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LkluaXQuaW5pdCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIERvY3VtZW50IGxvYWRFbmNyeXB0aW9uRG9jdW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gImJ1aWxkL2VuY3J5cHRlZEluZm8ueG1sIjsKKyAgICAgICAgRmlsZSBlbmNyeXB0aW9uRmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkYi5wYXJzZShlbmNyeXB0aW9uRmlsZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICJFbmNyeXB0aW9uIGRvY3VtZW50IGxvYWRlZCBmcm9tICIgKyBlbmNyeXB0aW9uRmlsZS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKQorICAgICAgICApOworICAgICAgICByZXR1cm4gZG9jdW1lbnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2VjcmV0S2V5IGxvYWRLZXlFbmNyeXB0aW9uS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9ICJidWlsZC9rZWsiOworICAgICAgICBTdHJpbmcgamNlQWxnb3JpdGhtTmFtZSA9ICJERVNlZGUiOworCisgICAgICAgIEZpbGUga2VrRmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKworICAgICAgICBERVNlZGVLZXlTcGVjIGtleVNwZWMgPQorICAgICAgICAgICAgbmV3IERFU2VkZUtleVNwZWMoSmF2YVV0aWxzLmdldEJ5dGVzRnJvbUZpbGUoZmlsZU5hbWUpKTsKKyAgICAgICAgU2VjcmV0S2V5RmFjdG9yeSBza2YgPQorICAgICAgICAgICAgIFNlY3JldEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoamNlQWxnb3JpdGhtTmFtZSk7CisgICAgICAgIFNlY3JldEtleSBrZXkgPSBza2YuZ2VuZXJhdGVTZWNyZXQoa2V5U3BlYyk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgIktleSBlbmNyeXB0aW9uIGtleSBsb2FkZWQgZnJvbSAiICsga2VrRmlsZS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKQorICAgICAgICApOworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgb3V0cHV0RG9jVG9GaWxlKERvY3VtZW50IGRvYywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBlbmNyeXB0aW9uRmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZW5jcnlwdGlvbkZpbGUpOworCisgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7CisgICAgICAgIERPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7CisgICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGYpOworICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOworCisgICAgICAgIGYuY2xvc2UoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgIldyb3RlIGRvY3VtZW50IGNvbnRhaW5pbmcgZGVjcnlwdGVkIGRhdGEgdG8gIiArIGVuY3J5cHRpb25GaWxlLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpCisgICAgICAgICk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBsb2FkRW5jcnlwdGlvbkRvY3VtZW50KCk7CisKKyAgICAgICAgRWxlbWVudCBlbmNyeXB0ZWREYXRhRWxlbWVudCA9CisgICAgICAgICAgICAoRWxlbWVudCkgZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygKKyAgICAgICAgICAgICAgICBFbmNyeXB0aW9uQ29uc3RhbnRzLkVuY3J5cHRpb25TcGVjTlMsCisgICAgICAgICAgICAgICAgRW5jcnlwdGlvbkNvbnN0YW50cy5fVEFHX0VOQ1JZUFRFRERBVEEpLml0ZW0oMCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTG9hZCB0aGUga2V5IHRvIGJlIHVzZWQgZm9yIGRlY3J5cHRpbmcgdGhlIHhtbCBkYXRhCisgICAgICAgICAqIGVuY3J5cHRpb24ga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgS2V5IGtlayA9IGxvYWRLZXlFbmNyeXB0aW9uS2V5KCk7CisKKyAgICAgICAgU3RyaW5nIHByb3ZpZGVyTmFtZSA9ICJCQyI7CisKKyAgICAgICAgWE1MQ2lwaGVyIHhtbENpcGhlciA9CisgICAgICAgICAgICBYTUxDaXBoZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGtleSB0byBiZSB1c2VkIGZvciBkZWNyeXB0aW5nIHhtbCBkYXRhIHdvdWxkIGJlIG9idGFpbmVkCisgICAgICAgICAqIGZyb20gdGhlIGtleWluZm8gb2YgdGhlIEVuY3J5cHRlRGF0YSB1c2luZyB0aGUga2VrLgorICAgICAgICAgKi8KKyAgICAgICAgeG1sQ2lwaGVyLmluaXQoWE1MQ2lwaGVyLkRFQ1JZUFRfTU9ERSwgbnVsbCk7CisgICAgICAgIHhtbENpcGhlci5zZXRLRUsoa2VrKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIGZvbGxvd2luZyBkb0ZpbmFsIGNhbGwgcmVwbGFjZXMgdGhlIGVuY3J5cHRlZCBkYXRhIHdpdGgKKyAgICAgICAgICogZGVjcnlwdGVkIGNvbnRlbnRzIGluIHRoZSBkb2N1bWVudC4KKyAgICAgICAgICovCisgICAgICAgIHhtbENpcGhlci5kb0ZpbmFsKGRvY3VtZW50LCBlbmNyeXB0ZWREYXRhRWxlbWVudCk7CisKKyAgICAgICAgb3V0cHV0RG9jVG9GaWxlKGRvY3VtZW50LCAiYnVpbGQvZGVjcnlwdGVkSW5mby54bWwiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvZW5jcnlwdGlvbi9FbmNyeXB0ZXIuamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9lbmNyeXB0aW9uL0VuY3J5cHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg5M2QzMmQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvZW5jcnlwdGlvbi9FbmNyeXB0ZXIuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuZW5jcnlwdGlvbjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKKworaW1wb3J0IGphdmF4LmNyeXB0by5TZWNyZXRLZXk7CitpbXBvcnQgamF2YXguY3J5cHRvLktleUdlbmVyYXRvcjsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuS2V5SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5lbmNyeXB0aW9uLlhNTENpcGhlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5lbmNyeXB0aW9uLkVuY3J5cHRlZERhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZW5jcnlwdGlvbi5FbmNyeXB0ZWRLZXk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworCitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CisKKy8qKgorICogVGhpcyBzYW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBlbmNyeXB0IGRhdGEgaW5zaWRlIGFuIHhtbCBkb2N1bWVudC4KKyAqCisgKiBAYXV0aG9yIFZpc2hhbCBNYWhhamFuIChTdW4gTWljcm9zeXN0ZW1zKQorICovCitwdWJsaWMgY2xhc3MgRW5jcnlwdGVyIHsKKworICAgIHN0YXRpYyBvcmcuc2xmNGouTG9nZ2VyIGxvZyA9CisgICAgICAgIG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcigKKyAgICAgICAgICAgIEVuY3J5cHRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRG9jdW1lbnQgY3JlYXRlU2FtcGxlRG9jdW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRiLm5ld0RvY3VtZW50KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGEgc2FtcGxlIGRvY3VtZW50LiBJdCB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2U6CisgICAgICAgICAqCisgICAgICAgICAqIDxhcGFjaGU6Um9vdEVsZW1lbnQgeG1sbnM6YXBhY2hlPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbnMvI2FwcDEiPgorICAgICAgICAgKiA8YXBhY2hlOmZvbz5Tb21lIHNpbXBsZSB0ZXh0PC9hcGFjaGU6Zm9vPgorICAgICAgICAgKiA8L2FwYWNoZTpSb290RWxlbWVudD4KKyAgICAgICAgICovCisgICAgICAgIEVsZW1lbnQgcm9vdCA9CisgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9ucy8jYXBwMSIsICJhcGFjaGU6Um9vdEVsZW1lbnQiKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGVOUygKKyAgICAgICAgICAgIENvbnN0YW50cy5OYW1lc3BhY2VTcGVjTlMsICJ4bWxuczphcGFjaGUiLCAiaHR0cDovL3d3dy5hcGFjaGUub3JnL25zLyNhcHAxIgorICAgICAgICApOworICAgICAgICBkb2N1bWVudC5hcHBlbmRDaGlsZChyb290KTsKKworICAgICAgICByb290LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKKworICAgICAgICBFbGVtZW50IGNoaWxkRWxlbWVudCA9CisgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cuYXBhY2hlLm9yZy9ucy8jYXBwMSIsICJhcGFjaGU6Zm9vIik7CisgICAgICAgIGNoaWxkRWxlbWVudC5hcHBlbmRDaGlsZCgKKyAgICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJTb21lIHNpbXBsZSB0ZXh0IikpOworICAgICAgICByb290LmFwcGVuZENoaWxkKGNoaWxkRWxlbWVudCk7CisKKyAgICAgICAgcm9vdC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisKKyAgICAgICAgcmV0dXJuIGRvY3VtZW50OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNlY3JldEtleSBHZW5lcmF0ZUFuZFN0b3JlS2V5RW5jcnlwdGlvbktleSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgamNlQWxnb3JpdGhtTmFtZSA9ICJERVNlZGUiOworICAgICAgICBLZXlHZW5lcmF0b3Iga2V5R2VuZXJhdG9yID0KKyAgICAgICAgICAgIEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZShqY2VBbGdvcml0aG1OYW1lKTsKKyAgICAgICAgU2VjcmV0S2V5IGtlayA9IGtleUdlbmVyYXRvci5nZW5lcmF0ZUtleSgpOworCisgICAgICAgIGJ5dGVbXSBrZXlCeXRlcyA9IGtlay5nZXRFbmNvZGVkKCk7CisgICAgICAgIEZpbGUga2VrRmlsZSA9IG5ldyBGaWxlKCJidWlsZC9rZWsiKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oa2VrRmlsZSk7CisgICAgICAgIGYud3JpdGUoa2V5Qnl0ZXMpOworICAgICAgICBmLmNsb3NlKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiS2V5IGVuY3J5cHRpb24ga2V5IHN0b3JlZCBpbiAiICsga2VrRmlsZS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmV0dXJuIGtlazsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZWNyZXRLZXkgR2VuZXJhdGVEYXRhRW5jcnlwdGlvbktleSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgamNlQWxnb3JpdGhtTmFtZSA9ICJBRVMiOworICAgICAgICBLZXlHZW5lcmF0b3Iga2V5R2VuZXJhdG9yID0KKyAgICAgICAgICAgIEtleUdlbmVyYXRvci5nZXRJbnN0YW5jZShqY2VBbGdvcml0aG1OYW1lKTsKKyAgICAgICAga2V5R2VuZXJhdG9yLmluaXQoMTI4KTsKKyAgICAgICAgcmV0dXJuIGtleUdlbmVyYXRvci5nZW5lcmF0ZUtleSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgb3V0cHV0RG9jVG9GaWxlKERvY3VtZW50IGRvYywgU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBlbmNyeXB0aW9uRmlsZSA9IG5ldyBGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZW5jcnlwdGlvbkZpbGUpOworCisgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOworICAgICAgICB0cmFuc2Zvcm1lci5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7CisgICAgICAgIERPTVNvdXJjZSBzb3VyY2UgPSBuZXcgRE9NU291cmNlKGRvYyk7CisgICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KGYpOworICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc291cmNlLCByZXN1bHQpOworCisgICAgICAgIGYuY2xvc2UoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgIldyb3RlIGRvY3VtZW50IGNvbnRhaW5pbmcgZW5jcnlwdGVkIGRhdGEgdG8gIiArIGVuY3J5cHRpb25GaWxlLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpCisgICAgICAgICk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGNyZWF0ZVNhbXBsZURvY3VtZW50KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IGEga2V5IHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIGVsZW1lbnQuCisgICAgICAgICAqIEhlcmUgd2UgYXJlIGdlbmVyYXRpbmcgYW4gQUVTIGtleS4KKyAgICAgICAgICovCisgICAgICAgIEtleSBzeW1tZXRyaWNLZXkgPSBHZW5lcmF0ZURhdGFFbmNyeXB0aW9uS2V5KCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IGEga2V5IHRvIGJlIHVzZWQgZm9yIGVuY3J5cHRpbmcgdGhlIHN5bW1ldHJpYyBrZXkuCisgICAgICAgICAqIEhlcmUgd2UgYXJlIGdlbmVyYXRpbmcgYSBERVNlZGUga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgS2V5IGtlayA9IEdlbmVyYXRlQW5kU3RvcmVLZXlFbmNyeXB0aW9uS2V5KCk7CisKKyAgICAgICAgU3RyaW5nIGFsZ29yaXRobVVSSSA9IFhNTENpcGhlci5UUklQTEVERVNfS2V5V3JhcDsKKworICAgICAgICBYTUxDaXBoZXIga2V5Q2lwaGVyID0KKyAgICAgICAgICAgIFhNTENpcGhlci5nZXRJbnN0YW5jZShhbGdvcml0aG1VUkkpOworICAgICAgICBrZXlDaXBoZXIuaW5pdChYTUxDaXBoZXIuV1JBUF9NT0RFLCBrZWspOworICAgICAgICBFbmNyeXB0ZWRLZXkgZW5jcnlwdGVkS2V5ID0KKyAgICAgICAgICAgIGtleUNpcGhlci5lbmNyeXB0S2V5KGRvY3VtZW50LCBzeW1tZXRyaWNLZXkpOworCisgICAgICAgIC8qCisgICAgICAgICAqIExldCB1cyBlbmNyeXB0IHRoZSBjb250ZW50cyBvZiB0aGUgZG9jdW1lbnQgZWxlbWVudC4KKyAgICAgICAgICovCisgICAgICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKworICAgICAgICBhbGdvcml0aG1VUkkgPSBYTUxDaXBoZXIuQUVTXzEyODsKKworICAgICAgICBYTUxDaXBoZXIgeG1sQ2lwaGVyID0KKyAgICAgICAgICAgIFhNTENpcGhlci5nZXRJbnN0YW5jZShhbGdvcml0aG1VUkkpOworICAgICAgICB4bWxDaXBoZXIuaW5pdChYTUxDaXBoZXIuRU5DUllQVF9NT0RFLCBzeW1tZXRyaWNLZXkpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldHRpbmcga2V5aW5mbyBpbnNpZGUgdGhlIGVuY3J5cHRlZCBkYXRhIGJlaW5nIHByZXBhcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgRW5jcnlwdGVkRGF0YSBlbmNyeXB0ZWREYXRhID0geG1sQ2lwaGVyLmdldEVuY3J5cHRlZERhdGEoKTsKKyAgICAgICAgS2V5SW5mbyBrZXlJbmZvID0gbmV3IEtleUluZm8oZG9jdW1lbnQpOworICAgICAgICBrZXlJbmZvLmFkZChlbmNyeXB0ZWRLZXkpOworICAgICAgICBlbmNyeXB0ZWREYXRhLnNldEtleUluZm8oa2V5SW5mbyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogZG9GaW5hbCAtCisgICAgICAgICAqICJ0cnVlIiBiZWxvdyBpbmRpY2F0ZXMgdGhhdCB3ZSB3YW50IHRvIGVuY3J5cHQgZWxlbWVudCdzIGNvbnRlbnQKKyAgICAgICAgICogYW5kIG5vdCB0aGUgZWxlbWVudCBpdHNlbGYuIEFsc28sIHRoZSBkb0ZpbmFsIG1ldGhvZCB3b3VsZAorICAgICAgICAgKiBtb2RpZnkgdGhlIGRvY3VtZW50IGJ5IHJlcGxhY2luZyB0aGUgRW5jcnlwdGVEYXRhIGVsZW1lbnQKKyAgICAgICAgICogZm9yIHRoZSBkYXRhIHRvIGJlIGVuY3J5cHRlZC4KKyAgICAgICAgICovCisgICAgICAgIHhtbENpcGhlci5kb0ZpbmFsKGRvY3VtZW50LCByb290RWxlbWVudCwgdHJ1ZSk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT3V0cHV0IHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBlbmNyeXB0ZWQgaW5mb3JtYXRpb24gaW50bworICAgICAgICAgKiBhIGZpbGUuCisgICAgICAgICAqLworICAgICAgICBvdXRwdXREb2NUb0ZpbGUoZG9jdW1lbnQsICJidWlsZC9lbmNyeXB0ZWRJbmZvLnhtbCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9pYWlrL0lBSUtJbnRlck9wLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvaWFpay9JQUlLSW50ZXJPcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTZhZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvaWFpay9JQUlLSW50ZXJPcC5qYXZhCkBAIC0wLDAgKzEsMjA2IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5pYWlrOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuS2V5SW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuRFNOYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuU2FtcGxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLnJlc29sdmVyLlJlc291cmNlUmVzb2x2ZXJTcGk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMucmVzb2x2ZXIuaW1wbGVtZW50YXRpb25zLlJlc29sdmVyQW5vbnltb3VzOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciAkQXV0aG9yJAorICovCitwdWJsaWMgY2xhc3MgSUFJS0ludGVyT3AgeworCisgICAgc3RhdGljIG9yZy5zbGY0ai5Mb2dnZXIgbG9nID0KKyAgICAgICAgb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKElBSUtJbnRlck9wLmNsYXNzKTsKKworICAgIC8qKiBGaWVsZCBzY2hlbWFWYWxpZGF0ZSAqLworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIHNjaGVtYVZhbGlkYXRlID0gZmFsc2U7CisKKyAgICAvKiogRmllbGQgc2lnbmF0dXJlU2NoZW1hRmlsZSAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlU2NoZW1hRmlsZSA9ICJzYW1wbGVzL2RhdGEveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgdW51c2VkW10pIHsKKworICAgICAgICBpZiAoc2NoZW1hVmFsaWRhdGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2UgZG8gc2NoZW1hLXZhbGlkYXRpb24iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2UgZG8gbm90IHNjaGVtYS12YWxpZGF0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgaWYgKElBSUtJbnRlck9wLnNjaGVtYVZhbGlkYXRlKSB7CisgICAgICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2RvbS9kZWZlci1ub2RlLWV4cGFuc2lvbiIsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICBkYmYuc2V0VmFsaWRhdGluZyh0cnVlKTsKKyAgICAgICAgICAgIGRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIGRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9wcm9wZXJ0aWVzL3NjaGVtYS9leHRlcm5hbC1zY2hlbWFMb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMgKyAiICIgKyBJQUlLSW50ZXJPcC5zaWduYXR1cmVTY2hlbWFGaWxlKTsKKyAgICAgICAgfQorCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL25hbWVzcGFjZXMiLCBCb29sZWFuLlRSVUUpOworCisgICAgICAgIFN0cmluZyBncmVnb3JzRGlyID0gInNhbXBsZXMvZGF0YS9hdC9pYWlrL2l4c2lsLyI7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZXNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyZWdvcnNEaXIgKyAic2lnbmF0dXJlQWxnb3JpdGhtcy9zaWduYXR1cmVzL2hNQUNTaWduYXR1cmUueG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGdyZWdvcnNEaXIgKyAic2lnbmF0dXJlQWxnb3JpdGhtcy9zaWduYXR1cmVzL2hNQUNTaG9ydFNpZ25hdHVyZS54bWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZ3JlZ29yc0RpciArICJzaWduYXR1cmVBbGdvcml0aG1zL3NpZ25hdHVyZXMvZFNBU2lnbmF0dXJlLnhtbCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxncmVnb3JzRGlyICsgInNpZ25hdHVyZUFsZ29yaXRobXMvc2lnbmF0dXJlcy9yU0FTaWduYXR1cmUueG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGdyZWdvcnNEaXIgKyAidHJhbnNmb3Jtcy9zaWduYXR1cmVzL2Jhc2U2NERlY29kZVNpZ25hdHVyZS54bWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZ3JlZ29yc0RpciArICJ0cmFuc2Zvcm1zL3NpZ25hdHVyZXMvYzE0blNpZ25hdHVyZS54bWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZ3JlZ29yc0RpciArICJjb3JlRmVhdHVyZXMvc2lnbmF0dXJlcy9tYW5pZmVzdFNpZ25hdHVyZS54bWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsZ3JlZ29yc0RpciArICJ0cmFuc2Zvcm1zL3NpZ25hdHVyZXMveFBhdGhTaWduYXR1cmUueG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGdyZWdvcnNEaXIgKyAiY29yZUZlYXR1cmVzL3NpZ25hdHVyZXMvc2lnbmF0dXJlVHlwZXNTaWduYXR1cmUueG1sIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLGdyZWdvcnNEaXIgKyAidHJhbnNmb3Jtcy9zaWduYXR1cmVzL2VudmVsb3BlZFNpZ25hdHVyZVNpZ25hdHVyZS54bWwiCisgICAgICAgIH07CisgICAgICAgIHZlcmlmeUFub255bW91cyhncmVnb3JzRGlyLCBkYmYpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlRmlsZU5hbWUgPSBmaWxlbmFtZXNbaV07CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5zaWduYXR1cmUKKyAgICAgICAgICAgICAgICAuVmVyaWZ5TWVybGluc0V4YW1wbGVzRmlmdGVlbi52ZXJpZnlITUFDKGRiZiwgc2lnbmF0dXJlRmlsZU5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgWE1MIHNpZ25hdHVyZSBpbiBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzaWduYXR1cmVGaWxlTmFtZSArICIgY3Jhc2hlZCB0aGUgYXBwbGljYXRpb24gKGJhZCkiKTsKKyAgICAgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgZmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlRmlsZU5hbWUgPSBmaWxlbmFtZXNbaV07CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5zaWduYXR1cmUKKyAgICAgICAgICAgICAgICAuVmVyaWZ5TWVybGluc0V4YW1wbGVzU2l4dGVlbi52ZXJpZnkoZGJmLCBzaWduYXR1cmVGaWxlTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBYTUwgc2lnbmF0dXJlIGluIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpZ25hdHVyZUZpbGVOYW1lICsgIiBjcmFzaGVkIHRoZSBhcHBsaWNhdGlvbiAoYmFkKSIpOworICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDI7IGkgPCBmaWxlbmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVGaWxlTmFtZSA9IGZpbGVuYW1lc1tpXTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZQorICAgICAgICAgICAgICAgIC5WZXJpZnlNZXJsaW5zRXhhbXBsZXNUd2VudHlUaHJlZS52ZXJpZnkoZGJmLCBzaWduYXR1cmVGaWxlTmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBYTUwgc2lnbmF0dXJlIGluIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpZ25hdHVyZUZpbGVOYW1lICsgIiBjcmFzaGVkIHRoZSBhcHBsaWNhdGlvbiAoYmFkKSIpOworICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUFub255bW91cyhTdHJpbmcgZ3JlZ29yc0RpciwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYpIHsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0KKyAgICAgICAgICAgIGdyZWdvcnNEaXIgKyAiY29yZUZlYXR1cmVzL3NpZ25hdHVyZXMvYW5vbnltb3VzUmVmZXJlbmNlU2lnbmF0dXJlLnhtbCI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgYW5vbnltb3VzUmVmID0KKyAgICAgICAgICAgICAgICBncmVnb3JzRGlyICsgImNvcmVGZWF0dXJlcy9zYW1wbGVzL2Fub255bW91c1JlZmVyZW5jZUNvbnRlbnQueG1sIjsKKyAgICAgICAgICAgIFJlc291cmNlUmVzb2x2ZXJTcGkgcmVzb2x2ZXIgPSBuZXcgUmVzb2x2ZXJBbm9ueW1vdXMoYW5vbnltb3VzUmVmKTsKKyAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcnkgdG8gdmVyaWZ5ICIgKyBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0gZGIucGFyc2UobmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGYpKTsKKworICAgICAgICAgICAgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgWFBhdGggeHBhdGggPSB4cGYubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwYXRoLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IERTTmFtZXNwYWNlQ29udGV4dCgpKTsKKworICAgICAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSAiLy9kczpTaWduYXR1cmVbMV0iOworICAgICAgICAgICAgRWxlbWVudCBzaWdFbGVtZW50ID0KKyAgICAgICAgICAgICAgICAoRWxlbWVudCkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgZG9jLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKworICAgICAgICAgICAgWE1MU2lnbmF0dXJlIHNpZ25hdHVyZSA9IG5ldyBYTUxTaWduYXR1cmUoc2lnRWxlbWVudCwgZi50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIHNpZ25hdHVyZS5zZXRGb2xsb3dOZXN0ZWRNYW5pZmVzdHMoZmFsc2UpOworICAgICAgICAgICAgc2lnbmF0dXJlLmFkZFJlc291cmNlUmVzb2x2ZXIocmVzb2x2ZXIpOworCisgICAgICAgICAgICBLZXlJbmZvIGtpID0gc2lnbmF0dXJlLmdldEtleUluZm8oKTsKKworICAgICAgICAgICAgaWYgKGtpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9IHNpZ25hdHVyZS5nZXRLZXlJbmZvKCkuZ2V0WDUwOUNlcnRpZmljYXRlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoY2VydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgWE1MIHNpZ25hdHVyZSBpbiBmaWxlICIgKyBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpICsgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICArIChzaWduYXR1cmUuY2hlY2tTaWduYXR1cmVWYWx1ZShjZXJ0KSA/ICJ2YWxpZCAoZ29vZCkiCisgICAgICAgICAgICAgICAgICAgICAgICA6ICJpbnZhbGlkICEhISEhIChiYWQpIikKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBQdWJsaWNLZXkgcGsgPSBzaWduYXR1cmUuZ2V0S2V5SW5mbygpLmdldFB1YmxpY0tleSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSBYTUwgc2lnbmF0dXJlIGluIGZpbGUgIiArIGYudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkgKyAiIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzaWduYXR1cmUuY2hlY2tTaWduYXR1cmVWYWx1ZShwaykgPyAidmFsaWQgKGdvb2QpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogImludmFsaWQgISEhISEgKGJhZCkiKQorICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGlkIG5vdCBmaW5kIGEgcHVibGljIGtleSwgc28gSSBjYW4ndCBjaGVjayB0aGUgc2lnbmF0dXJlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGlkIG5vdCBmaW5kIGEgS2V5SW5mbyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIFhNTCBzaWduYXR1cmUgaW4gZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmaWxlbmFtZSArICIgY3Jhc2hlZCB0aGUgYXBwbGljYXRpb24gKGJhZCkiKTsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9rZXlzL0NyZWF0ZUtleUluZm8uamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9rZXlzL0NyZWF0ZUtleUluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjk1YTBmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL2tleXMvQ3JlYXRlS2V5SW5mby5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLmtleXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLktleUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50Llg1MDlEYXRhOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuY29udGVudC5rZXl2YWx1ZXMuUlNBS2V5VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CisKKy8qKgorICogQ2xhc3MgQ3JlYXRlS2V5SW5mbworICoKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqIEB2ZXJzaW9uICRSZXZpc2lvbiQKKyAqLworcHVibGljIGNsYXNzIENyZWF0ZUtleUluZm8geworCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyB1bnVzZWRbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgiSktTIik7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKAorICAgICAgICAgICAgInNhbXBsZXMvZGF0YS9rZXlzdG9yZS5qa3MiKTsKKworICAgICAgICBrcy5sb2FkKGZpcywgInhtbHNlY3VyaXR5Ii50b0NoYXJBcnJheSgpKTsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0gZGIubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgS2V5SW5mbyBraSA9IG5ldyBLZXlJbmZvKGRvYyk7CisKKyAgICAgICAgZG9jLmFwcGVuZENoaWxkKGtpLmdldEVsZW1lbnQoKSk7CisgICAgICAgIGtpLnNldElkKCJteUtJIik7CisgICAgICAgIGtpLmFkZEtleU5hbWUoIkEgc2ltcGxlIGtleSIpOworCisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkga3MuZ2V0Q2VydGlmaWNhdGUoInRlc3QiKTsKKworICAgICAgICBraS5hZGRLZXlWYWx1ZShjZXJ0LmdldFB1YmxpY0tleSgpKTsKKworICAgICAgICBYNTA5RGF0YSB4NTA5RGF0YSA9IG5ldyBYNTA5RGF0YShkb2MpOworCisgICAgICAgIGtpLmFkZCh4NTA5RGF0YSk7CisgICAgICAgIHg1MDlEYXRhLmFkZENlcnRpZmljYXRlKGNlcnQpOworICAgICAgICB4NTA5RGF0YS5hZGRTdWJqZWN0TmFtZSgiU3ViamVjdCBuYW1lIik7CisgICAgICAgIHg1MDlEYXRhLmFkZElzc3VlclNlcmlhbCgiU3ViamVjdCBuZnNkZmhzIiwgNjc4Nik7CisgICAgICAgIGtpLmFkZChuZXcgUlNBS2V5VmFsdWUoZG9jLCBuZXcgQmlnSW50ZWdlcigiNjc4IiksIG5ldyBCaWdJbnRlZ2VyKCI2ODcwIikpKTsKKyAgICAgICAgWE1MVXRpbHMub3V0cHV0RE9NYzE0bldpdGhDb21tZW50cyhkb2MsIFN5c3RlbS5vdXQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVDb2xsZWN0YWJsZVNpZ25hdHVyZS5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVDb2xsZWN0YWJsZVNpZ25hdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNjA3NzEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL0NyZWF0ZUNvbGxlY3RhYmxlU2lnbmF0dXJlLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLmNvbnRlbnQuS2V5TmFtZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuU2lnbmVkSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMuVHJhbnNmb3JtczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLnBhcmFtcy5YUGF0aENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiBUaGVzZSBvbmVzIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBTaWduYXR1cmVzIHdoaWNoIGNhbiBiZSBjb2xsZWN0ZWQKKyAqIHVzaW5nIHlvdXIgdGV4dCBlZGl0b3JzIGN1dC1hbmQtcGFzdGUgZmVhdHVyZSB0byBjcmVhdGUgYSBmaWxlIHdpY2gKKyAqIGNvbnRhaW5zIG11bHRpcGxlIHNpZ25hdHVyZXMgd2hpY2ggcmVtYWluIHZhbGlkIGFmdGVyIGN1dC1hbmQtcGFzdGUuCisgKgorICogVGhpcyBwcm9ncmFtIGNyZWF0ZXMgYSBTaWduYXR1cmUgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGN1dC1hbmQtcGFzdGUgdG8gYmUKKyAqIHB1dCBpbnRvIGEgbGFyZ2VyIGRvY3VtZW50LgorICoKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqLworcHVibGljIGNsYXNzIENyZWF0ZUNvbGxlY3RhYmxlU2lnbmF0dXJlIHsKKworICAgIHN0YXRpYyBvcmcuc2xmNGouTG9nZ2VyIGxvZyA9CisgICAgICAgIG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcmVhdGVDb2xsZWN0YWJsZVNpZ25hdHVyZS5jbGFzcyk7CisKKyAgICAvKiogRmllbGQgcGFzc3BocmFzZSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIHBhc3NwaHJhc2UgPQorICAgICAgICAiVGhlIHN1cGVyLW1lZ2Etc2VjcmV0IHB1YmxpYyBzdGF0aWMgcGFzc3BocmFzZSI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICAvLyBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHMuc2V0U2lnbmF0dXJlU3BlY05TcHJlZml4KCIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzaWduYXR1cmVGaWxlID0gbmV3IEZpbGUoImJ1aWxkL2NvbGxlY3RhYmxlU2lnbmF0dXJlLnhtbCIpOworICAgICAgICBTdHJpbmcgQmFzZVVSSSA9IHNpZ25hdHVyZUZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCk7CisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0KKyAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2MgPSBkYi5uZXdEb2N1bWVudCgpOworICAgICAgICBFbGVtZW50IHJvb3RFbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhudWxsLCAicm9vdCIpOworCisgICAgICAgIGRvYy5hcHBlbmRDaGlsZChyb290RWxlbWVudCk7CisKKyAgICAgICAgRWxlbWVudCBzaWduZWRSZXNvdXJjZUVsZW1lbnQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG51bGwsICJzaWduZWRDb250ZW50Iik7CisKKyAgICAgICAgc2lnbmVkUmVzb3VyY2VFbGVtZW50LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiU2lnbmVkIFRleHRcbiIpKTsKKyAgICAgICAgcm9vdEVsZW1lbnQuYXBwZW5kQ2hpbGQoc2lnbmVkUmVzb3VyY2VFbGVtZW50KTsKKworICAgICAgICBYTUxTaWduYXR1cmUgc2lnID0KKyAgICAgICAgICAgIG5ldyBYTUxTaWduYXR1cmUoZG9jLCBCYXNlVVJJLCBYTUxTaWduYXR1cmUuQUxHT19JRF9NQUNfSE1BQ19TSEExKTsKKworICAgICAgICBzaWduZWRSZXNvdXJjZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc2lnLmdldEVsZW1lbnQoKSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIHJvb3RuYW1lc3BhY2UgPSBzaWduZWRSZXNvdXJjZUVsZW1lbnQuZ2V0TmFtZXNwYWNlVVJJKCk7CisgICAgICAgICAgICBib29sZWFuIHJvb3RwcmVmaXhlZCA9IChyb290bmFtZXNwYWNlICE9IG51bGwpICYmIChyb290bmFtZXNwYWNlLmxlbmd0aCgpID4gMCk7CisgICAgICAgICAgICBTdHJpbmcgcm9vdGxvY2FsbmFtZSA9IHNpZ25lZFJlc291cmNlRWxlbWVudC5nZXROb2RlTmFtZSgpOworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKyAgICAgICAgICAgIFhQYXRoQ29udGFpbmVyIHhwYXRoID0gbmV3IFhQYXRoQ29udGFpbmVyKGRvYyk7CisKKyAgICAgICAgICAgIHhwYXRoLnNldFhQYXRoTmFtZXNwYWNlQ29udGV4dCgiZHMiLCBDb25zdGFudHMuU2lnbmF0dXJlU3BlY05TKTsKKworICAgICAgICAgICAgaWYgKHJvb3RwcmVmaXhlZCkgeworICAgICAgICAgICAgICAgIHhwYXRoLnNldFhQYXRoTmFtZXNwYWNlQ29udGV4dCgicm9vdCIsIHJvb3RuYW1lc3BhY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgeHBhdGhTdHIgPSAiXG4iCisgICAgICAgICAgICAgICAgKyAiY291bnQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsgIlxuIgorICAgICAgICAgICAgICAgICsgIiBhbmNlc3Rvci1vci1zZWxmOjoiICsgKHJvb3RwcmVmaXhlZCA/ICJyb290OiIgOiAiIikgKyByb290bG9jYWxuYW1lICsgIiIgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsgIlxuIgorICAgICAgICAgICAgICAgICsgIiBoZXJlKCkvYW5jZXN0b3I6OiIgKyAocm9vdHByZWZpeGVkID8gInJvb3Q6IiA6ICIiKSArIHJvb3Rsb2NhbG5hbWUgKyAiWzFdICIgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiKSA8PSBjb3VudCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArICJcbiIKKyAgICAgICAgICAgICAgICArICIgYW5jZXN0b3Itb3Itc2VsZjo6IiArIChyb290cHJlZml4ZWQgPyAicm9vdDoiIDogIiIpICsgcm9vdGxvY2FsbmFtZSArICIiICsgIlxuIgorICAgICAgICAgICAgICAgICsgIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArICJcbiIKKyAgICAgICAgICAgICAgICArICIgYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiY291bnQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsgIlxuIgorICAgICAgICAgICAgICAgICsgIiBhbmNlc3Rvci1vci1zZWxmOjpkczpTaWduYXR1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArICJcbiIKKyAgICAgICAgICAgICAgICArICIgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiIGhlcmUoKS9hbmNlc3Rvcjo6ZHM6U2lnbmF0dXJlWzFdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsgIlxuIgorICAgICAgICAgICAgICAgICsgIikgPiBjb3VudCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiArICJcbiIKKyAgICAgICAgICAgICAgICArICIgYW5jZXN0b3Itb3Itc2VsZjo6ZHM6U2lnbmF0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKyAiXG4iCisgICAgICAgICAgICAgICAgKyAiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICsgIlxuIgorCisKKworICAgICAgICAgICAgICAgIDsKKyAgICAgICAgICAgIHhwYXRoLnNldFhQYXRoKHhwYXRoU3RyKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX1hQQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBhdGguZ2V0RWxlbWVudFBsdXNSZXR1cm5zKCkpOworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIiLCB0cmFuc2Zvcm1zLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBzaWcuZ2V0S2V5SW5mbygpLmFkZChuZXcgS2V5TmFtZShkb2MsIENyZWF0ZUNvbGxlY3RhYmxlU2lnbmF0dXJlLnBhc3NwaHJhc2UpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RhcnQgc2lnbmluZyIpOworICAgICAgICAgICAgc2lnLnNpZ24oc2lnLmNyZWF0ZVNlY3JldEtleShDcmVhdGVDb2xsZWN0YWJsZVNpZ25hdHVyZS5wYXNzcGhyYXNlLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoZWQgc2lnbmluZyIpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc2lnbmF0dXJlRmlsZSk7CisKKyAgICAgICAgWE1MVXRpbHMub3V0cHV0RE9NYzE0bldpdGhDb21tZW50cyhkb2MsIGYpOworICAgICAgICBmLmNsb3NlKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JvdGUgc2lnbmF0dXJlIHRvICIgKyBCYXNlVVJJKTsKKworICAgICAgICBTaWduZWRJbmZvIHMgPSBzaWcuZ2V0U2lnbmVkSW5mbygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5nZXRTaWduZWRDb250ZW50TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIFNpZ25lZCBSZXNvdXJjZSAiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAjIyMjIyMjIyMjIyMjIyMjIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhzLmdldFNpZ25lZENvbnRlbnRJdGVtKGkpKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVFbnZlbG9waW5nU2lnbmF0dXJlLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL0NyZWF0ZUVudmVsb3BpbmdTaWduYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjE1ZDcxCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVFbnZlbG9waW5nU2lnbmF0dXJlLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5PYmplY3RDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLlRyYW5zZm9ybXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciAkQXV0aG9yJAorICovCitwdWJsaWMgY2xhc3MgQ3JlYXRlRW52ZWxvcGluZ1NpZ25hdHVyZSB7CisKKyAgICBzdGF0aWMgb3JnLnNsZjRqLkxvZ2dlciBsb2cgPQorICAgICAgICBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3JlYXRlU2lnbmF0dXJlLmNsYXNzKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LkluaXQuaW5pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBtYWluCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW51c2VkCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgdW51c2VkW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcga2V5c3RvcmVUeXBlID0gIkpLUyI7CisgICAgICAgIFN0cmluZyBrZXlzdG9yZUZpbGUgPSAic2FtcGxlcy9kYXRhL2tleXN0b3JlLmprcyI7CisgICAgICAgIFN0cmluZyBrZXlzdG9yZVBhc3MgPSAieG1sc2VjdXJpdHkiOworICAgICAgICBTdHJpbmcgcHJpdmF0ZUtleUFsaWFzID0gInRlc3QiOworICAgICAgICBTdHJpbmcgcHJpdmF0ZUtleVBhc3MgPSAieG1sc2VjdXJpdHkiOworICAgICAgICBTdHJpbmcgY2VydGlmaWNhdGVBbGlhcyA9ICJ0ZXN0IjsKKyAgICAgICAgRmlsZSBzaWduYXR1cmVGaWxlID0gbmV3IEZpbGUoImJ1aWxkL3NpZ25hdHVyZS54bWwiKTsKKworICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKGtleXN0b3JlVHlwZSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGtleXN0b3JlRmlsZSk7CisKKyAgICAgICAga3MubG9hZChmaXMsIGtleXN0b3JlUGFzcy50b0NoYXJBcnJheSgpKTsKKworICAgICAgICBQcml2YXRlS2V5IHByaXZhdGVLZXkgPQorICAgICAgICAgICAgKFByaXZhdGVLZXkpIGtzLmdldEtleShwcml2YXRlS2V5QWxpYXMsIHByaXZhdGVLZXlQYXNzLnRvQ2hhckFycmF5KCkpOworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0gZGIubmV3RG9jdW1lbnQoKTsKKyAgICAgICAgU3RyaW5nIEJhc2VVUkkgPSBzaWduYXR1cmVGaWxlLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpOworICAgICAgICBYTUxTaWduYXR1cmUgc2lnID0KKyAgICAgICAgICAgIG5ldyBYTUxTaWduYXR1cmUoZG9jLCBCYXNlVVJJLCBYTUxTaWduYXR1cmUuQUxHT19JRF9TSUdOQVRVUkVfRFNBKTsKKworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoc2lnLmdldEVsZW1lbnQoKSk7CisKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0Q29udGFpbmVyIG9iaiA9IG5ldyBPYmplY3RDb250YWluZXIoZG9jKTsKKyAgICAgICAgICAgIEVsZW1lbnQgYW5FbGVtZW50ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhudWxsLCAiSW5zaWRlT2JqZWN0Iik7CisKKyAgICAgICAgICAgIGFuRWxlbWVudC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIkEgdGV4dCBpbiBhIGJveCIpKTsKKyAgICAgICAgICAgIG9iai5hcHBlbmRDaGlsZChhbkVsZW1lbnQpOworCisgICAgICAgICAgICBTdHJpbmcgSWQgPSAiVGhlRmlyc3RPYmplY3QiOworCisgICAgICAgICAgICBvYmouc2V0SWQoSWQpOworICAgICAgICAgICAgc2lnLmFwcGVuZE9iamVjdChvYmopOworCisgICAgICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworCisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9DMTROX1dJVEhfQ09NTUVOVFMpOworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjIiArIElkLCB0cmFuc2Zvcm1zLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9CisgICAgICAgICAgICAgICAgKFg1MDlDZXJ0aWZpY2F0ZSkga3MuZ2V0Q2VydGlmaWNhdGUoY2VydGlmaWNhdGVBbGlhcyk7CisKKyAgICAgICAgICAgIHNpZy5hZGRLZXlJbmZvKGNlcnQpOworICAgICAgICAgICAgc2lnLmFkZEtleUluZm8oY2VydC5nZXRQdWJsaWNLZXkoKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IHNpZ25pbmciKTsKKyAgICAgICAgICAgIHNpZy5zaWduKHByaXZhdGVLZXkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCBzaWduaW5nIik7CisgICAgICAgIH0KKworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzaWduYXR1cmVGaWxlKTsKKworICAgICAgICBYTUxVdGlscy5vdXRwdXRET01jMTRuV2l0aENvbW1lbnRzKGRvYywgZik7CisgICAgICAgIGYuY2xvc2UoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcm90ZSBzaWduYXR1cmUgdG8gIiArIEJhc2VVUkkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2lnLmdldFNpZ25lZEluZm8oKS5nZXRTaWduZWRDb250ZW50TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCItLS0gU2lnbmVkIENvbnRlbnQgZm9sbG93cyAtLS0iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHNpZy5nZXRTaWduZWRJbmZvKCkuZ2V0U2lnbmVkQ29udGVudEl0ZW0oaSkpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVNZXJsaW5zRXhhbXBsZVNpeHRlZW4uamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvQ3JlYXRlTWVybGluc0V4YW1wbGVTaXh0ZWVuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQxMzJlNQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvQ3JlYXRlTWVybGluc0V4YW1wbGVTaXh0ZWVuLmphdmEKQEAgLTAsMCArMSw0NzkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50LlJldHJpZXZhbE1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLmNvbnRlbnQuWDUwOURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50Lng1MDkuWE1MWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuY29udGVudC54NTA5LlhNTFg1MDlJc3N1ZXJTZXJpYWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50Lng1MDkuWE1MWDUwOVN1YmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudXRpbHMucmVzb2x2ZXIuT2ZmbGluZVJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5NYW5pZmVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuT2JqZWN0Q29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlNpZ25hdHVyZVByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlNpZ25hdHVyZVByb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5TaWduZWRJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMucGFyYW1zLlhQYXRoQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5FbGVtZW50UHJveHk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSmF2YVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworLyoqCisgKgorICogQGF1dGhvciAkQXV0aG9yJAorICovCitwdWJsaWMgY2xhc3MgQ3JlYXRlTWVybGluc0V4YW1wbGVTaXh0ZWVuIHsKKworICAgIHN0YXRpYyBvcmcuc2xmNGouTG9nZ2VyIGxvZyA9CisgICAgICAgIG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcmVhdGVNZXJsaW5zRXhhbXBsZVNpeHRlZW4uY2xhc3MpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyB1bnVzZWRbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEVsZW1lbnRQcm94eS5zZXREZWZhdWx0UHJlZml4KENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMsICJkcyIpOworICAgICAgICBTdHJpbmcga2V5c3RvcmVUeXBlID0gIkpLUyI7CisgICAgICAgIFN0cmluZyBrZXlzdG9yZUZpbGUgPSAic2FtcGxlcy9kYXRhL2tleXN0b3JlLmprcyI7CisgICAgICAgIFN0cmluZyBrZXlzdG9yZVBhc3MgPSAieG1sc2VjdXJpdHkiOworICAgICAgICBTdHJpbmcgcHJpdmF0ZUtleUFsaWFzID0gInRlc3QiOworICAgICAgICBTdHJpbmcgcHJpdmF0ZUtleVBhc3MgPSAieG1sc2VjdXJpdHkiOworICAgICAgICBTdHJpbmcgY2VydGlmaWNhdGVBbGlhcyA9ICJ0ZXN0IjsKKyAgICAgICAgRmlsZSBzaWduYXR1cmVGaWxlID0gbmV3IEZpbGUoImJ1aWxkL21lcmxpbnNTaXh0ZWVuUmVjcmVhdGVkTm9SZXRyaWV2YWxNZXRob2QueG1sIik7CisKKyAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShrZXlzdG9yZVR5cGUpOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShrZXlzdG9yZUZpbGUpOworCisgICAgICAgIGtzLmxvYWQoZmlzLCBrZXlzdG9yZVBhc3MudG9DaGFyQXJyYXkoKSk7CisKKyAgICAgICAgUHJpdmF0ZUtleSBwcml2YXRlS2V5ID0KKyAgICAgICAgICAgIChQcml2YXRlS2V5KSBrcy5nZXRLZXkocHJpdmF0ZUtleUFsaWFzLCBwcml2YXRlS2V5UGFzcy50b0NoYXJBcnJheSgpKTsKKworICAgICAgICBpZiAocHJpdmF0ZUtleSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUHJpdmF0ZSBrZXkgaXMgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPQorICAgICAgICAgICAgKFg1MDlDZXJ0aWZpY2F0ZSkga3MuZ2V0Q2VydGlmaWNhdGUoY2VydGlmaWNhdGVBbGlhcyk7CisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0KKyAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2MgPSBkYi5uZXdEb2N1bWVudCgpOworCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIEVsZW1lbnQgZW52ZWxvcGUgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnVzcHMuZ292LyIsICJFbnZlbG9wZSIpOworCisgICAgICAgIGVudmVsb3BlLnNldEF0dHJpYnV0ZU5TKENvbnN0YW50cy5OYW1lc3BhY2VTcGVjTlMsICJ4bWxucyIsICJodHRwOi8vd3d3LnVzcHMuZ292LyIpOworICAgICAgICBlbnZlbG9wZS5zZXRBdHRyaWJ1dGVOUyhDb25zdGFudHMuTmFtZXNwYWNlU3BlY05TLCAieG1sbnM6Zm9vIiwgImh0dHA6Ly93d3cudXNwcy5nb3YvZm9vIik7CisgICAgICAgIGVudmVsb3BlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisgICAgICAgIGRvYy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlQ29tbWVudCgiIFByZWFtYmxlICIpKTsKKyAgICAgICAgZG9jLmFwcGVuZENoaWxkKGVudmVsb3BlKTsKKyAgICAgICAgZG9jLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KCIgUG9zdGFtYmxlICIpKTsKKworICAgICAgICBFbGVtZW50IGRlYXJTaXIgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnVzcHMuZ292LyIsICJEZWFyU2lyIik7CisKKyAgICAgICAgZGVhclNpci5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoImZvbyIpKTsKKyAgICAgICAgZW52ZWxvcGUuYXBwZW5kQ2hpbGQoZGVhclNpcik7CisgICAgICAgIGVudmVsb3BlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisKKyAgICAgICAgRWxlbWVudCBib2R5ID0gZG9jLmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy51c3BzLmdvdi8iLCAiQm9keSIpOworCisgICAgICAgIGJvZHkuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJiYXIiKSk7CisgICAgICAgIGVudmVsb3BlLmFwcGVuZENoaWxkKGJvZHkpOworICAgICAgICBlbnZlbG9wZS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOworCisgICAgICAgIEVsZW1lbnQgWW91cnNTaW5jZXJlbHkgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnVzcHMuZ292LyIsICJZb3Vyc1NpbmNlcmVseSIpOworICAgICAgICBZb3Vyc1NpbmNlcmVseS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOworCisgICAgICAgIGVudmVsb3BlLmFwcGVuZENoaWxkKFlvdXJzU2luY2VyZWx5KTsKKworICAgICAgICBFbGVtZW50IFBvc3RTY3JpcHQgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnVzcHMuZ292LyIsICJQb3N0U2NyaXB0Iik7CisKKyAgICAgICAgUG9zdFNjcmlwdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoImJhciIpKTsKKyAgICAgICAgZW52ZWxvcGUuYXBwZW5kQ2hpbGQoUG9zdFNjcmlwdCk7CisKKyAgICAgICAgRWxlbWVudCBOb3RhcmllcyA9IGRvYy5jcmVhdGVFbGVtZW50TlMobnVsbCwgIk5vdGFyaWVzIik7CisKKyAgICAgICAgTm90YXJpZXMuc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5hbWVzcGFjZVNwZWNOUywgInhtbG5zIiwgIiIpOworICAgICAgICBOb3Rhcmllcy5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiSWQiLCAibm90YXJpZXMiKTsKKyAgICAgICAgTm90YXJpZXMuc2V0SWRBdHRyaWJ1dGVOUyhudWxsLCAiSWQiLCB0cnVlKTsKKworICAgICAgICB7CisgICAgICAgICAgICBFbGVtZW50IE5vdGFyeSA9IGRvYy5jcmVhdGVFbGVtZW50TlMobnVsbCwgIk5vdGFyeSIpOworCisgICAgICAgICAgICBOb3Rhcnkuc2V0QXR0cmlidXRlTlMobnVsbCwgIm5hbWUiLCAiR3JlYXQsIEEuIFQuIik7CisgICAgICAgICAgICBOb3Rhcmllcy5hcHBlbmRDaGlsZChOb3RhcnkpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgRWxlbWVudCBOb3RhcnkgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG51bGwsICJOb3RhcnkiKTsKKworICAgICAgICAgICAgTm90YXJ5LnNldEF0dHJpYnV0ZU5TKG51bGwsICJuYW1lIiwgIkh1biwgQS4gVC4iKTsKKyAgICAgICAgICAgIE5vdGFyaWVzLmFwcGVuZENoaWxkKE5vdGFyeSk7CisgICAgICAgIH0KKworICAgICAgICBlbnZlbG9wZS5hcHBlbmRDaGlsZChOb3Rhcmllcyk7CisgICAgICAgIGVudmVsb3BlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KCIgQ29tbWVudGFyeSAiKSk7CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgU3RyaW5nIEJhc2VVUkkgPSBzaWduYXR1cmVGaWxlLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpOworICAgICAgICBYTUxTaWduYXR1cmUgc2lnID0KKyAgICAgICAgICAgIG5ldyBYTUxTaWduYXR1cmUoZG9jLCBCYXNlVVJJLCBYTUxTaWduYXR1cmUuQUxHT19JRF9TSUdOQVRVUkVfRFNBKTsKKworICAgICAgICBZb3Vyc1NpbmNlcmVseS5hcHBlbmRDaGlsZChzaWcuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgc2lnLnNldElkKCJzaWduYXR1cmUiKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBZGQgdGhlIE9iamVjdHMKKyAgICAgICAgICovCisKKyAgICAgICAgLy8gb2JqZWN0LTEKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0Q29udGFpbmVyIG9iamVjdDEgPSBuZXcgT2JqZWN0Q29udGFpbmVyKGRvYyk7CisKKyAgICAgICAgICAgIG9iamVjdDEuc2V0SWQoIm9iamVjdC0xIik7CisgICAgICAgICAgICBvYmplY3QxLnNldE1pbWVUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgICAgICBvYmplY3QxLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiSSBhbSB0aGUgdGV4dC4iKSk7CisgICAgICAgICAgICBzaWcuYXBwZW5kT2JqZWN0KG9iamVjdDEpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb2JqZWN0LTIKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0Q29udGFpbmVyIG9iamVjdDIgPSBuZXcgT2JqZWN0Q29udGFpbmVyKGRvYyk7CisKKyAgICAgICAgICAgIG9iamVjdDIuc2V0SWQoIm9iamVjdC0yIik7CisgICAgICAgICAgICBvYmplY3QyLnNldE1pbWVUeXBlKCJ0ZXh0L3BsYWluIik7CisgICAgICAgICAgICBvYmplY3QyLnNldEVuY29kaW5nKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjYmFzZTY0Iik7CisgICAgICAgICAgICBvYmplY3QyLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiU1NCaGJTQjBhR1VnZEdWNGRDND0iKSk7CisgICAgICAgICAgICBzaWcuYXBwZW5kT2JqZWN0KG9iamVjdDIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gb2JqZWN0LTMKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0Q29udGFpbmVyIG9iamVjdCA9IG5ldyBPYmplY3RDb250YWluZXIoZG9jKTsKKworICAgICAgICAgICAgb2JqZWN0LnNldElkKCJvYmplY3QtMyIpOworCisgICAgICAgICAgICBFbGVtZW50IG5vbmMgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG51bGwsICJOb25Db21tZW50YW5kdXMiKTsKKworICAgICAgICAgICAgbm9uYy5zZXRBdHRyaWJ1dGVOUyhDb25zdGFudHMuTmFtZXNwYWNlU3BlY05TLCAieG1sbnMiLCAiIik7CisgICAgICAgICAgICBub25jLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KCIgQ29tbWVudGFuZHVtICIpKTsKKyAgICAgICAgICAgIG9iamVjdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgICAgICAiKSk7CisgICAgICAgICAgICBvYmplY3QuYXBwZW5kQ2hpbGQobm9uYyk7CisgICAgICAgICAgICBvYmplY3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICIpKTsKKyAgICAgICAgICAgIHNpZy5hcHBlbmRPYmplY3Qob2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9iamVjdCBudW1iZXIgNAorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3RDb250YWluZXIgb2JqZWN0ID0gbmV3IE9iamVjdENvbnRhaW5lcihkb2MpOworCisgICAgICAgICAgICBvYmplY3QuYXBwZW5kQ2hpbGQoY3JlYXRlT2JqZWN0NChzaWcpKTsKKyAgICAgICAgICAgIHNpZy5hcHBlbmRPYmplY3Qob2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9iamVjdCBudW1iZXIgNAorICAgICAgICB7CisgICAgICAgICAgICBPYmplY3RDb250YWluZXIgb2JqZWN0ID0gbmV3IE9iamVjdENvbnRhaW5lcihkb2MpOworICAgICAgICAgICAgU2lnbmF0dXJlUHJvcGVydGllcyBzcHMgPSBuZXcgU2lnbmF0dXJlUHJvcGVydGllcyhkb2MpOworCisgICAgICAgICAgICBzcHMuc2V0SWQoInNpZ25hdHVyZS1wcm9wZXJ0aWVzLTEiKTsKKworICAgICAgICAgICAgU2lnbmF0dXJlUHJvcGVydHkgc3AgPSBuZXcgU2lnbmF0dXJlUHJvcGVydHkoZG9jLCAiI3NpZ25hdHVyZSIpOworICAgICAgICAgICAgRWxlbWVudCBzaWduZWRBZHJlc3MgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJ1cm46ZGVtbyIsCisgICAgICAgICAgICAiU2lnbmVkQWRkcmVzcyIpOworCisgICAgICAgICAgICBzaWduZWRBZHJlc3Muc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5hbWVzcGFjZVNwZWNOUywgInhtbG5zIiwgInVybjpkZW1vIik7CisKKyAgICAgICAgICAgIEVsZW1lbnQgSVAgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJ1cm46ZGVtbyIsICJJUCIpOworCisgICAgICAgICAgICBJUC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIjE5Mi4xNjguMjEuMTM4IikpOworICAgICAgICAgICAgc2lnbmVkQWRyZXNzLmFwcGVuZENoaWxkKElQKTsKKyAgICAgICAgICAgIHNwLmFwcGVuZENoaWxkKHNpZ25lZEFkcmVzcyk7CisgICAgICAgICAgICBzcHMuYWRkU2lnbmF0dXJlUHJvcGVydHkoc3ApOworICAgICAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKHNwcy5nZXRFbGVtZW50KCkpOworICAgICAgICAgICAgc2lnLmFwcGVuZE9iamVjdChvYmplY3QpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0Q29udGFpbmVyIG9iamVjdCA9IG5ldyBPYmplY3RDb250YWluZXIoZG9jKTsKKworICAgICAgICAgICAgb2JqZWN0LnNldElkKCJvYmplY3QtNCIpOworCisgICAgICAgICAgICBYNTA5RGF0YSB4NTA5ZGF0YSA9IG5ldyBYNTA5RGF0YShkb2MpOworCisgICAgICAgICAgICB4NTA5ZGF0YS5hZGQobmV3IFhNTFg1MDlTdWJqZWN0TmFtZShkb2MsIGNlcnQpKTsKKyAgICAgICAgICAgIHg1MDlkYXRhLmFkZChuZXcgWE1MWDUwOUlzc3VlclNlcmlhbChkb2MsIGNlcnQpKTsKKyAgICAgICAgICAgIHg1MDlkYXRhLmFkZChuZXcgWE1MWDUwOUNlcnRpZmljYXRlKGRvYywgY2VydCkpOworICAgICAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKHg1MDlkYXRhLmdldEVsZW1lbnQoKSk7CisgICAgICAgICAgICBzaWcuYXBwZW5kT2JqZWN0KG9iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBZGQgUmVmZXJlbmNlcworICAgICAgICAgKi8KKyAgICAgICAgc2lnLmdldFNpZ25lZEluZm8oKS5hZGRSZXNvdXJjZVJlc29sdmVyKAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudXRpbHMucmVzb2x2ZXIuT2ZmbGluZVJlc29sdmVyKCkpOworICAgICAgICBzaWcuYWRkRG9jdW1lbnQoImh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Iik7CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fQkFTRTY0X0RFQ09ERSk7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoImh0dHA6Ly94bWxkc2lnLnBvdGhvbGUuY29tL3htbC1zdHlsZXNoZWV0LnR4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtcywgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKyAgICAgICAgICAgIFhQYXRoQ29udGFpbmVyIHhwYXRoQyA9IG5ldyBYUGF0aENvbnRhaW5lcihkb2MpOworCisgICAgICAgICAgICB4cGF0aEMuc2V0WFBhdGgoInNlbGY6OnRleHQoKSIpOworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fWFBBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGF0aEMuZ2V0RWxlbWVudFBsdXNSZXR1cm5zKCkpOworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjb2JqZWN0LTEiLCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCBudWxsLAorICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKGRvYyk7CisKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX0JBU0U2NF9ERUNPREUpOworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjb2JqZWN0LTIiLCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCBudWxsLAorICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI21hbmlmZXN0LTEiLCBudWxsLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgbnVsbCwKKyAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjTWFuaWZlc3QiKTsKKyAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjc2lnbmF0dXJlLXByb3BlcnRpZXMtMSIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgbnVsbCwKKyAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNTaWduYXR1cmVQcm9wZXJ0aWVzIik7CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fRU5WRUxPUEVEX1NJR05BVFVSRSk7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiIsIHRyYW5zZm9ybXMsIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKGRvYyk7CisKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX0VOVkVMT1BFRF9TSUdOQVRVUkUpOworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fQzE0Tl9XSVRIX0NPTU1FTlRTKTsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiIiwgdHJhbnNmb3JtcywgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fRU5WRUxPUEVEX1NJR05BVFVSRSk7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiN4cG9pbnRlcigvKSIsIHRyYW5zZm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fRU5WRUxPUEVEX1NJR05BVFVSRSk7CisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9DMTROX1dJVEhfQ09NTUVOVFMpOworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjeHBvaW50ZXIoLykiLCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI29iamVjdC0zIiwgbnVsbCwgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKGRvYyk7CisKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX0MxNE5fV0lUSF9DT01NRU5UUyk7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiNvYmplY3QtMyIsIHRyYW5zZm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI3hwb2ludGVyKGlkKCdvYmplY3QtMycpKSIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKGRvYyk7CisKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX0MxNE5fV0lUSF9DT01NRU5UUyk7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiN4cG9pbnRlcihpZCgnb2JqZWN0LTMnKSkiLCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0Iik7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiNtYW5pZmVzdC1yZWZlcmVuY2UtMSIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEsICJyZWZlcmVuY2UtMSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNSZWZlcmVuY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI3JlZmVyZW5jZS0xIiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgInJlZmVyZW5jZS0yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1JlZmVyZW5jZSIpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjcmVmZXJlbmNlLTIiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjUmVmZXJlbmNlIik7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBZGQgS2V5SW5mbyBhbmQgc2lnbigpCisgICAgICAgICAqLworICAgICAgICB7CisgICAgICAgICAgICBUcmFuc2Zvcm1zIHJldHJpZXZhbFRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworICAgICAgICAgICAgWFBhdGhDb250YWluZXIgeHBhdGhDID0gbmV3IFhQYXRoQ29udGFpbmVyKGRvYyk7CisKKyAgICAgICAgICAgIHhwYXRoQy5zZXRYUGF0aE5hbWVzcGFjZUNvbnRleHQoImRzIiwgQ29uc3RhbnRzLlNpZ25hdHVyZVNwZWNOUyk7CisgICAgICAgICAgICB4cGF0aEMuc2V0WFBhdGgoImFuY2VzdG9yLW9yLXNlbGY6OmRzOlg1MDlEYXRhIik7CisgICAgICAgICAgICByZXRyaWV2YWxUcmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9YUEFUSCwgeHBhdGhDLmdldEVsZW1lbnQoKSk7CisgICAgICAgICAgICBzaWcuZ2V0S2V5SW5mbygpLmFkZCgKKyAgICAgICAgICAgICAgICBuZXcgUmV0cmlldmFsTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICBkb2MsICIjb2JqZWN0LTQiLCByZXRyaWV2YWxUcmFuc2Zvcm1zLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1g1MDlEYXRhIikpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IHNpZ25pbmciKTsKKyAgICAgICAgICAgIHNpZy5zaWduKHByaXZhdGVLZXkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCBzaWduaW5nIik7CisgICAgICAgIH0KKworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzaWduYXR1cmVGaWxlKTsKKworICAgICAgICBYTUxVdGlscy5vdXRwdXRET01jMTRuV2l0aENvbW1lbnRzKGRvYywgZik7CisgICAgICAgIGYuY2xvc2UoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcm90ZSBzaWduYXR1cmUgdG8gIiArIEJhc2VVUkkpOworCisgICAgICAgIFNpZ25lZEluZm8gcyA9IHNpZy5nZXRTaWduZWRJbmZvKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBSZWZlcmVuY2UgciA9IHMuaXRlbShpKTsKKyAgICAgICAgICAgIFN0cmluZyBmbiA9ICJidWlsZC9tZXJsaW4xNl8iK2krIi5odG1sIjsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JvdGUgUmVmZXJlbmNlICIgKyBpICsgIiB0byBmaWxlICIgKyBmbik7CisgICAgICAgICAgICBKYXZhVXRpbHMud3JpdGVCeXRlc1RvRmlsZW5hbWUoZm4sIHIuZ2V0SFRNTFJlcHJlc2VudGF0aW9uKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBjcmVhdGVPYmplY3Q0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2lnCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVPYmplY3Q0KFhNTFNpZ25hdHVyZSBzaWcpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIERvY3VtZW50IGRvYyA9IHNpZy5nZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpOworICAgICAgICBTdHJpbmcgQmFzZVVSSSA9IHNpZy5nZXRCYXNlVVJJKCk7CisgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGRvYyk7CisgICAgICAgIG1hbmlmZXN0LmFkZFJlc291cmNlUmVzb2x2ZXIobmV3IE9mZmxpbmVSZXNvbHZlcigpKTsKKworICAgICAgICBtYW5pZmVzdC5zZXRJZCgibWFuaWZlc3QtMSIpOworICAgICAgICBtYW5pZmVzdC5hZGREb2N1bWVudChCYXNlVVJJLCAiaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hbmlmZXN0LXJlZmVyZW5jZS0xIiwgbnVsbCk7CisgICAgICAgIG1hbmlmZXN0LmFkZERvY3VtZW50KEJhc2VVUkksICIjcmVmZXJlbmNlLTEiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNSZWZlcmVuY2UiKTsKKworICAgICAgICBTdHJpbmcgeHNsdCA9ICIiCisgICAgICAgICAgICArICI8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nXG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgICAgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnL1RSL3hodG1sMS9zdHJpY3QnIFxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSdmb28nIFxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgIHZlcnNpb249JzEuMCc+XG4iCisgICAgICAgICAgICArICIgIDx4c2w6b3V0cHV0IGVuY29kaW5nPSdVVEYtOCcgXG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgIGluZGVudD0nbm8nIFxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgICBtZXRob2Q9J3htbCcgLz5cbiIKKyAgICAgICAgICAgICsgIiAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0nLyc+XG4iCisgICAgICAgICAgICArICIgICAgPGh0bWw+XG4iCisgICAgICAgICAgICArICIgICAgICA8aGVhZD5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgPHRpdGxlPk5vdGFyaWVzPC90aXRsZT5cbiIKKyAgICAgICAgICAgICsgIiAgICAgIDwvaGVhZD5cbiIKKyAgICAgICAgICAgICsgIiAgICAgIDxib2R5PlxuIgorICAgICAgICAgICAgKyAiICAgICAgICA8dGFibGU+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9J05vdGFyaWVzL05vdGFyeSc+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8dHI+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgIDx0aD5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0nQG5hbWUnIC8+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgIDwvdGg+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8L3RyPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgIDwveHNsOmZvci1lYWNoPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICA8L3RhYmxlPlxuIgorICAgICAgICAgICAgKyAiICAgICAgPC9ib2R5PlxuIgorICAgICAgICAgICAgKyAiICAgIDwvaHRtbD5cbiIKKyAgICAgICAgICAgICsgIiAgPC94c2w6dGVtcGxhdGU+XG4iCisgICAgICAgICAgICArICI8L3hzbDpzdHlsZXNoZWV0PlxuIgorICAgICAgICAgICAgOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0KKyAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2N4c2x0ID0KKyAgICAgICAgICAgIGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4c2x0LmdldEJ5dGVzKCkpKTsKKyAgICAgICAgTm9kZSB4c2xFbGVtID0gZG9jeHNsdC5nZXREb2N1bWVudEVsZW1lbnQoKTsKKyAgICAgICAgTm9kZSB4c2xFbGVtSW1wb3J0ZWQgPSBkb2MuaW1wb3J0Tm9kZSh4c2xFbGVtLCB0cnVlKTsKKyAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9YU0xULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRWxlbWVudCkgeHNsRWxlbUltcG9ydGVkKTsKKyAgICAgICAgbWFuaWZlc3QuYWRkRG9jdW1lbnQoQmFzZVVSSSwgIiNub3RhcmllcyIsIHRyYW5zZm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCBudWxsLCBudWxsKTsKKworICAgICAgICByZXR1cm4gbWFuaWZlc3QuZ2V0RWxlbWVudCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVNZXJsaW5zRXhhbXBsZVR3ZW50eVRocmVlLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL0NyZWF0ZU1lcmxpbnNFeGFtcGxlVHdlbnR5VGhyZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjY3YTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVNZXJsaW5zRXhhbXBsZVR3ZW50eVRocmVlLmphdmEKQEAgLTAsMCArMSw0NzkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50LlJldHJpZXZhbE1ldGhvZDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLmNvbnRlbnQuWDUwOURhdGE7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50Lng1MDkuWE1MWDUwOUNlcnRpZmljYXRlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuY29udGVudC54NTA5LlhNTFg1MDlJc3N1ZXJTZXJpYWw7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50Lng1MDkuWE1MWDUwOVN1YmplY3ROYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudXRpbHMucmVzb2x2ZXIuT2ZmbGluZVJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5NYW5pZmVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuT2JqZWN0Q29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5SZWZlcmVuY2U7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlNpZ25hdHVyZVByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlNpZ25hdHVyZVByb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5TaWduZWRJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMucGFyYW1zLlhQYXRoQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5FbGVtZW50UHJveHk7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSmF2YVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKKworLyoqCisgKgorICogQGF1dGhvciAkQXV0aG9yJAorICovCitwdWJsaWMgY2xhc3MgQ3JlYXRlTWVybGluc0V4YW1wbGVUd2VudHlUaHJlZSB7CisKKyAgICBzdGF0aWMgb3JnLnNsZjRqLkxvZ2dlciBsb2cgPQorICAgICAgICBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQ3JlYXRlTWVybGluc0V4YW1wbGVUd2VudHlUaHJlZS5jbGFzcyk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRWxlbWVudFByb3h5LnNldERlZmF1bHRQcmVmaXgoQ29uc3RhbnRzLlNpZ25hdHVyZVNwZWNOUywgImRzIik7CisKKyAgICAgICAgU3RyaW5nIGtleXN0b3JlVHlwZSA9ICJKS1MiOworICAgICAgICBTdHJpbmcga2V5c3RvcmVGaWxlID0gInNhbXBsZXMvZGF0YS9rZXlzdG9yZS5qa3MiOworICAgICAgICBTdHJpbmcga2V5c3RvcmVQYXNzID0gInhtbHNlY3VyaXR5IjsKKyAgICAgICAgU3RyaW5nIHByaXZhdGVLZXlBbGlhcyA9ICJ0ZXN0IjsKKyAgICAgICAgU3RyaW5nIHByaXZhdGVLZXlQYXNzID0gInhtbHNlY3VyaXR5IjsKKyAgICAgICAgU3RyaW5nIGNlcnRpZmljYXRlQWxpYXMgPSAidGVzdCI7CisgICAgICAgIEZpbGUgc2lnbmF0dXJlRmlsZSA9IG5ldyBGaWxlKCJidWlsZC9tZXJsaW5zVHdlbnR5VGhyZWVSZWNyZWF0ZWROb1JldHJpZXZhbE1ldGhvZC54bWwiKTsKKworICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKGtleXN0b3JlVHlwZSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGtleXN0b3JlRmlsZSk7CisKKyAgICAgICAga3MubG9hZChmaXMsIGtleXN0b3JlUGFzcy50b0NoYXJBcnJheSgpKTsKKworICAgICAgICBQcml2YXRlS2V5IHByaXZhdGVLZXkgPQorICAgICAgICAgICAgKFByaXZhdGVLZXkpIGtzLmdldEtleShwcml2YXRlS2V5QWxpYXMsIHByaXZhdGVLZXlQYXNzLnRvQ2hhckFycmF5KCkpOworCisgICAgICAgIGlmIChwcml2YXRlS2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJQcml2YXRlIGtleSBpcyBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9CisgICAgICAgICAgICAoWDUwOUNlcnRpZmljYXRlKSBrcy5nZXRDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZUFsaWFzKTsKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IGRiLm5ld0RvY3VtZW50KCk7CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgRWxlbWVudCBlbnZlbG9wZSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudXNwcy5nb3YvIiwgIkVudmVsb3BlIik7CisKKyAgICAgICAgZW52ZWxvcGUuc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5hbWVzcGFjZVNwZWNOUywgInhtbG5zIiwgImh0dHA6Ly93d3cudXNwcy5nb3YvIik7CisgICAgICAgIGVudmVsb3BlLnNldEF0dHJpYnV0ZU5TKENvbnN0YW50cy5OYW1lc3BhY2VTcGVjTlMsICJ4bWxuczpmb28iLCAiaHR0cDovL3d3dy51c3BzLmdvdi9mb28iKTsKKyAgICAgICAgZW52ZWxvcGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKKyAgICAgICAgZG9jLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KCIgUHJlYW1ibGUgIikpOworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoZW52ZWxvcGUpOworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNvbW1lbnQoIiBQb3N0YW1ibGUgIikpOworCisgICAgICAgIEVsZW1lbnQgZGVhclNpciA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudXNwcy5nb3YvIiwgIkRlYXJTaXIiKTsKKworICAgICAgICBkZWFyU2lyLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiZm9vIikpOworICAgICAgICBlbnZlbG9wZS5hcHBlbmRDaGlsZChkZWFyU2lyKTsKKyAgICAgICAgZW52ZWxvcGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKKworICAgICAgICBFbGVtZW50IGJvZHkgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnVzcHMuZ292LyIsICJCb2R5Iik7CisKKyAgICAgICAgYm9keS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoImJhciIpKTsKKyAgICAgICAgZW52ZWxvcGUuYXBwZW5kQ2hpbGQoYm9keSk7CisgICAgICAgIGVudmVsb3BlLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisKKyAgICAgICAgRWxlbWVudCBZb3Vyc1NpbmNlcmVseSA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudXNwcy5nb3YvIiwgIllvdXJzU2luY2VyZWx5Iik7CisgICAgICAgIFlvdXJzU2luY2VyZWx5LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisKKyAgICAgICAgZW52ZWxvcGUuYXBwZW5kQ2hpbGQoWW91cnNTaW5jZXJlbHkpOworCisgICAgICAgIEVsZW1lbnQgUG9zdFNjcmlwdCA9IGRvYy5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudXNwcy5nb3YvIiwgIlBvc3RTY3JpcHQiKTsKKworICAgICAgICBQb3N0U2NyaXB0LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiYmFyIikpOworICAgICAgICBlbnZlbG9wZS5hcHBlbmRDaGlsZChQb3N0U2NyaXB0KTsKKworICAgICAgICBFbGVtZW50IE5vdGFyaWVzID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhudWxsLCAiTm90YXJpZXMiKTsKKworICAgICAgICBOb3Rhcmllcy5zZXRBdHRyaWJ1dGVOUyhDb25zdGFudHMuTmFtZXNwYWNlU3BlY05TLCAieG1sbnMiLCAiIik7CisgICAgICAgIE5vdGFyaWVzLnNldEF0dHJpYnV0ZU5TKG51bGwsICJJZCIsICJub3RhcmllcyIpOworICAgICAgICBOb3Rhcmllcy5zZXRJZEF0dHJpYnV0ZU5TKG51bGwsICJJZCIsIHRydWUpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIEVsZW1lbnQgTm90YXJ5ID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhudWxsLCAiTm90YXJ5Iik7CisKKyAgICAgICAgICAgIE5vdGFyeS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAibmFtZSIsICJHcmVhdCwgQS4gVC4iKTsKKyAgICAgICAgICAgIE5vdGFyaWVzLmFwcGVuZENoaWxkKE5vdGFyeSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBFbGVtZW50IE5vdGFyeSA9IGRvYy5jcmVhdGVFbGVtZW50TlMobnVsbCwgIk5vdGFyeSIpOworCisgICAgICAgICAgICBOb3Rhcnkuc2V0QXR0cmlidXRlTlMobnVsbCwgIm5hbWUiLCAiSHVuLCBBLiBULiIpOworICAgICAgICAgICAgTm90YXJpZXMuYXBwZW5kQ2hpbGQoTm90YXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIGVudmVsb3BlLmFwcGVuZENoaWxkKE5vdGFyaWVzKTsKKyAgICAgICAgZW52ZWxvcGUuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZUNvbW1lbnQoIiBDb21tZW50YXJ5ICIpKTsKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICBTdHJpbmcgQmFzZVVSSSA9IHNpZ25hdHVyZUZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCk7CisgICAgICAgIFhNTFNpZ25hdHVyZSBzaWcgPSBuZXcgWE1MU2lnbmF0dXJlKGRvYywgQmFzZVVSSSwgWE1MU2lnbmF0dXJlLkFMR09fSURfU0lHTkFUVVJFX0RTQSk7CisKKyAgICAgICAgWW91cnNTaW5jZXJlbHkuYXBwZW5kQ2hpbGQoc2lnLmdldEVsZW1lbnQoKSk7CisgICAgICAgIHNpZy5zZXRJZCgic2lnbmF0dXJlIik7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWRkIHRoZSBPYmplY3RzCisgICAgICAgICAqLworCisgICAgICAgIC8vIG9iamVjdC0xCisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdENvbnRhaW5lciBvYmplY3QxID0gbmV3IE9iamVjdENvbnRhaW5lcihkb2MpOworCisgICAgICAgICAgICBvYmplY3QxLnNldElkKCJvYmplY3QtMSIpOworICAgICAgICAgICAgb2JqZWN0MS5zZXRNaW1lVHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICAgICAgb2JqZWN0MS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIkkgYW0gdGhlIHRleHQuIikpOworICAgICAgICAgICAgc2lnLmFwcGVuZE9iamVjdChvYmplY3QxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9iamVjdC0yCisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdENvbnRhaW5lciBvYmplY3QyID0gbmV3IE9iamVjdENvbnRhaW5lcihkb2MpOworCisgICAgICAgICAgICBvYmplY3QyLnNldElkKCJvYmplY3QtMiIpOworICAgICAgICAgICAgb2JqZWN0Mi5zZXRNaW1lVHlwZSgidGV4dC9wbGFpbiIpOworICAgICAgICAgICAgb2JqZWN0Mi5zZXRFbmNvZGluZygiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NCIpOworICAgICAgICAgICAgb2JqZWN0Mi5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlNTQmhiU0IwYUdVZ2RHVjRkQzQ9IikpOworICAgICAgICAgICAgc2lnLmFwcGVuZE9iamVjdChvYmplY3QyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG9iamVjdC0zCisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdENvbnRhaW5lciBvYmplY3QgPSBuZXcgT2JqZWN0Q29udGFpbmVyKGRvYyk7CisKKyAgICAgICAgICAgIG9iamVjdC5zZXRJZCgib2JqZWN0LTMiKTsKKworICAgICAgICAgICAgRWxlbWVudCBub25jID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhudWxsLCAiTm9uQ29tbWVudGFuZHVzIik7CisKKyAgICAgICAgICAgIG5vbmMuc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5hbWVzcGFjZVNwZWNOUywgInhtbG5zIiwgIiIpOworICAgICAgICAgICAgbm9uYy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlQ29tbWVudCgiIENvbW1lbnRhbmR1bSAiKSk7CisgICAgICAgICAgICBvYmplY3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiAgICAgICAgIikpOworICAgICAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKG5vbmMpOworICAgICAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4gICAgICAiKSk7CisgICAgICAgICAgICBzaWcuYXBwZW5kT2JqZWN0KG9iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBvYmplY3QgbnVtYmVyIDQKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0Q29udGFpbmVyIG9iamVjdCA9IG5ldyBPYmplY3RDb250YWluZXIoZG9jKTsKKworICAgICAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKGNyZWF0ZU9iamVjdDQoc2lnKSk7CisgICAgICAgICAgICBzaWcuYXBwZW5kT2JqZWN0KG9iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBvYmplY3QgbnVtYmVyIDQKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0Q29udGFpbmVyIG9iamVjdCA9IG5ldyBPYmplY3RDb250YWluZXIoZG9jKTsKKyAgICAgICAgICAgIFNpZ25hdHVyZVByb3BlcnRpZXMgc3BzID0gbmV3IFNpZ25hdHVyZVByb3BlcnRpZXMoZG9jKTsKKworICAgICAgICAgICAgc3BzLnNldElkKCJzaWduYXR1cmUtcHJvcGVydGllcy0xIik7CisKKyAgICAgICAgICAgIFNpZ25hdHVyZVByb3BlcnR5IHNwID0gbmV3IFNpZ25hdHVyZVByb3BlcnR5KGRvYywgIiNzaWduYXR1cmUiKTsKKyAgICAgICAgICAgIEVsZW1lbnQgc2lnbmVkQWRyZXNzID0gZG9jLmNyZWF0ZUVsZW1lbnROUygidXJuOmRlbW8iLCAiU2lnbmVkQWRkcmVzcyIpOworCisgICAgICAgICAgICBzaWduZWRBZHJlc3Muc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5hbWVzcGFjZVNwZWNOUywgInhtbG5zIiwgInVybjpkZW1vIik7CisKKyAgICAgICAgICAgIEVsZW1lbnQgSVAgPSBkb2MuY3JlYXRlRWxlbWVudE5TKCJ1cm46ZGVtbyIsICJJUCIpOworCisgICAgICAgICAgICBJUC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIjE5Mi4xNjguMjEuMTM4IikpOworICAgICAgICAgICAgc2lnbmVkQWRyZXNzLmFwcGVuZENoaWxkKElQKTsKKyAgICAgICAgICAgIHNwLmFwcGVuZENoaWxkKHNpZ25lZEFkcmVzcyk7CisgICAgICAgICAgICBzcHMuYWRkU2lnbmF0dXJlUHJvcGVydHkoc3ApOworICAgICAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKHNwcy5nZXRFbGVtZW50KCkpOworICAgICAgICAgICAgc2lnLmFwcGVuZE9iamVjdChvYmplY3QpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgT2JqZWN0Q29udGFpbmVyIG9iamVjdCA9IG5ldyBPYmplY3RDb250YWluZXIoZG9jKTsKKworICAgICAgICAgICAgb2JqZWN0LnNldElkKCJvYmplY3QtNCIpOworCisgICAgICAgICAgICBYNTA5RGF0YSB4NTA5ZGF0YSA9IG5ldyBYNTA5RGF0YShkb2MpOworCisgICAgICAgICAgICB4NTA5ZGF0YS5hZGQobmV3IFhNTFg1MDlTdWJqZWN0TmFtZShkb2MsIGNlcnQpKTsKKyAgICAgICAgICAgIHg1MDlkYXRhLmFkZChuZXcgWE1MWDUwOUlzc3VlclNlcmlhbChkb2MsIGNlcnQpKTsKKyAgICAgICAgICAgIHg1MDlkYXRhLmFkZChuZXcgWE1MWDUwOUNlcnRpZmljYXRlKGRvYywgY2VydCkpOworICAgICAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKHg1MDlkYXRhLmdldEVsZW1lbnQoKSk7CisgICAgICAgICAgICBzaWcuYXBwZW5kT2JqZWN0KG9iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBZGQgUmVmZXJlbmNlcworICAgICAgICAgKi8KKyAgICAgICAgc2lnLmdldFNpZ25lZEluZm8oKS5hZGRSZXNvdXJjZVJlc29sdmVyKAorICAgICAgICAgICAgbmV3IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudXRpbHMucmVzb2x2ZXIuT2ZmbGluZVJlc29sdmVyKCkpOworICAgICAgICBzaWcuYWRkRG9jdW1lbnQoImh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Iik7CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fQkFTRTY0X0RFQ09ERSk7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoImh0dHA6Ly94bWxkc2lnLnBvdGhvbGUuY29tL3htbC1zdHlsZXNoZWV0LnR4dCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtcywgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKyAgICAgICAgICAgIFhQYXRoQ29udGFpbmVyIHhwYXRoQyA9IG5ldyBYUGF0aENvbnRhaW5lcihkb2MpOworCisgICAgICAgICAgICB4cGF0aEMuc2V0WFBhdGgoInNlbGY6OnRleHQoKSIpOworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fWFBBVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGF0aEMuZ2V0RWxlbWVudFBsdXNSZXR1cm5zKCkpOworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjb2JqZWN0LTEiLCB0cmFuc2Zvcm1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjT2JqZWN0Iik7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworCisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9CQVNFNjRfREVDT0RFKTsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI29iamVjdC0yIiwgdHJhbnNmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIpOworICAgICAgICB9CisKKyAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjbWFuaWZlc3QtMSIsIG51bGwsIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCBudWxsLAorICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI01hbmlmZXN0Iik7CisgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI3NpZ25hdHVyZS1wcm9wZXJ0aWVzLTEiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1NpZ25hdHVyZVByb3BlcnRpZXMiKTsKKworICAgICAgICB7CisgICAgICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworCisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9FTlZFTE9QRURfU0lHTkFUVVJFKTsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiIiwgdHJhbnNmb3JtcywgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fRU5WRUxPUEVEX1NJR05BVFVSRSk7CisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9DMTROX1dJVEhfQ09NTUVOVFMpOworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIiLCB0cmFuc2Zvcm1zLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworCisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9FTlZFTE9QRURfU0lHTkFUVVJFKTsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI3hwb2ludGVyKC8pIiwgdHJhbnNmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworCisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9FTlZFTE9QRURfU0lHTkFUVVJFKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX0MxNE5fV0lUSF9DT01NRU5UUyk7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiN4cG9pbnRlcigvKSIsIHRyYW5zZm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjb2JqZWN0LTMiLCBudWxsLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fQzE0Tl9XSVRIX0NPTU1FTlRTKTsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI29iamVjdC0zIiwgdHJhbnNmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjeHBvaW50ZXIoaWQoJ29iamVjdC0zJykpIiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI09iamVjdCIpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fQzE0Tl9XSVRIX0NPTU1FTlRTKTsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI3hwb2ludGVyKGlkKCdvYmplY3QtMycpKSIsIHRyYW5zZm9ybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNPYmplY3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIHNpZy5hZGREb2N1bWVudCgiI21hbmlmZXN0LXJlZmVyZW5jZS0xIiwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgInJlZmVyZW5jZS0xIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1JlZmVyZW5jZSIpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIjcmVmZXJlbmNlLTEiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCAicmVmZXJlbmNlLTIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjUmVmZXJlbmNlIik7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiNyZWZlcmVuY2UtMiIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNSZWZlcmVuY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEFkZCBLZXlJbmZvIGFuZCBzaWduKCkKKyAgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIFRyYW5zZm9ybXMgcmV0cmlldmFsVHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKGRvYyk7CisgICAgICAgICAgICBYUGF0aENvbnRhaW5lciB4cGF0aEMgPSBuZXcgWFBhdGhDb250YWluZXIoZG9jKTsKKworICAgICAgICAgICAgeHBhdGhDLnNldFhQYXRoTmFtZXNwYWNlQ29udGV4dCgiZHMiLCBDb25zdGFudHMuU2lnbmF0dXJlU3BlY05TKTsKKyAgICAgICAgICAgIHhwYXRoQy5zZXRYUGF0aCgiYW5jZXN0b3Itb3Itc2VsZjo6ZHM6WDUwOURhdGEiKTsKKyAgICAgICAgICAgIHJldHJpZXZhbFRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX1hQQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBhdGhDLmdldEVsZW1lbnQoKSk7CisgICAgICAgICAgICBzaWcuZ2V0S2V5SW5mbygpLmFkZCgKKyAgICAgICAgICAgICAgICBuZXcgUmV0cmlldmFsTWV0aG9kKAorICAgICAgICAgICAgICAgICAgICBkb2MsICIjb2JqZWN0LTQiLCByZXRyaWV2YWxUcmFuc2Zvcm1zLCAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1g1MDlEYXRhIikpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IHNpZ25pbmciKTsKKyAgICAgICAgICAgIHNpZy5zaWduKHByaXZhdGVLZXkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCBzaWduaW5nIik7CisgICAgICAgIH0KKworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzaWduYXR1cmVGaWxlKTsKKworICAgICAgICBYTUxVdGlscy5vdXRwdXRET01jMTRuV2l0aENvbW1lbnRzKGRvYywgZik7CisgICAgICAgIGYuY2xvc2UoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcm90ZSBzaWduYXR1cmUgdG8gIiArIEJhc2VVUkkpOworCisgICAgICAgIFNpZ25lZEluZm8gcyA9IHNpZy5nZXRTaWduZWRJbmZvKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBSZWZlcmVuY2UgciA9IHMuaXRlbShpKTsKKyAgICAgICAgICAgIFN0cmluZyBmbiA9ICJidWlsZC9tZXJsaW4xNl8iK2krIi5odG1sIjsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JvdGUgUmVmZXJlbmNlICIgKyBpICsgIiB0byBmaWxlICIgKyBmbik7CisgICAgICAgICAgICBKYXZhVXRpbHMud3JpdGVCeXRlc1RvRmlsZW5hbWUoZm4sIHIuZ2V0SFRNTFJlcHJlc2VudGF0aW9uKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBjcmVhdGVPYmplY3Q0CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2lnCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRWxlbWVudCBjcmVhdGVPYmplY3Q0KFhNTFNpZ25hdHVyZSBzaWcpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIERvY3VtZW50IGRvYyA9IHNpZy5nZXRFbGVtZW50KCkuZ2V0T3duZXJEb2N1bWVudCgpOworICAgICAgICBTdHJpbmcgQmFzZVVSSSA9IHNpZy5nZXRCYXNlVVJJKCk7CisgICAgICAgIE1hbmlmZXN0IG1hbmlmZXN0ID0gbmV3IE1hbmlmZXN0KGRvYyk7CisgICAgICAgIG1hbmlmZXN0LmFkZFJlc291cmNlUmVzb2x2ZXIobmV3IE9mZmxpbmVSZXNvbHZlcigpKTsKKworICAgICAgICBtYW5pZmVzdC5zZXRJZCgibWFuaWZlc3QtMSIpOworICAgICAgICBtYW5pZmVzdC5hZGREb2N1bWVudChCYXNlVVJJLCAiaHR0cDovL3d3dy53My5vcmcvVFIveG1sLXN0eWxlc2hlZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hbmlmZXN0LXJlZmVyZW5jZS0xIiwgbnVsbCk7CisgICAgICAgIG1hbmlmZXN0LmFkZERvY3VtZW50KEJhc2VVUkksICIjcmVmZXJlbmNlLTEiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI1JlZmVyZW5jZSIpOworCisgICAgICAgIFN0cmluZyB4c2x0ID0gIiIKKyAgICAgICAgICAgICsgIjx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9J2h0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSdcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgICB4bWxucz0naHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL3N0cmljdCcgXG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9J2ZvbycgXG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgICAgdmVyc2lvbj0nMS4wJz5cbiIKKyAgICAgICAgICAgICsgIiAgPHhzbDpvdXRwdXQgZW5jb2Rpbmc9J1VURi04JyBcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgaW5kZW50PSdubycgXG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgIG1ldGhvZD0neG1sJyAvPlxuIgorICAgICAgICAgICAgKyAiICA8eHNsOnRlbXBsYXRlIG1hdGNoPScvJz5cbiIKKyAgICAgICAgICAgICsgIiAgICA8aHRtbD5cbiIKKyAgICAgICAgICAgICsgIiAgICAgIDxoZWFkPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICA8dGl0bGU+Tm90YXJpZXM8L3RpdGxlPlxuIgorICAgICAgICAgICAgKyAiICAgICAgPC9oZWFkPlxuIgorICAgICAgICAgICAgKyAiICAgICAgPGJvZHk+XG4iCisgICAgICAgICAgICArICIgICAgICAgIDx0YWJsZT5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0nTm90YXJpZXMvTm90YXJ5Jz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgIDx0cj5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgPHRoPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSdAbmFtZScgLz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgPC90aD5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgIDwvdHI+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgPC94c2w6Zm9yLWVhY2g+XG4iCisgICAgICAgICAgICArICIgICAgICAgIDwvdGFibGU+XG4iCisgICAgICAgICAgICArICIgICAgICA8L2JvZHk+XG4iCisgICAgICAgICAgICArICIgICAgPC9odG1sPlxuIgorICAgICAgICAgICAgKyAiICA8L3hzbDp0ZW1wbGF0ZT5cbiIKKyAgICAgICAgICAgICsgIjwveHNsOnN0eWxlc2hlZXQ+XG4iCisgICAgICAgICAgICA7CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvY3hzbHQgPQorICAgICAgICAgICAgZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhzbHQuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBOb2RlIHhzbEVsZW0gPSBkb2N4c2x0LmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICBOb2RlIHhzbEVsZW1JbXBvcnRlZCA9IGRvYy5pbXBvcnROb2RlKHhzbEVsZW0sIHRydWUpOworICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworCisgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX1hTTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChFbGVtZW50KSB4c2xFbGVtSW1wb3J0ZWQpOworICAgICAgICBtYW5pZmVzdC5hZGREb2N1bWVudChCYXNlVVJJLCAiI25vdGFyaWVzIiwgdHJhbnNmb3JtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEsIG51bGwsIG51bGwpOworCisgICAgICAgIHJldHVybiBtYW5pZmVzdC5nZXRFbGVtZW50KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL0NyZWF0ZVNpZ25hdHVyZS5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVTaWduYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjBiN2E2Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9DcmVhdGVTaWduYXR1cmUuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuc2lnbmF0dXJlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLlRyYW5zZm9ybXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkVsZW1lbnRQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisKKy8qKgorICogQGF1dGhvciAkQXV0aG9yJAorICovCitwdWJsaWMgY2xhc3MgQ3JlYXRlU2lnbmF0dXJlIHsKKworICAgIHN0YXRpYyBvcmcuc2xmNGouTG9nZ2VyIGxvZyA9CisgICAgICAgIG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihDcmVhdGVTaWduYXR1cmUuY2xhc3MpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyB1bnVzZWRbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEVsZW1lbnRQcm94eS5zZXREZWZhdWx0UHJlZml4KENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMsICJkcyIpOworCisgICAgICAgIC8vQWxsIHRoZSBwYXJhbWV0ZXJzIGZvciB0aGUga2V5c3RvcmUKKyAgICAgICAgU3RyaW5nIGtleXN0b3JlVHlwZSA9ICJKS1MiOworICAgICAgICBTdHJpbmcga2V5c3RvcmVGaWxlID0gInNhbXBsZXMvZGF0YS9rZXlzdG9yZS5qa3MiOworICAgICAgICBTdHJpbmcga2V5c3RvcmVQYXNzID0gInhtbHNlY3VyaXR5IjsKKyAgICAgICAgU3RyaW5nIHByaXZhdGVLZXlBbGlhcyA9ICJ0ZXN0IjsKKyAgICAgICAgU3RyaW5nIHByaXZhdGVLZXlQYXNzID0gInhtbHNlY3VyaXR5IjsKKyAgICAgICAgU3RyaW5nIGNlcnRpZmljYXRlQWxpYXMgPSAidGVzdCI7CisgICAgICAgIEZpbGUgc2lnbmF0dXJlRmlsZSA9IG5ldyBGaWxlKCJidWlsZC9zaWduYXR1cmUueG1sIik7CisKKyAgICAgICAgS2V5U3RvcmUga3MgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZShrZXlzdG9yZVR5cGUpOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShrZXlzdG9yZUZpbGUpOworCisgICAgICAgIC8vbG9hZCB0aGUga2V5c3RvcmUKKyAgICAgICAga3MubG9hZChmaXMsIGtleXN0b3JlUGFzcy50b0NoYXJBcnJheSgpKTsKKworICAgICAgICAvL2dldCB0aGUgcHJpdmF0ZSBrZXkgZm9yIHNpZ25pbmcuCisgICAgICAgIFByaXZhdGVLZXkgcHJpdmF0ZUtleSA9CisgICAgICAgICAgICAoUHJpdmF0ZUtleSkga3MuZ2V0S2V5KHByaXZhdGVLZXlBbGlhcywgcHJpdmF0ZUtleVBhc3MudG9DaGFyQXJyYXkoKSk7CisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0KKyAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICAvL1hNTCBTaWduYXR1cmUgbmVlZHMgdG8gYmUgbmFtZXNwYWNlIGF3YXJlCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IGRiLm5ld0RvY3VtZW50KCk7CisKKyAgICAgICAgLy9CdWlsZCBhIHNhbXBsZSBkb2N1bWVudC4gSXQgd2lsbCBsb29rIHNvbWV0aGluZyBsaWtlOgorICAgICAgICAvLzwhLS0gQ29tbWVudCBiZWZvcmUgLS0+CisgICAgICAgIC8vPGFwYWNoZTpSb290RWxlbWVudCB4bWxuczphcGFjaGU9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9ucy8jYXBwMSI+U29tZSBzaW1wbGUgdGV4dAorICAgICAgICAvLzwvYXBhY2hlOlJvb3RFbGVtZW50PgorICAgICAgICAvLzwhLS0gQ29tbWVudCBhZnRlciAtLT4KKyAgICAgICAgZG9jLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVDb21tZW50KCIgQ29tbWVudCBiZWZvcmUgIikpOworCisgICAgICAgIEVsZW1lbnQgcm9vdCA9CisgICAgICAgICAgICBkb2MuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbnMvI2FwcDEiLCAiYXBhY2hlOlJvb3RFbGVtZW50Iik7CisKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiYXR0cjEiLCAidGVzdDEiKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiYXR0cjIiLCAidGVzdDIiKTsKKyAgICAgICAgcm9vdC5zZXRBdHRyaWJ1dGVOUyhDb25zdGFudHMuTmFtZXNwYWNlU3BlY05TLCAieG1sbnM6Zm9vIiwgImh0dHA6Ly9leGFtcGxlLm9yZy8jZm9vIik7CisgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlTlMoImh0dHA6Ly9leGFtcGxlLm9yZy8jZm9vIiwgImZvbzphdHRyMSIsICJmb28ncyB0ZXN0Iik7CisKKworCisgICAgICAgIHJvb3Quc2V0QXR0cmlidXRlTlMoQ29uc3RhbnRzLk5hbWVzcGFjZVNwZWNOUywgInhtbG5zOmFwYWNoZSIsICJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbnMvI2FwcDEiKTsKKyAgICAgICAgZG9jLmFwcGVuZENoaWxkKHJvb3QpOworICAgICAgICByb290LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiU29tZSBzaW1wbGUgdGV4dFxuIikpOworCisgICAgICAgIC8vVGhlIEJhc2VVUkkgaXMgdGhlIFVSSSB0aGF0J3MgdXNlZCB0byBwcmVwZW5kIHRvIHJlbGF0aXZlIFVSSXMKKyAgICAgICAgU3RyaW5nIEJhc2VVUkkgPSBzaWduYXR1cmVGaWxlLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpOworICAgICAgICAvL0NyZWF0ZSBhbiBYTUwgU2lnbmF0dXJlIG9iamVjdCBmcm9tIHRoZSBkb2N1bWVudCwgQmFzZVVSSSBhbmQKKyAgICAgICAgLy9zaWduYXR1cmUgYWxnb3JpdGhtIChpbiB0aGlzIGNhc2UgRFNBKQorICAgICAgICBYTUxTaWduYXR1cmUgc2lnID0KKyAgICAgICAgICAgIG5ldyBYTUxTaWduYXR1cmUoZG9jLCBCYXNlVVJJLCBYTUxTaWduYXR1cmUuQUxHT19JRF9TSUdOQVRVUkVfRFNBKTsKKworCisgICAgICAgIC8vQXBwZW5kIHRoZSBzaWduYXR1cmUgZWxlbWVudCB0byB0aGUgcm9vdCBlbGVtZW50IGJlZm9yZSBzaWduaW5nIGJlY2F1c2UKKyAgICAgICAgLy90aGlzIGlzIGdvaW5nIHRvIGJlIGFuIGVudmVsb3BlZCBzaWduYXR1cmUuCisgICAgICAgIC8vVGhpcyBtZWFucyB0aGUgc2lnbmF0dXJlIGlzIGdvaW5nIHRvIGJlIGVudmVsb3BlZCBieSB0aGUgZG9jdW1lbnQuCisgICAgICAgIC8vVHdvIG90aGVyIHBvc3NpYmxlIGZvcm1zIGFyZSBlbnZlbG9waW5nIHdoZXJlIHRoZSBkb2N1bWVudCBpcyBpbnNpZGUgdGhlCisgICAgICAgIC8vc2lnbmF0dXJlIGFuZCBkZXRhY2hlZCB3aGVyZSB0aGV5IGFyZSBzZXBlcmF0ZS4KKyAgICAgICAgLy9Ob3RlIHRoYXQgdGhleSBjYW4gYmUgbWl4ZWQgaW4gMSBzaWduYXR1cmUgd2l0aCBzZXBlcmF0ZSByZWZlcmVuY2VzIGFzCisgICAgICAgIC8vc2hvd24gYmVsb3cuCisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoc2lnLmdldEVsZW1lbnQoKSk7CisgICAgICAgIGRvYy5hcHBlbmRDaGlsZChkb2MuY3JlYXRlQ29tbWVudCgiIENvbW1lbnQgYWZ0ZXIgIikpOworICAgICAgICBzaWcuZ2V0U2lnbmVkSW5mbygpLmFkZFJlc291cmNlUmVzb2x2ZXIoCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy51dGlscy5yZXNvbHZlci5PZmZsaW5lUmVzb2x2ZXIoKQorICAgICAgICApOworCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vY3JlYXRlIHRoZSB0cmFuc2Zvcm1zIG9iamVjdCBmb3IgdGhlIERvY3VtZW50L1JlZmVyZW5jZQorICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICAgICAgLy9GaXJzdCB3ZSBoYXZlIHRvIHN0cmlwIGF3YXkgdGhlIHNpZ25hdHVyZSBlbGVtZW50IChpdCdzIG5vdCBwYXJ0IG9mIHRoZQorICAgICAgICAgICAgLy9zaWduYXR1cmUgY2FsY3VsYXRpb25zKS4gVGhlIGVudmVsb3BlZCB0cmFuc2Zvcm0gY2FuIGJlIHVzZWQgZm9yIHRoaXMuCisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9FTlZFTE9QRURfU0lHTkFUVVJFKTsKKyAgICAgICAgICAgIC8vUGFydCBvZiB0aGUgc2lnbmF0dXJlIGVsZW1lbnQgbmVlZHMgdG8gYmUgY2Fub25pY2FsaXplZC4gSXQgaXMgYSBraW5kCisgICAgICAgICAgICAvL29mIG5vcm1hbGl6aW5nIGFsZ29yaXRobSBmb3IgWE1MLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2UgdGFrZSBhCisgICAgICAgICAgICAvL2xvb2sgYXQgdGhlIFczQyBYTUwgRGlnaXRhbCBTaWduYXR1cmUgd2VicGFnZS4KKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX0MxNE5fV0lUSF9DT01NRU5UUyk7CisgICAgICAgICAgICAvL0FkZCB0aGUgYWJvdmUgRG9jdW1lbnQvUmVmZXJlbmNlCisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiIsIHRyYW5zZm9ybXMsIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vQWRkIGluIDIgZXh0ZXJuYWwgVVJJcy4gVGhpcyBpcyBhIGRldGFjaGVkIFJlZmVyZW5jZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBXaGVuIHNpZ24oKSBpcyBjYWxsZWQsIHR3byBuZXR3b3JrIGNvbm5lY3Rpb25zIGFyZSBtYWRlLiAtLSB3ZWxsLAorICAgICAgICAgICAgLy8gbm90IHJlYWxseSwgYXMgd2UgdXNlIHRoZSBPZmZsaW5lUmVzb2x2ZXIgd2hpY2ggYWN0cyBhcyBhIHByb3h5IGZvcgorICAgICAgICAgICAgLy8gdGhlc2UgdHdvIHJlc291Y2VzIDstKSkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoImh0dHA6Ly93d3cudzMub3JnL1RSL3htbC1zdHlsZXNoZWV0Iik7CisgICAgICAgICAgICBzaWcuYWRkRG9jdW1lbnQoImh0dHA6Ly93d3cubnVlLmV0LWluZi51bmktc2llZ2VuLmRlL2luZGV4Lmh0bWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vQWRkIGluIHRoZSBLZXlJbmZvIGZvciB0aGUgY2VydGlmaWNhdGUgdGhhdCB3ZSB1c2VkIHRoZSBwcml2YXRlIGtleSBvZgorICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPQorICAgICAgICAgICAgICAgIChYNTA5Q2VydGlmaWNhdGUpIGtzLmdldENlcnRpZmljYXRlKGNlcnRpZmljYXRlQWxpYXMpOworCisgICAgICAgICAgICBzaWcuYWRkS2V5SW5mbyhjZXJ0KTsKKyAgICAgICAgICAgIHNpZy5hZGRLZXlJbmZvKGNlcnQuZ2V0UHVibGljS2V5KCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTdGFydCBzaWduaW5nIik7CisgICAgICAgICAgICBzaWcuc2lnbihwcml2YXRlS2V5KTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRmluaXNoZWQgc2lnbmluZyIpOworICAgICAgICB9CisKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oc2lnbmF0dXJlRmlsZSk7CisKKyAgICAgICAgWE1MVXRpbHMub3V0cHV0RE9NYzE0bldpdGhDb21tZW50cyhkb2MsIGYpOworCisgICAgICAgIGYuY2xvc2UoKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcm90ZSBzaWduYXR1cmUgdG8gIiArIEJhc2VVUkkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9IZXJlU2lnbmVyLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL0hlcmVTaWduZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTAzZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9IZXJlU2lnbmVyLmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5PYmplY3RDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlNpZ25lZEluZm87CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLlRyYW5zZm9ybXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5wYXJhbXMuWFBhdGhDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkVsZW1lbnRQcm94eTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5IZWxwZXJOb2RlTGlzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqLworcHVibGljIGNsYXNzIEhlcmVTaWduZXIgeworCisgICAgc3RhdGljIG9yZy5zbGY0ai5Mb2dnZXIgbG9nID0KKyAgICAgICAgb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKEhlcmVTaWduZXIuY2xhc3MpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyB1bnVzZWRbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBrZXlzdG9yZVR5cGUgPSAiSktTIjsKKyAgICAgICAgU3RyaW5nIGtleXN0b3JlRmlsZSA9ICJzYW1wbGVzL2RhdGEva2V5c3RvcmUuamtzIjsKKyAgICAgICAgU3RyaW5nIGtleXN0b3JlUGFzcyA9ICJ4bWxzZWN1cml0eSI7CisgICAgICAgIFN0cmluZyBwcml2YXRlS2V5QWxpYXMgPSAidGVzdCI7CisgICAgICAgIFN0cmluZyBwcml2YXRlS2V5UGFzcyA9ICJ4bWxzZWN1cml0eSI7CisgICAgICAgIFN0cmluZyBjZXJ0aWZpY2F0ZUFsaWFzID0gInRlc3QiOworICAgICAgICBGaWxlIHNpZ25hdHVyZUZpbGUgPSBuZXcgRmlsZSgiYnVpbGQvaGVyZVNpZ25hdHVyZS54bWwiKTsKKworICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKGtleXN0b3JlVHlwZSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGtleXN0b3JlRmlsZSk7CisKKyAgICAgICAga3MubG9hZChmaXMsIGtleXN0b3JlUGFzcy50b0NoYXJBcnJheSgpKTsKKworICAgICAgICBQcml2YXRlS2V5IHByaXZhdGVLZXkgPQorICAgICAgICAgICAgKFByaXZhdGVLZXkpIGtzLmdldEtleShwcml2YXRlS2V5QWxpYXMsIHByaXZhdGVLZXlQYXNzLnRvQ2hhckFycmF5KCkpOworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0gZGIubmV3RG9jdW1lbnQoKTsKKworICAgICAgICBTdHJpbmcgQmFzZVVSSSA9IHNpZ25hdHVyZUZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCk7CisgICAgICAgIEVsZW1lbnRQcm94eS5zZXREZWZhdWx0UHJlZml4KENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMsICJwcm9mIik7CisgICAgICAgIFhNTFNpZ25hdHVyZSBzaWcgPQorICAgICAgICAgICAgbmV3IFhNTFNpZ25hdHVyZShkb2MsIEJhc2VVUkksIFhNTFNpZ25hdHVyZS5BTEdPX0lEX1NJR05BVFVSRV9EU0EpOworCisgICAgICAgIGRvYy5hcHBlbmRDaGlsZChzaWcuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgc2lnLmdldFNpZ25lZEluZm8oKQorICAgICAgICAgICAgLmFkZFJlc291cmNlUmVzb2x2ZXIobmV3IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudXRpbHMucmVzb2x2ZXIuT2ZmbGluZVJlc29sdmVyKCkpOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE9iamVjdENvbnRhaW5lciBvYjEgPSBuZXcgT2JqZWN0Q29udGFpbmVyKGRvYyk7CisgICAgICAgICAgICBvYjEuc2V0SWQoIm9iamVjdC0xIik7CisgICAgICAgICAgICBvYjEuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcblNpZ25lZCBUZXh0XG4iKSk7CisgICAgICAgICAgICBFbGVtZW50IGMgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG51bGwsICJlbGVtZW50Iik7CisgICAgICAgICAgICBjLnNldEF0dHJpYnV0ZU5TKG51bGwsICJuYW1lIiwgInZhbCIpOworICAgICAgICAgICAgb2IxLmFwcGVuZENoaWxkKGMpOworICAgICAgICAgICAgc2lnLmFwcGVuZE9iamVjdChvYjEpOworCisgICAgICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworICAgICAgICAgICAgWFBhdGhDb250YWluZXIgeGMgPSBuZXcgWFBhdGhDb250YWluZXIoZG9jKTsKKyAgICAgICAgICAgIHhjLnNldFhQYXRoTmFtZXNwYWNlQ29udGV4dCgicHJvZiIsIENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMpOworCisgICAgICAgICAgICBTdHJpbmcgeHBhdGggPSAiXG4iCisgICAgICAgICAgICAgICAgKyAiY291bnQoIiArICJcbiIKKyAgICAgICAgICAgICAgICArICIgYW5jZXN0b3Itb3Itc2VsZjo6cHJvZjpPYmplY3QgIiArICJcbiIKKyAgICAgICAgICAgICAgICArICIgfCAiICsgIlxuIgorICAgICAgICAgICAgICAgICsgIiBoZXJlKCkvYW5jZXN0b3I6OnByb2Y6U2lnbmF0dXJlWzFdL2NoaWxkOjpwcm9mOk9iamVjdFtASWQ9J29iamVjdC0xJ10iICsgIlxuIgorICAgICAgICAgICAgICAgICsgIikgPD0gY291bnQoIiArICJcbiIKKyAgICAgICAgICAgICAgICArICIgYW5jZXN0b3Itb3Itc2VsZjo6cHJvZjpPYmplY3QiICsgIlxuIgorICAgICAgICAgICAgICAgICsgIikgIiArICJcbiI7CisKKyAgICAgICAgICAgIHhjLnNldFhQYXRoKHhwYXRoKTsKKyAgICAgICAgICAgIEhlbHBlck5vZGVMaXN0IG5sID0gbmV3IEhlbHBlck5vZGVMaXN0KCk7CisgICAgICAgICAgICBubC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOworICAgICAgICAgICAgbmwuYXBwZW5kQ2hpbGQoeGMuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgICAgIG5sLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX1hQQVRILCBubCk7CisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9DMTROX1dJVEhfQ09NTUVOVFMpOworICAgICAgICAgICAgc2lnLmFkZERvY3VtZW50KCIiLCB0cmFuc2Zvcm1zLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSk7CisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9CisgICAgICAgICAgICAgICAgKFg1MDlDZXJ0aWZpY2F0ZSkga3MuZ2V0Q2VydGlmaWNhdGUoY2VydGlmaWNhdGVBbGlhcyk7CisKKyAgICAgICAgICAgIHNpZy5hZGRLZXlJbmZvKGNlcnQpOworICAgICAgICAgICAgc2lnLmFkZEtleUluZm8oY2VydC5nZXRQdWJsaWNLZXkoKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0YXJ0IHNpZ25pbmciKTsKKyAgICAgICAgICAgIHNpZy5zaWduKHByaXZhdGVLZXkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaW5pc2hlZCBzaWduaW5nIik7CisgICAgICAgIH0KKworICAgICAgICBTaWduZWRJbmZvIHMgPSBzaWcuZ2V0U2lnbmVkSW5mbygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMuZ2V0U2lnbmVkQ29udGVudExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHMuZ2V0U2lnbmVkQ29udGVudEl0ZW0oaSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZiA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHNpZ25hdHVyZUZpbGUpOworCisgICAgICAgIFhNTFV0aWxzLm91dHB1dERPTWMxNG5XaXRoQ29tbWVudHMoZG9jLCBmKTsKKworICAgICAgICBmLmNsb3NlKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JvdGUgc2lnbmF0dXJlIHRvICIgKyBCYXNlVVJJKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvTnVsbFVSSVJlZmVyZW5jZVJlc29sdmVyLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL051bGxVUklSZWZlcmVuY2VSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzQwY2UKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL051bGxVUklSZWZlcmVuY2VSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5zaWduYXR1cmU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMucmVzb2x2ZXIuUmVzb3VyY2VSZXNvbHZlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5yZXNvbHZlci5SZXNvdXJjZVJlc29sdmVyU3BpOworaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CisKKy8qKgorICogVGhpcyBpcyBhIHNhbXBsZSBSZXNvdXJjZVJlc29sdmVyIHdobyBkZW1vbnN0cmF0ZWQgaG93IFJlZmVyZW5jZXMgd2l0aG91dAorICogVVJJIGF0dHJpYnVldCBjb3VsZCBiZSBoYW5kbGVkLgorICoKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqLworcHVibGljIGNsYXNzIE51bGxVUklSZWZlcmVuY2VSZXNvbHZlciBleHRlbmRzIFJlc291cmNlUmVzb2x2ZXJTcGkgeworCisgICAgc3RhdGljIG9yZy5zbGY0ai5Mb2dnZXIgbG9nID0KKyAgICAgICAgb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE51bGxVUklSZWZlcmVuY2VSZXNvbHZlci5jbGFzcyk7CisKKyAgICAvKiogRmllbGQgX2RhdGFbXSAqLworICAgIGJ5dGUgX2RhdGFbXSA9IG51bGw7CisKKyAgICAvKiogRmllbGQgX2RhdGEyW11bXSAqLworICAgIGJ5dGUgX2RhdGEyW11bXSA9IG51bGw7CisKKyAgICAvKiogRmllbGQgX2NvdW50ICovCisgICAgaW50IF9jb3VudCA9IC0xOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgTnVsbFVSSVJlZmVyZW5jZVJlc29sdmVyCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YQorICAgICAqLworICAgIHB1YmxpYyBOdWxsVVJJUmVmZXJlbmNlUmVzb2x2ZXIoYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgX2RhdGEgPSBkYXRhOworICAgICAgICBfY291bnQgPSAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBOdWxsVVJJUmVmZXJlbmNlUmVzb2x2ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhCisgICAgICovCisgICAgcHVibGljIE51bGxVUklSZWZlcmVuY2VSZXNvbHZlcihieXRlW11bXSBkYXRhKSB7CisgICAgICAgIF9kYXRhMiA9IGRhdGE7CisgICAgICAgIF9jb3VudCA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGVuZ2luZVJlc29sdmUKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkKKyAgICAgKiBAcGFyYW0gQmFzZVVSSQorICAgICAqCisgICAgICogQHRocm93cyBSZXNvdXJjZVJlc29sdmVyRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFhNTFNpZ25hdHVyZUlucHV0IGVuZ2luZVJlc29sdmUoQXR0ciB1cmksIFN0cmluZyBCYXNlVVJJKQorICAgICAgICB0aHJvd3MgUmVzb3VyY2VSZXNvbHZlckV4Y2VwdGlvbiB7CisKKyAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgcmVzdWx0ID0gbnVsbDsKKworICAgICAgICBpZiAoKHRoaXMuX2RhdGEgIT0gbnVsbCkgJiYgKHRoaXMuX2NvdW50ID09IC0xKSkgeworCisgICAgICAgICAgICAvLyB3ZSBhbHdheXMgcmV0dXJuIHRoZSBzYW1lIHN0dWZmOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KHRoaXMuX2RhdGEpOworCisgICAgICAgICAgICByZXN1bHQuc2V0U291cmNlVVJJKCJtZW1vcnk6Ly9udWxsIik7CisgICAgICAgICAgICByZXN1bHQuc2V0TUlNRVR5cGUoInRleHQvdHh0Iik7CisgICAgICAgIH0gZWxzZSBpZiAoKHRoaXMuX2RhdGEgPT0gbnVsbCkgJiYgKHRoaXMuX2NvdW50ICE9IC0xKSkgeworICAgICAgICAgICAgaWYgKHRoaXMuX2NvdW50IDwgdGhpcy5fZGF0YTIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KHRoaXMuX2RhdGEyW3RoaXMuX2NvdW50XSk7CisKKyAgICAgICAgICAgICAgICByZXN1bHQuc2V0U291cmNlVVJJKCJtZW1vcnk6Ly8iICsgdGhpcy5fY291bnQpOworCisgICAgICAgICAgICAgICAgdGhpcy5fY291bnQrKzsKKworICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRNSU1FVHlwZSgidGV4dC90eHQiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGVyck1zZyA9ICJZb3UgZGlkIG5vdCBzdXBwbHkgZW5vdWdoIGRhdGEhISEgVGhlcmUgYXJlIG9ubHkgIgorICAgICAgICAgICAgICAgICAgICArICh0aGlzLl9kYXRhMi5sZW5ndGgpICsgIiBieXRlW10gYXJyYXlzIjsKKyAgICAgICAgICAgICAgICBPYmplY3QgZXhBcmdzW10gPSB7IGVyck1zZyB9OworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlUmVzb2x2ZXJFeGNlcHRpb24oImVtcHR5IiwgZXhBcmdzLCB1cmksIEJhc2VVUkkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgT2JqZWN0IGV4QXJnc1tdID0geyAiWW91IGRpZCBub3Qgc3VwcGx5IGRhdGEgISEhIiB9OworCisgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VSZXNvbHZlckV4Y2VwdGlvbigiZW1wdHkiLCBleEFyZ3MsIHVyaSwgQmFzZVVSSSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBlbmdpbmVDYW5SZXNvbHZlCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpCisgICAgICogQHBhcmFtIEJhc2VVUkkKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVuZ2luZUNhblJlc29sdmUoQXR0ciB1cmksIFN0cmluZyBCYXNlVVJJKSB7CisKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoKHRoaXMuX2RhdGEgIT0gbnVsbCkgJiYgKHRoaXMuX2NvdW50ID09IC0xKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgodGhpcy5fZGF0YSA9PSBudWxsKSAmJiAodGhpcy5fY291bnQgIT0gLTEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGVuZ2luZUdldFByb3BlcnR5S2V5cworICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nW10gZW5naW5lR2V0UHJvcGVydHlLZXlzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1NpZ25hdHVyZVByb3BlcnRpZXNTYW1wbGUuamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvU2lnbmF0dXJlUHJvcGVydGllc1NhbXBsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOGQ1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1NpZ25hdHVyZVByb3BlcnRpZXNTYW1wbGUuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5zaWduYXR1cmU7CisKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYzE0bi5DYW5vbmljYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5PYmplY3RDb250YWluZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlNpZ25hdHVyZVByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlNpZ25hdHVyZVByb3BlcnR5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CisKKy8qKgorICogQ2xhc3MgU2lnbmF0dXJlUHJvcGVydGllc1NhbXBsZQorICoKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqLworcHVibGljIGNsYXNzIFNpZ25hdHVyZVByb3BlcnRpZXNTYW1wbGUgeworCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5uZXdEb2N1bWVudCgpOworICAgICAgICBYTUxTaWduYXR1cmUgc2lnID0gbmV3IFhNTFNpZ25hdHVyZShkb2MsIG51bGwsIFhNTFNpZ25hdHVyZS5BTEdPX0lEX01BQ19ITUFDX1NIQTEpOworCisgICAgICAgIGRvYy5hcHBlbmRDaGlsZChzaWcuZ2V0RWxlbWVudCgpKTsKKworICAgICAgICBTaWduYXR1cmVQcm9wZXJ0eSBwcm9wMSA9CisgICAgICAgICAgICBuZXcgU2lnbmF0dXJlUHJvcGVydHkoZG9jLCAiaHR0cDovL3d3dy54bWxzZWN1cml0eS5vcmcvI3RhcmdldCIsICJwcm9wMSIpOworCisgICAgICAgIHByb3AxLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuICAgc29tZSBkYXRhIGZvciB0aGlzIHByb3BlcnR5XG4iKSk7CisKKyAgICAgICAgU2lnbmF0dXJlUHJvcGVydGllcyBwcm9wcyA9IG5ldyBTaWduYXR1cmVQcm9wZXJ0aWVzKGRvYyk7CisKKyAgICAgICAgcHJvcHMuYWRkU2lnbmF0dXJlUHJvcGVydHkocHJvcDEpOworCisgICAgICAgIE9iamVjdENvbnRhaW5lciBvYmplY3QgPSBuZXcgT2JqZWN0Q29udGFpbmVyKGRvYyk7CisKKyAgICAgICAgb2JqZWN0LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisgICAgICAgIG9iamVjdC5hcHBlbmRDaGlsZChwcm9wcy5nZXRFbGVtZW50KCkpOworICAgICAgICBvYmplY3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKKyAgICAgICAgc2lnLmFwcGVuZE9iamVjdChvYmplY3QpOworICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiNwcm9wMSIpOworCisgICAgICAgIFN0cmluZyBzZWNyZXRLZXkgPSAic2VjcmV0IjsKKworICAgICAgICBzaWcuZ2V0S2V5SW5mbygpLmFkZEtleU5hbWUoIlRoZSBVVEYtOCBvY3RldHMgb2YgXCIiICsgc2VjcmV0S2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBhcmUgdXNlZCBmb3Igc2lnbmluZyAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWNyZXRLZXkubGVuZ3RoKCkgKyAiIG9jdGV0cykiKTsKKyAgICAgICAgc2lnLnNpZ24oc2lnLmNyZWF0ZVNlY3JldEtleShzZWNyZXRLZXkuZ2V0Qnl0ZXMoKSkpOworCisgICAgICAgIENhbm9uaWNhbGl6ZXIgYzE0biA9CisgICAgICAgICAgICBDYW5vbmljYWxpemVyLmdldEluc3RhbmNlKENhbm9uaWNhbGl6ZXIuQUxHT19JRF9DMTROX1dJVEhfQ09NTUVOVFMpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKGMxNG4uY2Fub25pY2FsaXplU3VidHJlZShkb2MpKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHNpZy5nZXRTaWduZWRJbmZvKCkuaXRlbSgwKS5nZXRUcmFuc2Zvcm1zT3V0cHV0KCkuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9UZXN0U2lnbmF0dXJlLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1Rlc3RTaWduYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQ2ZGM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9UZXN0U2lnbmF0dXJlLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5LZXlJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuc3RvcmFnZS5TdG9yYWdlUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy51dGlscy5yZXNvbHZlci5PZmZsaW5lUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLkRTTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLlNhbXBsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIENsYXNzIFRlc3RTaWduYXR1cmUKKyAqCisgKiBAYXV0aG9yICRBdXRob3IkCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U2lnbmF0dXJlIHsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBtYWluCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW51c2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB7CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBTdHJpbmcgbWVybGluc0RpciA9CisgICAgICAgICAgICAic2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctZWlnaHRlZW4vIjsKKyAgICAgICAgU3RyaW5nIG91ckRpciA9CisgICAgICAgICAgICAic2FtcGxlcy9kYXRhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RlbXAva2V5LyI7CisgICAgICAgIFN0cmluZyBmaWxlbmFtZXNbXSA9IHsgbWVybGluc0RpciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMCAqLyAic2lnbmF0dXJlLWtleW5hbWUueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJsaW5zRGlyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxICovICJzaWduYXR1cmUtcmV0cmlldmFsbWV0aG9kLXJhd3g1MDljcnQueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJsaW5zRGlyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAyICovICJzaWduYXR1cmUteDUwOS1jcnQtY3JsLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVybGluc0RpciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMyAqLyAic2lnbmF0dXJlLXg1MDktY3J0LnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVybGluc0RpciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNCAqLyAic2lnbmF0dXJlLXg1MDktaXMueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJsaW5zRGlyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA1ICovICJzaWduYXR1cmUteDUwOS1za2kueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJsaW5zRGlyICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ICovICJzaWduYXR1cmUteDUwOS1zbi54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91ckRpciArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNyAqLyAic2lnbmF0dXJlLXJldHJpZXZhbG1ldGhvZC14NTA5ZGF0YS54bWwiCisgICAgICAgIH07CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGludCBlbmQgPSBmaWxlbmFtZXMubGVuZ3RoOworCisgICAgICAgIC8vIGludCBlbmQgPSBmaWxlbmFtZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBmaWxlX3RvX3ZlcmlmeSA9IHN0YXJ0OyBmaWxlX3RvX3ZlcmlmeSA8IGVuZDsgZmlsZV90b192ZXJpZnkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlbmFtZXNbZmlsZV90b192ZXJpZnldOworICAgICAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKKworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIik7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeSB0byB2ZXJpZnkgIiArIGYudG9VUkwoKS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2MgPQorICAgICAgICAgICAgICAgICAgICBkYi5wYXJzZShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKTsKKworICAgICAgICAgICAgICAgIFhQYXRoRmFjdG9yeSB4cGYgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICBYUGF0aCB4cGF0aCA9IHhwZi5uZXdYUGF0aCgpOworICAgICAgICAgICAgICAgIHhwYXRoLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IERTTmFtZXNwYWNlQ29udGV4dCgpKTsKKworICAgICAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gIi8vZHM6U2lnbmF0dXJlWzFdIjsKKyAgICAgICAgICAgICAgICBFbGVtZW50IHNpZ0VsZW1lbnQgPQorICAgICAgICAgICAgICAgICAgICAoRWxlbWVudCkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgZG9jLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKworICAgICAgICAgICAgICAgIC8vQ3JlYXRlcyBhIFhNTFNpZ25hdHVyZSBmcm9tIHRoZSBlbGVtZW50IGFuZCB1c2VzIHRoZSBmaWxlbmFtZSBhcworICAgICAgICAgICAgICAgIC8vdGhlIGJhc2VVUkkuIFRoYXQgVVJJIGlzIHByZXBlbmRlZCB0byBhbGwgcmVsYXRpdmUgVVJJcy4KKyAgICAgICAgICAgICAgICBYTUxTaWduYXR1cmUgc2lnbmF0dXJlID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFhNTFNpZ25hdHVyZShzaWdFbGVtZW50LCAobmV3IEZpbGUoZmlsZW5hbWUpKS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUuYWRkUmVzb3VyY2VSZXNvbHZlcihuZXcgT2ZmbGluZVJlc29sdmVyKCkpOworCisgICAgICAgICAgICAgICAgLy9HZXQgdGhlIEtleUluZm8gb2JqZWN0LCB3aGljaCBtaWdodCBjb250YWluIHNvbWUgY2x1ZXMgYXMgdG8gd2hhdAorICAgICAgICAgICAgICAgIC8va2V5IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgc2lnbmF0dXJlLiBJdCBtaWdodCBhbHNvIGNvbnRhaW4gdGhlCisgICAgICAgICAgICAgICAgLy9mdWxsIGNlcnQuCisgICAgICAgICAgICAgICAgS2V5SW5mbyBraSA9IHNpZ25hdHVyZS5nZXRLZXlJbmZvKCk7CisKKyAgICAgICAgICAgICAgICBraS5hZGRTdG9yYWdlUmVzb2x2ZXIoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTdG9yYWdlUmVzb2x2ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5zdG9yYWdlLmltcGxlbWVudGF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5DZXJ0c0luRmlsZXN5c3RlbURpcmVjdG9yeVJlc29sdmVyKG1lcmxpbnNEaXIgKyAiY2VydHMiKSkpOworCisgICAgICAgICAgICAgICAgaWYgKGtpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9GaXJzdCB0cnkgdG8gc2VlIGlmIGl0IGlzIGFuIFg1MDlDZXJ0CisgICAgICAgICAgICAgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZS5nZXRLZXlJbmZvKCkuZ2V0WDUwOUNlcnRpZmljYXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNlcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGUgc2lnbmF0dXJlIGlzIHZhbGlkIHVzaW5nIHRoZSBjZXJ0CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNoZWNrOiAiICsgc2lnbmF0dXJlLmNoZWNrU2lnbmF0dXJlVmFsdWUoY2VydCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXliZSBpdCdzIGEgcHVibGljIGtleQorICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljS2V5IHBrID0gc2lnbmF0dXJlLmdldEtleUluZm8oKS5nZXRQdWJsaWNLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiB0aGUgc2lnbmF0dXJlIGlzIHZhbGlkIHVzaW5nIHRoZSBwdWJsaWMga2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDaGVjazogIiArIHNpZ25hdHVyZS5jaGVja1NpZ25hdHVyZVZhbHVlKHBrKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gWDUwOUNlcnQgb3IgUHVibGljS2V5IGNvdWxkIGJlIGZvdW5kLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ291bGQgbm90IGZpbmQgQ2VydGlmaWNhdGUgb3IgUHVibGljS2V5Iik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBzaWduYXR1cmUgZGlkIG5vdCBjb250YWluIGFueSBLZXlJbmZvIGVsZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb3VsZCBub3QgZmluZCBkczpLZXlJbmZvIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1ZlcmlmeUNvbGxlY3RhYmxlU2lnbmF0dXJlLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1ZlcmlmeUNvbGxlY3RhYmxlU2lnbmF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk0OWNkOQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvVmVyaWZ5Q29sbGVjdGFibGVTaWduYXR1cmUuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuc2lnbmF0dXJlOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuU2lnbmVkSW5mbzsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuRFNOYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuU2FtcGxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CisKKy8qKgorICoKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqLworcHVibGljIGNsYXNzIFZlcmlmeUNvbGxlY3RhYmxlU2lnbmF0dXJlIHsKKworICAgIHN0YXRpYyBvcmcuc2xmNGouTG9nZ2VyIGxvZyA9CisgICAgICAgIG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihWZXJpZnlDb2xsZWN0YWJsZVNpZ25hdHVyZS5jbGFzcyk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIEJvb2xlYW4uVFJVRSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGUgc2lnbmF0dXJlRmlsZSA9IG5ldyBGaWxlKCJidWlsZC9jb2xsZWN0YWJsZVNpZ25hdHVyZS54bWwiKTsKKyAgICAgICAgICAgIFN0cmluZyBCYXNlVVJJID0gc2lnbmF0dXJlRmlsZS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcnkgdG8gdmVyaWZ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpZ25hdHVyZUZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIGRiLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSWdub3JlQWxsRXJyb3JIYW5kbGVyKCkpOworCisgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2MgPQorICAgICAgICAgICAgICAgIGRiLnBhcnNlKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzaWduYXR1cmVGaWxlKSk7CisKKyAgICAgICAgICAgIFhQYXRoRmFjdG9yeSB4cGYgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIFhQYXRoIHhwYXRoID0geHBmLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cGF0aC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBEU05hbWVzcGFjZUNvbnRleHQoKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gIi8vZHM6U2lnbmF0dXJlWzFdIjsKKyAgICAgICAgICAgIE5vZGVMaXN0IHNpZ25hdHVyZUVsZW1zID0KKyAgICAgICAgICAgICAgICAoTm9kZUxpc3QpIHhwYXRoLmV2YWx1YXRlKGV4cHJlc3Npb24sIGRvYywgWFBhdGhDb25zdGFudHMuTk9ERVNFVCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmF0dXJlRWxlbXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgc2lnRWxlbWVudCA9IChFbGVtZW50KSBzaWduYXR1cmVFbGVtcy5pdGVtKGkpOworICAgICAgICAgICAgICAgIFhNTFNpZ25hdHVyZSBzaWduYXR1cmUgPSBuZXcgWE1MU2lnbmF0dXJlKHNpZ0VsZW1lbnQsIEJhc2VVUkkpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBzZWNyZXRLZXkgPSAic2VjcmV0VmFsdWUiLmdldEJ5dGVzKCk7CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICJUaGUgWE1MIHNpZ25hdHVyZSBudW1iZXIgIiArIGkgKyAiIGluIGZpbGUgIiArIEJhc2VVUkkgKyAiIGlzICIKKyAgICAgICAgICAgICAgICAgICAgKyAoc2lnbmF0dXJlLmNoZWNrU2lnbmF0dXJlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmUuY3JlYXRlU2VjcmV0S2V5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUNvbGxlY3RhYmxlU2lnbmF0dXJlLnBhc3NwaHJhc2UuZ2V0Qnl0ZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICApID8gInZhbGlkIChnb29kKSIgOiAiaW52YWxpZCAhISEhISAoYmFkKSIpKTsKKworICAgICAgICAgICAgICAgIFNpZ25lZEluZm8gcyA9IHNpZ25hdHVyZS5nZXRTaWduZWRJbmZvKCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHMuZ2V0U2lnbmVkQ29udGVudExlbmd0aCgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIFNpZ25lZCBSZXNvdXJjZSAiICsgaSArICIvIiArIGoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAjIyMjIyMjIyMjIyMjIyMjIik7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHMuZ2V0U2lnbmVkQ29udGVudEl0ZW0oaikpKTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1ZlcmlmeU1lcmxpbnNFeGFtcGxlc0ZpZnRlZW4uamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvVmVyaWZ5TWVybGluc0V4YW1wbGVzRmlmdGVlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MTIyZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1ZlcmlmeU1lcmxpbnNFeGFtcGxlc0ZpZnRlZW4uamF2YQpAQCAtMCwwICsxLDE3NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuc2lnbmF0dXJlOworCisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5EU05hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5TYW1wbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKgorICogQGF1dGhvciAkQXV0aG9yJAorICovCitwdWJsaWMgY2xhc3MgVmVyaWZ5TWVybGluc0V4YW1wbGVzRmlmdGVlbiB7CisKKyAgICBzdGF0aWMgb3JnLnNsZjRqLkxvZ2dlciBsb2cgPQorICAgICAgICBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVmVyaWZ5TWVybGluc0V4YW1wbGVzRmlmdGVlbi5jbGFzcyk7CisKKyAgICAvKiogRmllbGQgc2NoZW1hVmFsaWRhdGUgKi8KKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBzY2hlbWFWYWxpZGF0ZSA9IGZhbHNlOworCisgICAgLyoqIEZpZWxkIHNpZ25hdHVyZVNjaGVtYUZpbGUgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIHNpZ25hdHVyZVNjaGVtYUZpbGUgPSAic2FtcGxlcy9kYXRhL3htbGRzaWctY29yZS1zY2hlbWEueHNkIjsKKworICAgIHN0YXRpYyB7CisgICAgICAgIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LkluaXQuaW5pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBtYWluCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW51c2VkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB7CisKKyAgICAgICAgaWYgKHNjaGVtYVZhbGlkYXRlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldlIGRvIHNjaGVtYS12YWxpZGF0aW9uIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldlIGRvIG5vdCBzY2hlbWEtdmFsaWRhdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGlmIChWZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuLnNjaGVtYVZhbGlkYXRlKSB7CisgICAgICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvdmFsaWRhdGlvbi9zY2hlbWEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL2ZlYXR1cmVzL2RvbS9kZWZlci1ub2RlLWV4cGFuc2lvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICBkYmYuc2V0VmFsaWRhdGluZyh0cnVlKTsKKyAgICAgICAgICAgIGRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy92YWxpZGF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIGRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9wcm9wZXJ0aWVzL3NjaGVtYS9leHRlcm5hbC1zY2hlbWFMb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMgKyAiICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBWZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuLnNpZ25hdHVyZVNjaGVtYUZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIEJvb2xlYW4uVFJVRSk7CisKKyAgICAgICAgU3RyaW5nIG1lcmxpbnNEaXIgPQorICAgICAgICAgICAgInNhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLWZpZnRlZW4vIjsKKyAgICAgICAgU3RyaW5nIGZpbGVuYW1lc1tdID0geyBtZXJsaW5zRGlyICsgInNpZ25hdHVyZS1lbnZlbG9waW5nLWhtYWMtc2hhMS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmxpbnNEaXIgKyAic2lnbmF0dXJlLWVudmVsb3BlZC1kc2EueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJsaW5zRGlyICsgInNpZ25hdHVyZS1lbnZlbG9waW5nLWI2NC1kc2EueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJsaW5zRGlyICsgInNpZ25hdHVyZS1lbnZlbG9waW5nLWRzYS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmxpbnNEaXIgKyAic2lnbmF0dXJlLWVudmVsb3BpbmctcnNhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVybGluc0RpciArICJzaWduYXR1cmUtZXh0ZXJuYWwtYjY0LWRzYS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmxpbnNEaXIgKyAic2lnbmF0dXJlLWV4dGVybmFsLWRzYS54bWwiCisgICAgICAgIH07CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZlcmlmeUhNQUMoZGJmLCBmaWxlbmFtZXNbMF0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBmaWxlbmFtZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyBzaWduYXR1cmVGaWxlTmFtZSA9IGZpbGVuYW1lc1tpXTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBWZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuLnZlcmlmeShkYmYsIHNpZ25hdHVyZUZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHZlcmlmeQorICAgICAqCisgICAgICogQHBhcmFtIGRiZgorICAgICAqIEBwYXJhbSBmaWxlbmFtZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeUhNQUMoRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYsIFN0cmluZyBmaWxlbmFtZSkKKyAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5IHRvIHZlcmlmeSAiICsgZi50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworCisgICAgICAgIGlmIChWZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuLnNjaGVtYVZhbGlkYXRlKSB7CisgICAgICAgICAgICBkYi5zZXRFcnJvckhhbmRsZXIobmV3IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLklnbm9yZUFsbEVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgICAgIGRiLnNldEVudGl0eVJlc29sdmVyKG5ldyBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcigpIHsKKworICAgICAgICAgICAgICAgIHB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3lzdGVtSWQuZW5kc1dpdGgoInhtbGRzaWctY29yZS1zY2hlbWEueHNkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHNpZ25hdHVyZVNjaGVtYUZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IGRiLnBhcnNlKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmKSk7CisKKyAgICAgICAgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBYUGF0aCB4cGF0aCA9IHhwZi5uZXdYUGF0aCgpOworICAgICAgICB4cGF0aC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBEU05hbWVzcGFjZUNvbnRleHQoKSk7CisKKyAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSAiLy9kczpTaWduYXR1cmVbMV0iOworICAgICAgICBFbGVtZW50IHNpZ0VsZW1lbnQgPQorICAgICAgICAgICAgKEVsZW1lbnQpIHhwYXRoLmV2YWx1YXRlKGV4cHJlc3Npb24sIGRvYywgWFBhdGhDb25zdGFudHMuTk9ERSk7CisgICAgICAgIFhNTFNpZ25hdHVyZSBzaWduYXR1cmUgPQorICAgICAgICAgICAgbmV3IFhNTFNpZ25hdHVyZShzaWdFbGVtZW50LCBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpKTsKKworICAgICAgICAvLyBzaWduYXR1cmUuYWRkUmVzb3VyY2VSZXNvbHZlcihuZXcgT2ZmbGluZVJlc29sdmVyKCkpOworCisgICAgICAgIGJ5dGUga2V5Ynl0ZXNbXSA9ICJzZWNyZXQiLmdldEJ5dGVzKCJBU0NJSSIpOworICAgICAgICBqYXZheC5jcnlwdG8uU2VjcmV0S2V5IHNrID0gc2lnbmF0dXJlLmNyZWF0ZVNlY3JldEtleShrZXlieXRlcyk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgWE1MIHNpZ25hdHVyZSBpbiBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgZi50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKSArICIgaXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc2lnbmF0dXJlLmNoZWNrU2lnbmF0dXJlVmFsdWUoc2spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAidmFsaWQgKGdvb2QpIiA6ICJpbnZhbGlkICEhISEhIChiYWQpIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9WZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1ZlcmlmeU1lcmxpbnNFeGFtcGxlc1NpeHRlZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzRhNzVmCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9WZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLktleUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLkRTTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLlNhbXBsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqCisgKiBAYXV0aG9yICRBdXRob3IkCisgKi8KK3B1YmxpYyBjbGFzcyBWZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuIHsKKworICAgIHN0YXRpYyBvcmcuc2xmNGouTG9nZ2VyIGxvZyA9CisgICAgICAgIG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihWZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuLmNsYXNzKTsKKworICAgIC8qKiBGaWVsZCBzY2hlbWFWYWxpZGF0ZSAqLworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIHNjaGVtYVZhbGlkYXRlID0gZmFsc2U7CisKKyAgICAvKiogRmllbGQgc2lnbmF0dXJlU2NoZW1hRmlsZSAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlU2NoZW1hRmlsZSA9ICJzYW1wbGVzL2RhdGEveG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiOworCisgICAgc3RhdGljIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgdW51c2VkW10pIHsKKworICAgICAgICBpZiAoc2NoZW1hVmFsaWRhdGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2UgZG8gc2NoZW1hLXZhbGlkYXRpb24iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2UgZG8gbm90IHNjaGVtYS12YWxpZGF0aW9uIik7CisgICAgICAgIH0KKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgaWYgKFZlcmlmeU1lcmxpbnNFeGFtcGxlc1NpeHRlZW4uc2NoZW1hVmFsaWRhdGUpIHsKKyAgICAgICAgICAgIGRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvZG9tL2RlZmVyLW5vZGUtZXhwYW5zaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIGRiZi5zZXRWYWxpZGF0aW5nKHRydWUpOworICAgICAgICAgICAgZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLXNjaGVtYUxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlNpZ25hdHVyZVNwZWNOUyArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZlcmlmeU1lcmxpbnNFeGFtcGxlc1NpeHRlZW4uc2lnbmF0dXJlU2NoZW1hRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIGRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9uYW1lc3BhY2VzIiwgQm9vbGVhbi5UUlVFKTsKKworICAgICAgICBTdHJpbmcgZmlsZW5hbWVzW10gPSB7CisgICAgICAgICAgICAic2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctc2l4dGVlbi9zaWduYXR1cmUueG1sIgorICAgICAgICB9OworICAgICAgICBpbnQgc3RhcnQgPSAwOworICAgICAgICBpbnQgZW5kID0gZmlsZW5hbWVzLmxlbmd0aDsKKworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZUZpbGVOYW1lID0gZmlsZW5hbWVzW2ldOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZlcmlmeShkYmYsIHNpZ25hdHVyZUZpbGVOYW1lKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHZlcmlmeQorICAgICAqCisgICAgICogQHBhcmFtIGRiZgorICAgICAqIEBwYXJhbSBmaWxlbmFtZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeShEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiwgU3RyaW5nIGZpbGVuYW1lKQorICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmaWxlbmFtZSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcnkgdG8gdmVyaWZ5ICIgKyBmLnRvVVJMKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworCisgICAgICAgIGlmIChWZXJpZnlNZXJsaW5zRXhhbXBsZXNTaXh0ZWVuLnNjaGVtYVZhbGlkYXRlKSB7CisgICAgICAgICAgICBkYi5zZXRFcnJvckhhbmRsZXIobmV3IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLklnbm9yZUFsbEVycm9ySGFuZGxlcigpKTsKKyAgICAgICAgICAgIGRiLnNldEVudGl0eVJlc29sdmVyKG5ldyBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcigpIHsKKworICAgICAgICAgICAgICAgIHB1YmxpYyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkKQorICAgICAgICAgICAgICAgICAgICB0aHJvd3Mgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgICAgICBpZiAoc3lzdGVtSWQuZW5kc1dpdGgoInhtbGRzaWctY29yZS1zY2hlbWEueHNkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBvcmcueG1sLnNheC5JbnB1dFNvdXJjZShuZXcgRmlsZUlucHV0U3RyZWFtKHNpZ25hdHVyZVNjaGVtYUZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IGRiLnBhcnNlKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShmKSk7CisKKyAgICAgICAgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBYUGF0aCB4cGF0aCA9IHhwZi5uZXdYUGF0aCgpOworICAgICAgICB4cGF0aC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBEU05hbWVzcGFjZUNvbnRleHQoKSk7CisKKyAgICAgICAgU3RyaW5nIGV4cHJlc3Npb24gPSAiLy9kczpTaWduYXR1cmVbMV0iOworICAgICAgICBFbGVtZW50IHNpZ0VsZW1lbnQgPQorICAgICAgICAgICAgKEVsZW1lbnQpIHhwYXRoLmV2YWx1YXRlKGV4cHJlc3Npb24sIGRvYywgWFBhdGhDb25zdGFudHMuTk9ERSk7CisgICAgICAgIFhNTFNpZ25hdHVyZSBzaWduYXR1cmUgPQorICAgICAgICAgICAgbmV3IFhNTFNpZ25hdHVyZShzaWdFbGVtZW50LCBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpKTsKKworICAgICAgICBzaWduYXR1cmUuZ2V0U2lnbmVkSW5mbygpLmFkZFJlc291cmNlUmVzb2x2ZXIoCisgICAgICAgICAgICBuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy51dGlscy5yZXNvbHZlci5PZmZsaW5lUmVzb2x2ZXIoKQorICAgICAgICApOworCisgICAgICAgIHNpZ25hdHVyZS5zZXRGb2xsb3dOZXN0ZWRNYW5pZmVzdHMoZmFsc2UpOworCisgICAgICAgIEtleUluZm8ga2kgPSBzaWduYXR1cmUuZ2V0S2V5SW5mbygpOworCisgICAgICAgIGlmIChraSAhPSBudWxsKSB7CisgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9IHNpZ25hdHVyZS5nZXRLZXlJbmZvKCkuZ2V0WDUwOUNlcnRpZmljYXRlKCk7CisKKyAgICAgICAgICAgIGlmIChjZXJ0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBYTUwgc2lnbmF0dXJlIGluIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGYudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkgKyAiIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc2lnbmF0dXJlLmNoZWNrU2lnbmF0dXJlVmFsdWUoY2VydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gInZhbGlkIChnb29kKSIgOiAiaW52YWxpZCAhISEhISAoYmFkKSIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHVibGljS2V5IHBrID0gc2lnbmF0dXJlLmdldEtleUluZm8oKS5nZXRQdWJsaWNLZXkoKTsKKworICAgICAgICAgICAgICAgIGlmIChwayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIFhNTCBzaWduYXR1cmUgaW4gZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGYudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkgKyAiIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNpZ25hdHVyZS5jaGVja1NpZ25hdHVyZVZhbHVlKHBrKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gInZhbGlkIChnb29kKSIgOiAiaW52YWxpZCAhISEhISAoYmFkKSIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICJEaWQgbm90IGZpbmQgYSBwdWJsaWMga2V5LCBzbyBJIGNhbid0IGNoZWNrIHRoZSBzaWduYXR1cmUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRpZCBub3QgZmluZCBhIEtleUluZm8iKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9WZXJpZnlNZXJsaW5zRXhhbXBsZXNUd2VudHlUaHJlZS5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9WZXJpZnlNZXJsaW5zRXhhbXBsZXNUd2VudHlUaHJlZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMzljOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL1ZlcmlmeU1lcmxpbnNFeGFtcGxlc1R3ZW50eVRocmVlLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLktleUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLkRTTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLlNhbXBsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqCisgKiBAYXV0aG9yICRBdXRob3IkCisgKi8KK3B1YmxpYyBjbGFzcyBWZXJpZnlNZXJsaW5zRXhhbXBsZXNUd2VudHlUaHJlZSB7CisKKyAgICBzdGF0aWMgb3JnLnNsZjRqLkxvZ2dlciBsb2cgPQorICAgICAgICBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoVmVyaWZ5TWVybGluc0V4YW1wbGVzVHdlbnR5VGhyZWUuY2xhc3MpOworCisgICAgLyoqIEZpZWxkIHNjaGVtYVZhbGlkYXRlICovCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gc2NoZW1hVmFsaWRhdGUgPSBmYWxzZTsKKworICAgIC8qKiBGaWVsZCBzaWduYXR1cmVTY2hlbWFGaWxlICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBzaWduYXR1cmVTY2hlbWFGaWxlID0gInNhbXBsZXMvZGF0YS94bWxkc2lnLWNvcmUtc2NoZW1hLnhzZCI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyB1bnVzZWRbXSkgeworCisgICAgICAgIGlmIChzY2hlbWFWYWxpZGF0ZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXZSBkbyBzY2hlbWEtdmFsaWRhdGlvbiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXZSBkbyBub3Qgc2NoZW1hLXZhbGlkYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0KKyAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBpZiAoVmVyaWZ5TWVybGluc0V4YW1wbGVzVHdlbnR5VGhyZWUuc2NoZW1hVmFsaWRhdGUpIHsKKyAgICAgICAgICAgIGRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvZG9tL2RlZmVyLW5vZGUtZXhwYW5zaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIGRiZi5zZXRWYWxpZGF0aW5nKHRydWUpOworICAgICAgICAgICAgZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL2FwYWNoZS5vcmcveG1sL3Byb3BlcnRpZXMvc2NoZW1hL2V4dGVybmFsLXNjaGVtYUxvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLlNpZ25hdHVyZVNwZWNOUyArICIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIFZlcmlmeU1lcmxpbnNFeGFtcGxlc1R3ZW50eVRocmVlLnNpZ25hdHVyZVNjaGVtYUZpbGUpOworICAgICAgICB9CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIEJvb2xlYW4uVFJVRSk7CisKKyAgICAgICAgU3RyaW5nIG1lcmxpbnNEaXIgPQorICAgICAgICAgICAgInNhbXBsZXMvZGF0YS9pZS9iYWx0aW1vcmUvbWVybGluLWV4YW1wbGVzL21lcmxpbi14bWxkc2lnLXR3ZW50eS10aHJlZS8iOworICAgICAgICBTdHJpbmcgZmlsZW5hbWVzW10gPSB7IC8vICIyM3NpZ25hdHVyZS54bWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIm1lcmxpbnNUd2VudHlUaHJlZVJlY3JlYXRlZC54bWwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVybGluc0RpciArICJzaWduYXR1cmUueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJsaW5zRGlyICsgInNpZ25hdHVyZS1lbnZlbG9wZWQtZHNhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVybGluc0RpciArICJzaWduYXR1cmUtZW52ZWxvcGluZy1iNjQtZHNhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVybGluc0RpciArICJzaWduYXR1cmUtZW52ZWxvcGluZy1kc2EueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXJsaW5zRGlyICsgInNpZ25hdHVyZS1lbnZlbG9waW5nLWhtYWMtc2hhMS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmxpbnNEaXIgKyAic2lnbmF0dXJlLWVudmVsb3BpbmctcnNhLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVybGluc0RpciArICJzaWduYXR1cmUtZXh0ZXJuYWwtYjY0LWRzYS54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmxpbnNEaXIgKyAic2lnbmF0dXJlLWV4dGVybmFsLWRzYS54bWwiCisgICAgICAgIH07CisgICAgICAgIGludCBzdGFydCA9IDA7CisgICAgICAgIGludCBlbmQgPSBmaWxlbmFtZXMubGVuZ3RoOworCisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgc2lnbmF0dXJlRmlsZU5hbWUgPSBmaWxlbmFtZXNbaV07CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmVyaWZ5KGRiZiwgc2lnbmF0dXJlRmlsZU5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdmVyaWZ5CisgICAgICoKKyAgICAgKiBAcGFyYW0gZGJmCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5KERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmLCBTdHJpbmcgZmlsZW5hbWUpCisgICAgICAgIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRyeSB0byB2ZXJpZnkgIiArIGYudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKworICAgICAgICBpZiAoVmVyaWZ5TWVybGluc0V4YW1wbGVzVHdlbnR5VGhyZWUuc2NoZW1hVmFsaWRhdGUpIHsKKyAgICAgICAgICAgIGRiLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSWdub3JlQWxsRXJyb3JIYW5kbGVyKCkpOworICAgICAgICAgICAgZGIuc2V0RW50aXR5UmVzb2x2ZXIobmV3IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyKCkgeworCisgICAgICAgICAgICAgICAgcHVibGljIG9yZy54bWwuc2F4LklucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgICAgIGlmIChzeXN0ZW1JZC5lbmRzV2l0aCgieG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IG9yZy54bWwuc2F4LklucHV0U291cmNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oc2lnbmF0dXJlU2NoZW1hRmlsZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0gZGIucGFyc2UobmV3IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtKGYpKTsKKworICAgICAgICBYUGF0aEZhY3RvcnkgeHBmID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFhQYXRoIHhwYXRoID0geHBmLm5ld1hQYXRoKCk7CisgICAgICAgIHhwYXRoLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IERTTmFtZXNwYWNlQ29udGV4dCgpKTsKKworICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9ICIvL2RzOlNpZ25hdHVyZVsxXSI7CisgICAgICAgIEVsZW1lbnQgc2lnRWxlbWVudCA9CisgICAgICAgICAgICAoRWxlbWVudCkgeHBhdGguZXZhbHVhdGUoZXhwcmVzc2lvbiwgZG9jLCBYUGF0aENvbnN0YW50cy5OT0RFKTsKKyAgICAgICAgWE1MU2lnbmF0dXJlIHNpZ25hdHVyZSA9CisgICAgICAgICAgICBuZXcgWE1MU2lnbmF0dXJlKHNpZ0VsZW1lbnQsIGYudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHNpZ25hdHVyZS5nZXRTaWduZWRJbmZvKCkKKyAgICAgICAgICAgIC5hZGRSZXNvdXJjZVJlc29sdmVyKG5ldyBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnV0aWxzLnJlc29sdmVyLk9mZmxpbmVSZXNvbHZlcigpKTsKKworICAgICAgICBzaWduYXR1cmUuc2V0Rm9sbG93TmVzdGVkTWFuaWZlc3RzKGZhbHNlKTsKKworICAgICAgICBLZXlJbmZvIGtpID0gc2lnbmF0dXJlLmdldEtleUluZm8oKTsKKworICAgICAgICBpZiAoa2kgIT0gbnVsbCkgeworICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBzaWduYXR1cmUuZ2V0S2V5SW5mbygpLmdldFg1MDlDZXJ0aWZpY2F0ZSgpOworCisgICAgICAgICAgICBpZiAoY2VydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgWE1MIHNpZ25hdHVyZSBpbiBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpICsgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKHNpZ25hdHVyZS5jaGVja1NpZ25hdHVyZVZhbHVlKGNlcnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJ2YWxpZCAoZ29vZCkiIDogImludmFsaWQgISEhISEgKGJhZCkiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB1YmxpY0tleSBwayA9IHNpZ25hdHVyZS5nZXRLZXlJbmZvKCkuZ2V0UHVibGljS2V5KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocGsgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBYTUwgc2lnbmF0dXJlIGluIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpICsgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzaWduYXR1cmUuY2hlY2tTaWduYXR1cmVWYWx1ZShwaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJ2YWxpZCAoZ29vZCkiIDogImludmFsaWQgISEhISEgKGJhZCkiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCBmaW5kIGEgcHVibGljIGtleSwgc28gSSBjYW4ndCBjaGVjayB0aGUgc2lnbmF0dXJlIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEaWQgbm90IGZpbmQgYSBLZXlJbmZvIik7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3NpZ25hdHVyZS9WZXJpZnlTaWduYXR1cmUuamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvVmVyaWZ5U2lnbmF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmZjgxZAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvVmVyaWZ5U2lnbmF0dXJlLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOworCitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5LZXlJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudXRpbHMucmVzb2x2ZXIuT2ZmbGluZVJlc29sdmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5EU05hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy5TYW1wbGVVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yICRBdXRob3IkCisgKi8KK3B1YmxpYyBjbGFzcyBWZXJpZnlTaWduYXR1cmUgeworCisgICAgc3RhdGljIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnVzZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgdW51c2VkW10pIHsKKworICAgICAgICBib29sZWFuIHNjaGVtYVZhbGlkYXRlID0gZmFsc2U7CisgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmVTY2hlbWFGaWxlID0gInNhbXBsZXMvZGF0YS94bWxkc2lnLWNvcmUtc2NoZW1hLnhzZCI7CisgICAgICAgIFN0cmluZyBzaWduYXR1cmVGaWxlTmFtZSA9ICJidWlsZC9zaWduYXR1cmUueG1sIjsKKworICAgICAgICBpZiAoc2NoZW1hVmFsaWRhdGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2UgZG8gc2NoZW1hLXZhbGlkYXRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0KKyAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBpZiAoc2NoZW1hVmFsaWRhdGUpIHsKKyAgICAgICAgICAgIGRiZi5zZXRBdHRyaWJ1dGUoImh0dHA6Ly9hcGFjaGUub3JnL3htbC9mZWF0dXJlcy92YWxpZGF0aW9uL3NjaGVtYSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4uVFJVRSk7CisgICAgICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvZmVhdHVyZXMvZG9tL2RlZmVyLW5vZGUtZXhwYW5zaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgIGRiZi5zZXRWYWxpZGF0aW5nKHRydWUpOworICAgICAgICAgICAgZGJmLnNldEF0dHJpYnV0ZSgiaHR0cDovL3htbC5vcmcvc2F4L2ZlYXR1cmVzL3ZhbGlkYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuLlRSVUUpOworICAgICAgICB9CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIEJvb2xlYW4uVFJVRSk7CisKKyAgICAgICAgaWYgKHNjaGVtYVZhbGlkYXRlKSB7CisgICAgICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8vYXBhY2hlLm9yZy94bWwvcHJvcGVydGllcy9zY2hlbWEvZXh0ZXJuYWwtc2NoZW1hTG9jYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU2lnbmF0dXJlU3BlY05TICsgIiAiICsgc2lnbmF0dXJlU2NoZW1hRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShzaWduYXR1cmVGaWxlTmFtZSk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHJ5IHRvIHZlcmlmeSAiICsgZi50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKworICAgICAgICAgICAgZGIuc2V0RXJyb3JIYW5kbGVyKG5ldyBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5JZ25vcmVBbGxFcnJvckhhbmRsZXIoKSk7CisKKyAgICAgICAgICAgIGlmIChzY2hlbWFWYWxpZGF0ZSkgeworICAgICAgICAgICAgICAgIGRiLnNldEVudGl0eVJlc29sdmVyKG5ldyBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcigpIHsKKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCwgU3RyaW5nIHN5c3RlbUlkCisgICAgICAgICAgICAgICAgICAgICkgdGhyb3dzIG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzeXN0ZW1JZC5lbmRzV2l0aCgieG1sZHNpZy1jb3JlLXNjaGVtYS54c2QiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKHNpZ25hdHVyZVNjaGVtYUZpbGUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgamF2YS5pby5GaWxlSW5wdXRTdHJlYW0oZikpOworCisgICAgICAgICAgICBYUGF0aEZhY3RvcnkgeHBmID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBYUGF0aCB4cGF0aCA9IHhwZi5uZXdYUGF0aCgpOworICAgICAgICAgICAgeHBhdGguc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgRFNOYW1lc3BhY2VDb250ZXh0KCkpOworCisgICAgICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9ICIvL2RzOlNpZ25hdHVyZVsxXSI7CisgICAgICAgICAgICBFbGVtZW50IHNpZ0VsZW1lbnQgPQorICAgICAgICAgICAgICAgIChFbGVtZW50KSB4cGF0aC5ldmFsdWF0ZShleHByZXNzaW9uLCBkb2MsIFhQYXRoQ29uc3RhbnRzLk5PREUpOworICAgICAgICAgICAgWE1MU2lnbmF0dXJlIHNpZ25hdHVyZSA9CisgICAgICAgICAgICAgICAgbmV3IFhNTFNpZ25hdHVyZShzaWdFbGVtZW50LCBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgc2lnbmF0dXJlLmFkZFJlc291cmNlUmVzb2x2ZXIobmV3IE9mZmxpbmVSZXNvbHZlcigpKTsKKworICAgICAgICAgICAgS2V5SW5mbyBraSA9IHNpZ25hdHVyZS5nZXRLZXlJbmZvKCk7CisKKyAgICAgICAgICAgIGlmIChraSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGtpLmNvbnRhaW5zWDUwOURhdGEoKSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNvdWxkIGZpbmQgYSBYNTA5RGF0YSBlbGVtZW50IGluIHRoZSBLZXlJbmZvIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPSBzaWduYXR1cmUuZ2V0S2V5SW5mbygpLmdldFg1MDlDZXJ0aWZpY2F0ZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGNlcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBYTUwgc2lnbmF0dXJlIGluIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpICsgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzaWduYXR1cmUuY2hlY2tTaWduYXR1cmVWYWx1ZShjZXJ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gInZhbGlkIChnb29kKSIgIDogImludmFsaWQgISEhISEgKGJhZCkiKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEaWQgbm90IGZpbmQgYSBDZXJ0aWZpY2F0ZSIpOworCisgICAgICAgICAgICAgICAgICAgIFB1YmxpY0tleSBwayA9IHNpZ25hdHVyZS5nZXRLZXlJbmZvKCkuZ2V0UHVibGljS2V5KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIFhNTCBzaWduYXR1cmUgaW4gZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBmLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpICsgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc2lnbmF0dXJlLmNoZWNrU2lnbmF0dXJlVmFsdWUocGspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gInZhbGlkIChnb29kKSIgOiAiaW52YWxpZCAhISEhISAoYmFkKSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRGlkIG5vdCBmaW5kIGEgcHVibGljIGtleSwgc28gSSBjYW4ndCBjaGVjayB0aGUgc2lnbmF0dXJlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGlkIG5vdCBmaW5kIGEgS2V5SW5mbyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL2NvbnRyYWN0L1RocmVlU2lnbmVyQ29udHJhY3RTaWduLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL2NvbnRyYWN0L1RocmVlU2lnbmVyQ29udHJhY3RTaWduLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhMzg0YQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvY29udHJhY3QvVGhyZWVTaWduZXJDb250cmFjdFNpZ24uamF2YQpAQCAtMCwwICsxLDMxMSBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuc2lnbmF0dXJlLmNvbnRyYWN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuY29udGVudC5LZXlOYW1lOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5TaWduZWRJbmZvOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMucGFyYW1zLlhQYXRoQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisKKy8qKgorICogSW4gdGhlIHBhc3QgdGhlIHByb3Rva29sIHRvIHNpZ24gZGF0YSAobGlrZSBhIGNvbnRyYWN0KSBmcm9tIG1vcmUgdGhhbiBvbmUgcGVvcGxlCisgKiBsb29rcyBsaWtlIHRoaXM6CisgKiAxLiBBIHNpZ25zIHRoZSBoYXNoIG9mIHRoZSBkYXRhID0+IFNpZ25hdHVyZUEKKyAqIDIuIEIgc2lnbnMgU2lnbmF0dXJlQSA9PiBTaWduYXR1cmVCCisgKiAzLiBDIHNpZ25zIFNpZ25hdHVyZUIgPT4gU2lnbmF0dXJlQworICoKKyAqIFRvIHZlcmlmeSBlLmcuIHNpZ25hdHVyZSBDIHRoZSBmb2xsb3dpbmcgc3RlcHMgd2VyZSBuZWNlc3Nhcnk6CisgKiAxLiBWZXJpZnkgc2lnbmF0dXJlIEMgdGhlcmVieSBkZWNyeXB0IFNpZ25hdHVyZUMgKFNpZ25hdHVyZUIpCisgKiAyLiBWZXJpZnkgc2lnbmF0dXJlIEIgdGhlcmVieSBkZWNyeXB0IFNpZ25hdHVyZUIgKFNpZ25hdHVyZUEpCisgKiAzLiBWZXJpZnkgc2lnbmF0dXJlIEEgdGhlcmVieSBkZWNyeXB0IFNpZ25hdHVyZUEgKGhhc2ggb2YgdGhlIGRhdGEpCisgKiA0LiBDb21wYXJlIHRoZSBjYWxjdWxhdGVkIGhhc2ggb2YgdGhlIHNlbnQgY29udHJhY3Qgd2l0aCB0aGUgZGVjcnlwdGVkIFNpZ25hdHVyZUEgcmVzdWx0CisgKgorICogWE1MLVNpZ25hdHVyZXMgYXJlIG1vcmUgZmxleGlibGUgaW4gdGhpcyB3YXkuCisgKiBJdCBpcyBwb3NzaWJsZSB0byBzaWduIGRhdGEgaW4gc3RlcHMgZnJvbSBkaWZmZXJlbnQgc2lnbmVycyBhbmQKKyAqIHZlcmlmeSBhIHNpZ25hdHVyZSBpbmRlcGVuZGVudCBmcm9tIHRoZSBvdGhlcnMgc2lnbmF0dXJlcy4KKyAqIEZ1cnRoZXJtb3JlIGFsbCB0aGUgc2lnbmVkIGRhdGEgYW5kIHRoZSBzaWduYXR1cmVzIGNhbiBiZSBob2xkIGluIG9uZSBmaWxlLgorICoKKyAqIEBhdXRob3IgUmVuZSBLb2xsbW9yZ2VuIDxSZW5lLktvbGxtb3JnZW5Ac29mdHdhcmVhZy5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBUaHJlZVNpZ25lckNvbnRyYWN0U2lnbiB7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICAvLyBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHMuc2V0U2lnbmF0dXJlU3BlY05TcHJlZml4KCIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBzaWduYXR1cmVGaWxlID0gbmV3IEZpbGUoImJ1aWxkL3RocmVlU2lnbmVyQ29udHJhY3QueG1sIik7CisgICAgICAgIFN0cmluZyBCYXNlVVJJID0gc2lnbmF0dXJlRmlsZS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IGRiLm5ld0RvY3VtZW50KCk7CisgICAgICAgIEVsZW1lbnQgY29udHJhY3QgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG51bGwsICJjb250cmFjdCIpOworCisgICAgICAgIC8vIGNyZWF0ZSBjb250cmFjdCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQoY29udHJhY3QpOworCisgICAgICAgIC8vIGJlYXV0aWZ5aW5nIC8vLy8vLworICAgICAgICBFbGVtZW50IGNvbmRpdGlvbjEgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG51bGwsICJjb25kaXRpb24xIik7CisKKyAgICAgICAgY29uZGl0aW9uMS5zZXRBdHRyaWJ1dGVOUyhudWxsLCAiSWQiLCAiY29uZDEiKTsKKyAgICAgICAgY29uZGl0aW9uMS5hcHBlbmRDaGlsZCgKKyAgICAgICAgICAgIGRvYy5jcmVhdGVUZXh0Tm9kZSgKKyAgICAgICAgICAgICAgICAiY29uZGl0aW9uMSBub3QgY292ZXJlZCBpbiBmaXJzdCBzaWduYXR1cmUsIG9ubHkgIgorICAgICAgICAgICAgICAgICsgImJpbmRpbmcgZm9yIHRoZSBzZWNvbmQgYW5kIHRoaXJkIHNpZ25lciIpKTsKKworICAgICAgICBFbGVtZW50IGNvbmRpdGlvbjIgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG51bGwsICJjb25kaXRpb24yIik7CisKKyAgICAgICAgY29uZGl0aW9uMi5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoImNvbmRpdGlvbjIiKSk7CisKKyAgICAgICAgRWxlbWVudCBjb25kaXRpb24zID0gZG9jLmNyZWF0ZUVsZW1lbnROUyhudWxsLCAiY29uZGl0aW9uMyIpOworCisgICAgICAgIGNvbmRpdGlvbjMuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJjb25kaXRpb24zIikpOworICAgICAgICBjb250cmFjdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOworICAgICAgICBjb250cmFjdC5hcHBlbmRDaGlsZChjb25kaXRpb24xKTsKKyAgICAgICAgY29udHJhY3QuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKKyAgICAgICAgY29udHJhY3QuYXBwZW5kQ2hpbGQoY29uZGl0aW9uMik7CisgICAgICAgIGNvbnRyYWN0LmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisgICAgICAgIGNvbnRyYWN0LmFwcGVuZENoaWxkKGNvbmRpdGlvbjMpOworICAgICAgICBjb250cmFjdC5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOworCisgICAgICAgIFN0cmluZyBpZDEgPSAiZmlyc3RTaWduZXIiOworICAgICAgICBTdHJpbmcgaWQyID0gInNlY29uZFNpZ25lciI7CisgICAgICAgIFN0cmluZyBpZDMgPSAidGhpcmRTaWduZXIiOworCisgICAgICAgIC8vIHNpZ24gdGhlIHdob2xlIGNvbnRyYWN0IGFuZCBubyBzaWduYXR1cmUgYW5kIGV4Y2x1ZGUgY29uZGl0aW9uMQorICAgICAgICBTdHJpbmcgeHAxT2xkID0gIm5vdChhbmNlc3Rvci1vci1zZWxmOjpkczpTaWduYXR1cmUpIgorICAgICAgICAgICAgKyAiIGFuZCBub3QoYW5jZXN0b3Itb3Itc2VsZjo6bm9kZSgpW0BJZD0nY29uZDEnXSkiOworCisgICAgICAgIC8vIHNpZ24gdGhlIGNvbnRyYWN0IHdpdGggY29uZGl0aW9uMiBhbmQgY29kaXRpb24zIGFuZCBubyBzaWduYXR1cmUKKyAgICAgICAgU3RyaW5nIHhwMSA9ICJub3QoYW5jZXN0b3Itb3Itc2VsZjo6ZHM6U2lnbmF0dXJlKSIgKyAiXG4iCisgICAgICAgICsgIiBhbmQgKCIgKyAiXG4iCisgICAgICAgICsgIiAgICAoYW5jZXN0b3Itb3Itc2VsZjo6bm9kZSgpID0gL2NvbnRyYWN0L2NvbmRpdGlvbjIpICIgKyAiXG4iCisgICAgICAgICsgIiBvciAoYW5jZXN0b3Itb3Itc2VsZjo6bm9kZSgpID0gL2NvbnRyYWN0L2NvbmRpdGlvbjMpICIgKyAiXG4iCisgICAgICAgICsgIiBvciAoc2VsZjo6bm9kZSgpID0gL2NvbnRyYWN0KSAiICsgIlxuIgorICAgICAgICArICIgb3IgKChwYXJlbnQ6Om5vZGUoKSA9IC9jb250cmFjdCkgYW5kIChzZWxmOjp0ZXh0KCkpKSIgKyAiXG4iCisgICAgICAgICsgIikiOworCisgICAgICAgIC8vIHNpZ24gdGhlIHdob2xlIGNvbnRyYWN0IGFuZCBubyBzaWduYXR1cmUgYnV0IHRoZSBmaXJzdAorICAgICAgICBTdHJpbmcgeHAyID0gIm5vdChhbmNlc3Rvci1vci1zZWxmOjpkczpTaWduYXR1cmUpIiArICJcbiIKKyAgICAgICAgKyAiIG9yIGFuY2VzdG9yLW9yLXNlbGY6OmRzOlNpZ25hdHVyZVtASWQ9JyIgKyBpZDEgKyAiJ10iOworCisgICAgICAgIC8vIHNpZ24gdGhlIHdob2xlIGNvbnRyYWN0IGFuZCBubyBzaWduYXR1cmUgYnV0IHRoZSBmaXJzdCBhbmQgdGhlIHNlY29uZAorICAgICAgICBTdHJpbmcgeHAzID0gIm5vdChhbmNlc3Rvci1vci1zZWxmOjpkczpTaWduYXR1cmUpIiArICJcbiIKKyAgICAgICAgKyAiIG9yIGFuY2VzdG9yLW9yLXNlbGY6OmRzOlNpZ25hdHVyZVtASWQ9JyIgKyBpZDEgKyAiJ10iICsgIlxuIgorICAgICAgICArICIgb3IgYW5jZXN0b3Itb3Itc2VsZjo6ZHM6U2lnbmF0dXJlW0BJZD0nIiArIGlkMiArICInXSI7CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBmaXJzdCBzaWduZXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIHsKKyAgICAgICAgICAgIFhNTFNpZ25hdHVyZSBmaXJzdFNpZ25lciA9CisgICAgICAgICAgICAgICAgbmV3IFhNTFNpZ25hdHVyZShkb2MsIEJhc2VVUkksIFhNTFNpZ25hdHVyZS5BTEdPX0lEX01BQ19ITUFDX1NIQTEpOworCisgICAgICAgICAgICBmaXJzdFNpZ25lci5zZXRJZChpZDEpOworICAgICAgICAgICAgY29udHJhY3QuYXBwZW5kQ2hpbGQoZmlyc3RTaWduZXIuZ2V0RWxlbWVudCgpKTsKKworICAgICAgICAgICAgU3RyaW5nIHJvb3RuYW1lc3BhY2UgPSBjb250cmFjdC5nZXROYW1lc3BhY2VVUkkoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcm9vdHByZWZpeGVkID0gKHJvb3RuYW1lc3BhY2UgIT0gbnVsbCkgJiYgKHJvb3RuYW1lc3BhY2UubGVuZ3RoKCkgPiAwKTsKKyAgICAgICAgICAgIFN0cmluZyByb290bG9jYWxuYW1lID0gY29udHJhY3QuZ2V0Tm9kZU5hbWUoKTsKKyAgICAgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKGRvYyk7CisgICAgICAgICAgICBYUGF0aENvbnRhaW5lciB4cGF0aCA9IG5ldyBYUGF0aENvbnRhaW5lcihkb2MpOworCisgICAgICAgICAgICB4cGF0aC5zZXRYUGF0aE5hbWVzcGFjZUNvbnRleHQoImRzIiwgQ29uc3RhbnRzLlNpZ25hdHVyZVNwZWNOUyk7CisgICAgICAgICAgICB4cGF0aC5zZXRYUGF0aCgiXG4iICsgeHAxICsgIlxuIik7CisgICAgICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9YUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwYXRoLmdldEVsZW1lbnRQbHVzUmV0dXJucygpKTsKKyAgICAgICAgICAgIGZpcnN0U2lnbmVyLmFkZERvY3VtZW50KCIiLCB0cmFuc2Zvcm1zLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBub3QgcmVhbGx5IHNlY3VyZSAvLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgZmlyc3RTaWduZXIuZ2V0S2V5SW5mbygpLmFkZChuZXcgS2V5TmFtZShkb2MsICJGaXJzdCBzaWduZXIga2V5IikpOworCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJGaXJzdCBzaWduZXI6IFN0YXJ0IHNpZ25pbmciKTsKKyAgICAgICAgICAgICAgICBmaXJzdFNpZ25lci5zaWduKAorICAgICAgICAgICAgICAgICAgICBmaXJzdFNpZ25lci5jcmVhdGVTZWNyZXRLZXkoIkZpcnN0IHNpZ25lciBrZXkiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpcnN0IHNpZ25lcjogRmluaXNoZWQgc2lnbmluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTaWduZWRJbmZvIHMgPSBmaXJzdFNpZ25lci5nZXRTaWduZWRJbmZvKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5nZXRTaWduZWRDb250ZW50TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBTaWduZWQgUmVzb3VyY2UgIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICMjIyMjIyMjIyMjIyMjIyMiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhzLmdldFNpZ25lZENvbnRlbnRJdGVtKGkpKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gc2Vjb25kIHNpZ25lciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICB7CisgICAgICAgICAgICBYTUxTaWduYXR1cmUgc2Vjb25kU2lnbmVyID0KKyAgICAgICAgICAgICAgICBuZXcgWE1MU2lnbmF0dXJlKGRvYywgQmFzZVVSSSwgWE1MU2lnbmF0dXJlLkFMR09fSURfTUFDX0hNQUNfU0hBMSk7CisKKyAgICAgICAgICAgIHNlY29uZFNpZ25lci5zZXRJZChpZDIpOworICAgICAgICAgICAgY29udHJhY3QuYXBwZW5kQ2hpbGQoc2Vjb25kU2lnbmVyLmdldEVsZW1lbnQoKSk7CisKKyAgICAgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtczIgPSBuZXcgVHJhbnNmb3Jtcyhkb2MpOworICAgICAgICAgICAgWFBhdGhDb250YWluZXIgeHBhdGgyID0gbmV3IFhQYXRoQ29udGFpbmVyKGRvYyk7CisKKyAgICAgICAgICAgIHhwYXRoMi5zZXRYUGF0aE5hbWVzcGFjZUNvbnRleHQoImRzIiwgQ29uc3RhbnRzLlNpZ25hdHVyZVNwZWNOUyk7CisgICAgICAgICAgICB4cGF0aDIuc2V0WFBhdGgoIlxuIiArIHhwMiArICJcbiIpOworICAgICAgICAgICAgdHJhbnNmb3JtczIuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX1hQQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwYXRoMi5nZXRFbGVtZW50UGx1c1JldHVybnMoKSk7CisgICAgICAgICAgICBzZWNvbmRTaWduZXIuYWRkRG9jdW1lbnQoIiIsIHRyYW5zZm9ybXMyLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzZWNvbmRTaWduZXIuZ2V0S2V5SW5mbygpLmFkZChuZXcgS2V5TmFtZShkb2MsCisgICAgICAgICAgICAgICAgIlNlY29uZCBzaWduZXIga2V5IikpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2Vjb25kIHNpZ25lcjogU3RhcnQgc2lnbmluZyIpOworICAgICAgICAgICAgICAgIHNlY29uZFNpZ25lci5zaWduKAorICAgICAgICAgICAgICAgICAgICBzZWNvbmRTaWduZXIuY3JlYXRlU2VjcmV0S2V5KCJTZWNvbmQgc2lnbmVyIGtleSIuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2Vjb25kIHNpZ25lcjogRmluaXNoZWQgc2lnbmluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTaWduZWRJbmZvIHMyID0gc2Vjb25kU2lnbmVyLmdldFNpZ25lZEluZm8oKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzMi5nZXRTaWduZWRDb250ZW50TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjIyMjIyMjIyMjIyMjIyBTaWduZWQgUmVzb3VyY2UgIiArIGkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICMjIyMjIyMjIyMjIyMjIyMiKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhzMi5nZXRTaWduZWRDb250ZW50SXRlbShpKSkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIHRoaXJkIHNpZ25lciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgeworICAgICAgICAgICAgWE1MU2lnbmF0dXJlIHRoaXJkU2lnbmVyID0KKyAgICAgICAgICAgICAgICBuZXcgWE1MU2lnbmF0dXJlKGRvYywgQmFzZVVSSSwgWE1MU2lnbmF0dXJlLkFMR09fSURfTUFDX0hNQUNfU0hBMSk7CisKKyAgICAgICAgICAgIHRoaXJkU2lnbmVyLnNldElkKGlkMyk7CisgICAgICAgICAgICBjb250cmFjdC5hcHBlbmRDaGlsZCh0aGlyZFNpZ25lci5nZXRFbGVtZW50KCkpOworCisgICAgICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMzID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKyAgICAgICAgICAgIFhQYXRoQ29udGFpbmVyIHhwYXRoMyA9IG5ldyBYUGF0aENvbnRhaW5lcihkb2MpOworCisgICAgICAgICAgICB4cGF0aDMuc2V0WFBhdGhOYW1lc3BhY2VDb250ZXh0KCJkcyIsIENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMpOworICAgICAgICAgICAgeHBhdGgzLnNldFhQYXRoKCJcbiIgKyB4cDMgKyAiXG4iKTsKKyAgICAgICAgICAgIHRyYW5zZm9ybXMzLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9YUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGF0aDMuZ2V0RWxlbWVudFBsdXNSZXR1cm5zKCkpOworICAgICAgICAgICAgdGhpcmRTaWduZXIuYWRkRG9jdW1lbnQoIiIsIHRyYW5zZm9ybXMzLCBDb25zdGFudHMuQUxHT19JRF9ESUdFU1RfU0hBMSk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0aGlyZFNpZ25lci5nZXRLZXlJbmZvKCkuYWRkKG5ldyBLZXlOYW1lKGRvYywgIlRoaXJkIHNpZ25lciBrZXkiKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGlyZCBzaWduZXI6IFN0YXJ0IHNpZ25pbmciKTsKKyAgICAgICAgICAgICAgICB0aGlyZFNpZ25lci5zaWduKAorICAgICAgICAgICAgICAgICAgICB0aGlyZFNpZ25lci5jcmVhdGVTZWNyZXRLZXkoIlRoaXJkIHNpZ25lciBrZXkiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoaXJkIHNpZ25lcjogRmluaXNoZWQgc2lnbmluZyIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTaWduZWRJbmZvIHMzID0gdGhpcmRTaWduZXIuZ2V0U2lnbmVkSW5mbygpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMzLmdldFNpZ25lZENvbnRlbnRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMjIyMjIyMjIyMjIyMjIFNpZ25lZCBSZXNvdXJjZSAiICsgaQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgIyMjIyMjIyMjIyMjIyMjIyIpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHMzLmdldFNpZ25lZENvbnRlbnRJdGVtKGkpKSk7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gZm9ydGggc2lnbmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICB7CisgICAgICAgICAgICBYTUxTaWduYXR1cmUgZm9ydGhTaWduZXIgPQorICAgICAgICAgICAgICAgIG5ldyBYTUxTaWduYXR1cmUoZG9jLCBCYXNlVVJJLCBYTUxTaWduYXR1cmUuQUxHT19JRF9NQUNfSE1BQ19TSEExKTsKKworICAgICAgICAgICAgZm9ydGhTaWduZXIuc2V0SWQoInNpZzQiKTsKKyAgICAgICAgICAgIGNvbnRyYWN0LmFwcGVuZENoaWxkKGZvcnRoU2lnbmVyLmdldEVsZW1lbnQoKSk7CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBmaXJzdCBvZiBhbGwsIGFkZCB0aGUgYmFzaWMgZG9jdW1lbnQgd2l0aG91dCBzaWduYXR1cmVzCisgICAgICAgICAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zNCA9IG5ldyBUcmFuc2Zvcm1zKGRvYyk7CisgICAgICAgICAgICAgICAgWFBhdGhDb250YWluZXIgeHBhdGg0ID0gbmV3IFhQYXRoQ29udGFpbmVyKGRvYyk7CisKKyAgICAgICAgICAgICAgICB4cGF0aDQuc2V0WFBhdGhOYW1lc3BhY2VDb250ZXh0KCJkcyIsIENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMpOworICAgICAgICAgICAgICAgIHhwYXRoNC5zZXRYUGF0aCgiXG4iICsgIm5vdChhbmNlc3Rvci1vci1zZWxmOjpkczpTaWduYXR1cmUpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcbiIpOworICAgICAgICAgICAgICAgIHRyYW5zZm9ybXM0LmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9YUEFUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBhdGg0LmdldEVsZW1lbnRQbHVzUmV0dXJucygpKTsKKyAgICAgICAgICAgICAgICBmb3J0aFNpZ25lci5hZGREb2N1bWVudCgiIiwgdHJhbnNmb3JtczQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRzLkFMR09fSURfRElHRVNUX1NIQTEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gdGhlbiBhZGQgdGhlIGRpZmZlcmVudCBzaWduYXR1cmVzCisgICAgICAgICAgICAgICAgZm9ydGhTaWduZXIuYWRkRG9jdW1lbnQoIiN4cG9pbnRlcihpZCgnZmlyc3RTaWduZXInKSkiLCBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50cy5BTEdPX0lEX0RJR0VTVF9TSEExLCBudWxsLAorICAgICAgICAgICAgICAgICJkczpTaWduYXR1cmUiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGZvcnRoU2lnbmVyLmdldEtleUluZm8oKS5hZGQobmV3IEtleU5hbWUoZG9jLCAiRm9ydGggc2lnbmVyIGtleSIpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZvcnRoIHNpZ25lcjogU3RhcnQgc2lnbmluZyIpOworICAgICAgICAgICAgICAgIGZvcnRoU2lnbmVyLnNpZ24oCisgICAgICAgICAgICAgICAgICAgIGZvcnRoU2lnbmVyLmNyZWF0ZVNlY3JldEtleSgiRm9ydGggc2lnbmVyIGtleSIuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9ydGggc2lnbmVyOiBGaW5pc2hlZCBzaWduaW5nIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNpZ25lZEluZm8gczQgPSBmb3J0aFNpZ25lci5nZXRTaWduZWRJbmZvKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgczQuZ2V0U2lnbmVkQ29udGVudExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyMjIyMjIyMjIyMjIyMgU2lnbmVkIFJlc291cmNlICIgKyBpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAjIyMjIyMjIyMjIyMjIyMjIik7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoczQuZ2V0U2lnbmVkQ29udGVudEl0ZW0oaSkpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyB3cml0ZSBhd2F5IGZpbGVzCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICB7CisgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGYgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShzaWduYXR1cmVGaWxlKTsKKworICAgICAgICAgICAgWE1MVXRpbHMub3V0cHV0RE9NYzE0bldpdGhDb21tZW50cyhkb2MsIGYpOworICAgICAgICAgICAgZi5jbG9zZSgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXcm90ZSBzaWduYXR1cmUgdG8gIiArIEJhc2VVUkkpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL2NvbnRyYWN0L1RocmVlU2lnbmVyQ29udHJhY3RWZXJpZnkuamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9zaWduYXR1cmUvY29udHJhY3QvVGhyZWVTaWduZXJDb250cmFjdFZlcmlmeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkNjU0NTYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvc2lnbmF0dXJlL2NvbnRyYWN0L1RocmVlU2lnbmVyQ29udHJhY3RWZXJpZnkuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuc2lnbmF0dXJlLmNvbnRyYWN0OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLkRTTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLlNhbXBsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqCisgKiBAYXV0aG9yIFJlbmUgS29sbG1vcmdlbiA8UmVuZS5Lb2xsbW9yZ2VuQHNvZnR3YXJlYWcuY29tPgorICovCitwdWJsaWMgY2xhc3MgVGhyZWVTaWduZXJDb250cmFjdFZlcmlmeSB7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIHVudXNlZFtdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBkYmYuc2V0QXR0cmlidXRlKCJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvbmFtZXNwYWNlcyIsIEJvb2xlYW4uVFJVRSk7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgLy9GaWxlIHNpZ25hdHVyZUZpbGUgPSBuZXcgRmlsZSgiY29sbGVjdGFibGVTaWduYXR1cmUueG1sIik7CisgICAgICAgICAgICBGaWxlIHNpZ25hdHVyZUZpbGUgPSBuZXcgRmlsZSgiYnVpbGQvdGhyZWVTaWduZXJDb250cmFjdC54bWwiKTsKKyAgICAgICAgICAgIFN0cmluZyBCYXNlVVJJID0gc2lnbmF0dXJlRmlsZS50b1VSSSgpLnRvVVJMKCkudG9TdHJpbmcoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcnkgdG8gdmVyaWZ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNpZ25hdHVyZUZpbGUudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIGRiLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSWdub3JlQWxsRXJyb3JIYW5kbGVyKCkpOworCisgICAgICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2MgPQorICAgICAgICAgICAgICAgIGRiLnBhcnNlKG5ldyBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbShzaWduYXR1cmVGaWxlKSk7CisKKyAgICAgICAgICAgIFhQYXRoRmFjdG9yeSB4cGYgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIFhQYXRoIHhwYXRoID0geHBmLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cGF0aC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBEU05hbWVzcGFjZUNvbnRleHQoKSk7CisKKyAgICAgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gIi8vZHM6U2lnbmF0dXJlWzFdIjsKKyAgICAgICAgICAgIE5vZGVMaXN0IHNpZ25hdHVyZUVsZW1zID0KKyAgICAgICAgICAgICAgICAoTm9kZUxpc3QpIHhwYXRoLmV2YWx1YXRlKGV4cHJlc3Npb24sIGRvYywgWFBhdGhDb25zdGFudHMuTk9ERVNFVCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmF0dXJlRWxlbXMuZ2V0TGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIEVsZW1lbnQgc2lnRWxlbWVudCA9IChFbGVtZW50KSBzaWduYXR1cmVFbGVtcy5pdGVtKGkpOworICAgICAgICAgICAgICAgIFhNTFNpZ25hdHVyZSBzaWduYXR1cmUgPSBuZXcgWE1MU2lnbmF0dXJlKHNpZ0VsZW1lbnQsIEJhc2VVUkkpOworCisgICAgICAgICAgICAgICAgLy9ieXRlW10gc2VjcmV0S2V5ID0gInNlY3JldFZhbHVlIi5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgIEVsZW1lbnQga2V5TmFtZSA9CisgICAgICAgICAgICAgICAgICAgIChFbGVtZW50KSBzaWdFbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudHMuU2lnbmF0dXJlU3BlY05TLCAiS2V5TmFtZSIpLml0ZW0oMCk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGtleVZhbHVlID0ga2V5TmFtZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBzaWduYXR1cmUgbnVtYmVyICIgKyAoaSArIDEpICsgIiBpcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc2lnbmF0dXJlLmNoZWNrU2lnbmF0dXJlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlLmNyZWF0ZVNlY3JldEtleSgKKyAgICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZS5nZXRCeXRlcygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICA/ICJ2YWxpZCAoZ29vZCkiIDogImludmFsaWQgISEhISEgKGJhZCkiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybUNoYWluaW5nLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdHJhbnNmb3Jtcy9TYW1wbGVUcmFuc2Zvcm1DaGFpbmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1Njk5ODYKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdHJhbnNmb3Jtcy9TYW1wbGVUcmFuc2Zvcm1DaGFpbmluZy5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy50cmFuc2Zvcm1zOworCitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuRFNOYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuU2FtcGxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYSBUcmFuc2Zvcm0gZm9yIFhTTFQuIFRoZQorICogPENPREU+eHNsOnN0eWxlc2hlZXQ8L0NPREU+IGlzIGRpcmVjdGx5IGVtYmVkZGVkIGluIHRoZSA8Q09ERT5kczpUcmFuc2Zvcm08L0NPREU+LAorICogc28gdGhlIHtAbGluayBUcmFuc2Zvcm19IG9iamVjdCBpcyBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBFbGVtZW50LgorICoKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEdldWVyLVBvbGxtYW5uCisgKiBAdmVyc2lvbiAlSSUsICVHJQorICovCitwdWJsaWMgY2xhc3MgU2FtcGxlVHJhbnNmb3JtQ2hhaW5pbmcgeworCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGlucHV0U3RyID0KKyAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PiIgKyAiXG4iCisgICAgICAgICAgICArICI8Q2xhc3M+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgIDxCQVNFNjQ+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICBQR052Ym5SaGFXNWxjajRLSUNBZ1BHVStTR1ZzYkc4c0lEd2hMUzBnWTI5dGJXVnVkQ0F0TFQ0Z2QyOXliR1FoUEM5bFBnb2dJQ0E4IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICBUM0prWlhJZ1RtRnRaVDBuVkVsT1FVMUpSazlTVFVWVEp5QjRiV3h1Y3owbmFIUjBjRG92TDNObVpHWm5MeWMrQ2lBZ0lDQWdJRHhHIiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICBZVzFwYkhrZ1RtRnRaVDBuVkVsT1FVMUpSRUZGSno0S0lDQWdJQ0FnSUNBZ1BGTndaV05wWlhNZ1UyTnBaVzUwYVdacFkxOU9ZVzFsIiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICBQU2REY25sd2RIVnlaV3hzZFhNZ1ltOTFZMkZ5WkdrblBsTnNZWFI1TFdKeVpXRnpkR1ZrSUZScGJtRnRiM1V1UEM5VGNHVmphV1Z6IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICBQZ29nSUNBZ0lDQThMMFpoYldsc2VUNEtJQ0FnUEM5UGNtUmxjajRLSUNBZ1BFOXlaR1Z5SUU1aGJXVTlKMUJQUkVsRFNWQkZSRWxHIiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICBUMUpOUlZNbkx6NEtQQzlqYjI1MFlXbHVaWEkrQ2c9PSIgKyAiXG4iCisgICAgICAgICAgICArICIgICA8L0JBU0U2ND4iICsgIlxuIgorICAgICAgICAgICAgKyAiPFNpZ25hdHVyZSBJZD0nU2lnbmF0dXJlVG9CZU9taXR0ZWQnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICA8U2lnbmVkSW5mbz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgIDxSZWZlcmVuY2UgVVJJPScnPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICA8VHJhbnNmb3Jtcz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0naHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHBhdGgtMTk5OTExMTYnPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgIDwhLS0gRXhjbHVkZSBhbGwgc2lnbmF0dXJlcyAtLT5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgIDxkczpYUGF0aCB4bWxuczpkcz0naHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyc+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgICAgIGFuY2VzdG9yOjpCQVNFNjQiCisgICAgICAgICAgICArICIgICAgICAgICAgICAgICA8L2RzOlhQYXRoPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICA8L1RyYW5zZm9ybT5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNiYXNlNjQnIC8+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSdodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNic+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICAgICA8ZHM6WFBhdGggeG1sbnM6ZHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMnPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgICBub3Qoc2VsZjo6Y29udGFpbmVyKSAgICAgIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgPC9kczpYUGF0aD5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgPC9UcmFuc2Zvcm0+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNScgLz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgIDwvVHJhbnNmb3Jtcz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgIDwvUmVmZXJlbmNlPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgIDwvU2lnbmVkSW5mbz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgPC9TaWduYXR1cmU+IgorICAgICAgICAgICAgKyAiPC9DbGFzcz4iICsgIlxuIgorICAgICAgICAgICAgOworCisgICAgICAgIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LkluaXQuaW5pdCgpOworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0KKyAgICAgICAgICAgIGRiLnBhcnNlKG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0U3RyLmdldEJ5dGVzKCkpKTsKKworICAgICAgICBYUGF0aEZhY3RvcnkgeHBmID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFhQYXRoIHhwYXRoID0geHBmLm5ld1hQYXRoKCk7CisgICAgICAgIHhwYXRoLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IERTTmFtZXNwYWNlQ29udGV4dCgpKTsKKworICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9ICIvL2RzOlRyYW5zZm9ybXNbMV0iOworICAgICAgICBFbGVtZW50IHRyYW5zZm9ybXNFbGVtZW50ID0KKyAgICAgICAgICAgIChFbGVtZW50KSB4cGF0aC5ldmFsdWF0ZShleHByZXNzaW9uLCBkb2MsIFhQYXRoQ29uc3RhbnRzLk5PREUpOworCisgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKHRyYW5zZm9ybXNFbGVtZW50LCAibWVtb3J5Oi8vIik7CisgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IGlucHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KGRvYyk7CisKKyAgICAgICAgLy8gZXhlY3V0ZSBUcmFuc2Zvcm1zCisgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IHJlc3VsdCA9IHRyYW5zZm9ybXMucGVyZm9ybVRyYW5zZm9ybXMoaW5wdXQpOworCisgICAgICAgIC8vIG91dHB1dCByZXN1bHQKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcocmVzdWx0LmdldEJ5dGVzKCkpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybUVudmVsb3BlZFNpZ25hdHVyZS5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3RyYW5zZm9ybXMvU2FtcGxlVHJhbnNmb3JtRW52ZWxvcGVkU2lnbmF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljMDFlYQotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybUVudmVsb3BlZFNpZ25hdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy50cmFuc2Zvcm1zOworCitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuRFNOYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMuU2FtcGxlVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBkZW1vbnN0cmF0ZXMgdGhlIHVzZSBvZiBhIFRyYW5zZm9ybSBmb3JFbnZlbG9wZWQgU2lnbmF0dXJlLgorICoKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEdldWVyLVBvbGxtYW5uCisgKiBAdmVyc2lvbiAlSSUsICVHJQorICovCitwdWJsaWMgY2xhc3MgU2FtcGxlVHJhbnNmb3JtRW52ZWxvcGVkU2lnbmF0dXJlIHsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBtYWluCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBpbnB1dFN0ciA9CisgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICsgIlxuIgorICAgICAgICAgICAgKyAiPERvY3VtZW50IHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgPERhdGEgYXR0cj0nYXR0clZhbHVlJz50ZXh0IGluIERhdGE8L0RhdGE+IiArICJcbiIKKyAgICAgICAgICAgICsgIjxTaWduYXR1cmUgSWQ9J1NpZ25hdHVyZVRvQmVPbWl0dGVkJyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyc+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgPFNpZ25lZEluZm8+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICA8UmVmZXJlbmNlPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICA8VHJhbnNmb3Jtcz4iICsgIlxuIgorICAgICAgICAgICAgLy8gKyAiICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzJyAvPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZScgLz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzJyAvPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICA8L1RyYW5zZm9ybXM+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICA8L1JlZmVyZW5jZT4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICA8L1NpZ25lZEluZm8+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgIDwvU2lnbmF0dXJlPiIKKyAgICAgICAgICAgICsgIiAgIDxTaWduYXR1cmUgSWQ9J1Zpc2libGVTaWduYXR1cmUnIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICA8U2lnbmVkSW5mbyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyc+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICA8UmVmZXJlbmNlIHhtbG5zPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgPFRyYW5zZm9ybXMgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMnPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjZW52ZWxvcGVkLXNpZ25hdHVyZScgLz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzJyAvPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICA8L1RyYW5zZm9ybXM+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICA8L1JlZmVyZW5jZT4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICA8L1NpZ25lZEluZm8+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgIDwvU2lnbmF0dXJlPiIgKyAiXG4iCisgICAgICAgICAgICArICI8L0RvY3VtZW50PiIgKyAiXG4iCisgICAgICAgICAgICA7CisKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0KKyAgICAgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBvcmcudzNjLmRvbS5Eb2N1bWVudCBkb2MgPQorICAgICAgICAgICAgZGIucGFyc2UobmV3IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXRTdHIuZ2V0Qnl0ZXMoKSkpOworCisgICAgICAgIFhQYXRoRmFjdG9yeSB4cGYgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgWFBhdGggeHBhdGggPSB4cGYubmV3WFBhdGgoKTsKKyAgICAgICAgeHBhdGguc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgRFNOYW1lc3BhY2VDb250ZXh0KCkpOworCisgICAgICAgIFN0cmluZyBleHByZXNzaW9uID0gIi8vZHM6U2lnbmF0dXJlW0BJZD0nU2lnbmF0dXJlVG9CZU9taXR0ZWQnXS8vZHM6VHJhbnNmb3JtcyI7CisgICAgICAgIEVsZW1lbnQgdHJhbnNmb3Jtc0VsZW0gPQorICAgICAgICAgICAgKEVsZW1lbnQpIHhwYXRoLmV2YWx1YXRlKGV4cHJlc3Npb24sIGRvYywgWFBhdGhDb25zdGFudHMuTk9ERSk7CisKKyAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXModHJhbnNmb3Jtc0VsZW0sICJtZW1vcnk6Ly8iKTsKKyAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgaW5wdXQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoKE5vZGUpIGRvYyk7CisKKyAgICAgICAgLy8gaW5wdXQuc2V0Q2Fub25pY2FsaXplclVSSShDYW5vbmljYWxpemVyLkFMR09fSURfQzE0Tl9XSVRIX0NPTU1FTlRTKTsKKworICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCByZXN1bHQgPSB0cmFuc2Zvcm1zLnBlcmZvcm1UcmFuc2Zvcm1zKGlucHV0KTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhyZXN1bHQuZ2V0Qnl0ZXMoKSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3RyYW5zZm9ybXMvU2FtcGxlVHJhbnNmb3JtTm9uZS5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3RyYW5zZm9ybXMvU2FtcGxlVHJhbnNmb3JtTm9uZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjkxMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdHJhbnNmb3Jtcy9TYW1wbGVUcmFuc2Zvcm1Ob25lLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudHJhbnNmb3JtczsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmVJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLlRyYW5zZm9ybTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLlRyYW5zZm9ybVNwaTsKKworLyoqCisgKiBJbXBsZW1lbnRzIGEgbnVsbCB0cmFuc2Zvcm0gd2hpY2ggbGVhdmVkIHRoZSBpbnB1dCB1bm1vZGlmaWVkLgorICoKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEdldWVyLVBvbGxtYW5uCisgKi8KK3B1YmxpYyBjbGFzcyBTYW1wbGVUcmFuc2Zvcm1Ob25lIGV4dGVuZHMgVHJhbnNmb3JtU3BpIHsKKworICAgIHN0YXRpYyBvcmcuc2xmNGouTG9nZ2VyIGxvZyA9CisgICAgICAgIG9yZy5zbGY0ai5Mb2dnZXJGYWN0b3J5LmdldExvZ2dlcihTYW1wbGVUcmFuc2Zvcm1Ob25lLmNsYXNzKTsKKworICAgIC8qKiBGaWVsZCBpbXBsZW1lbnRlZFRyYW5zZm9ybVVSSSAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIGltcGxlbWVudGVkVHJhbnNmb3JtVVJJID0KKyAgICAgICAgImh0dHA6Ly93d3cueG1sc2VjdXJpdHkub3JnL05TL1RyYW5zZm9ybXMjbm9uZSI7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZW5naW5lR2V0VVJJCisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZW5naW5lR2V0VVJJKCkgeworICAgICAgICByZXR1cm4gU2FtcGxlVHJhbnNmb3JtTm9uZS5pbXBsZW1lbnRlZFRyYW5zZm9ybVVSSTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiB3YW50c09jdGV0U3RyZWFtICgpICAgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHB1YmxpYyBib29sZWFuIHdhbnRzTm9kZVNldCAoKSAgICAgICB7IHJldHVybiB0cnVlOyB9CisgICAgcHVibGljIGJvb2xlYW4gcmV0dXJuc09jdGV0U3RyZWFtICgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBwdWJsaWMgYm9vbGVhbiByZXR1cm5zTm9kZVNldCAoKSAgICAgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGVuZ2luZVBlcmZvcm1UcmFuc2Zvcm0KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dAorICAgICAqCisgICAgICovCisgICAgcHJvdGVjdGVkIFhNTFNpZ25hdHVyZUlucHV0IGVuZ2luZVBlcmZvcm1UcmFuc2Zvcm0oWE1MU2lnbmF0dXJlSW5wdXQgaW5wdXQsIFRyYW5zZm9ybSBfdHJhbnNmb3JtT2JqZWN0KSB7CisgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybVhQYXRoLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdHJhbnNmb3Jtcy9TYW1wbGVUcmFuc2Zvcm1YUGF0aC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NDA4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdHJhbnNmb3Jtcy9TYW1wbGVUcmFuc2Zvcm1YUGF0aC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLnRyYW5zZm9ybXM7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1zOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYSBUcmFuc2Zvcm0gZm9yIFhTTFQuIFRoZQorICogPENPREU+eHNsOnN0eWxlc2hlZXQ8L0NPREU+IGlzIGRpcmVjdGx5IGVtYmVkZGVkIGluIHRoZSA8Q09ERT5kczpUcmFuc2Zvcm08L0NPREU+LAorICogc28gdGhlIHtAbGluayBUcmFuc2Zvcm19IG9iamVjdCBpcyBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBFbGVtZW50LgorICoKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEdldWVyLVBvbGxtYW5uCisgKiBAdmVyc2lvbiAlSSUsICVHJQorICovCitwdWJsaWMgY2xhc3MgU2FtcGxlVHJhbnNmb3JtWFBhdGggeworCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRyYW5zZm9ybVN0ciA9CisgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj0nMS4wJz8+XG4iCisgICAgICAgICAgICArICI8VHJhbnNmb3JtcyB4bWxucz0naHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyc+XG4iCisgICAgICAgICAgICArICI8VHJhbnNmb3JtIEFsZ29yaXRobT0naHR0cDovL3d3dy53My5vcmcvVFIvMTk5OS9SRUMteHBhdGgtMTk5OTExMTYnPlxuIgorICAgICAgICAgICAgLy8gKyAiICAgPGRzOlhQYXRoIHhtbG5zOm1hdGNoPSdodHRwOi8vc2ZkZmcvJz4oc2VsZjo6bWF0Y2g6T3JkZXIgfCBzZWxmOjp0ZXh0KClbc3RyaW5nKHBhcmVudDo6ZSk9XCJIZWxsbywgIHdvcmxkIVwiXSk8L2RzOlhQYXRoPlxuIgorICAgICAgICAgICAgLy8gKyAiICAgPGRzOlhQYXRoPi8vQCo8L2RzOlhQYXRoPlxuIgorICAgICAgICAgICAgKyAiICAgPCEtLSBFeGNsdWRlIGFsbCBzaWduYXR1cmVzIC0tPlxuIgorICAgICAgICAgICAgLy8gKyAiICAgPGRzOlhQYXRoIHhtbG5zOmRzPSdodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA5L3htbGRzaWcjJz5ub3QoYW5jZXN0b3Itb3Itc2VsZjo6ZHM6U2lnbmF0dXJlKTwvZHM6WFBhdGg+XG4iCisgICAgICAgICAgICArICIgICA8ZHM6WFBhdGggeG1sbnM6ZHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMnPnNlbGY6OnRleHQoKVthbmNlc3Rvci1vci1zZWxmOjpub2RlKCk9L0NsYXNzL2VbMV1dPC9kczpYUGF0aD5cbiIKKyAgICAgICAgICAgICsgIjwvVHJhbnNmb3JtPlxuIgorICAgICAgICAgICAgKyAiPC9UcmFuc2Zvcm1zPlxuIgorICAgICAgICAgICAgOworCisgICAgICAgIFN0cmluZyBpbnB1dFN0ciA9CisgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiPz4iICsgIlxuIgorICAgICAgICAgICAgKyAiPENsYXNzPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICA8ZT5IZWxsbywgPCEtLSBjb21tZW50IC0tPiB3b3JsZCE8L2U+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgIDxPcmRlciBOYW1lPSdUSU5BTUlGT1JNRVMnIHhtbG5zPSdodHRwOi8vc2ZkZmcvJz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgPEZhbWlseSBOYW1lPSdUSU5BTUlEQUUnPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9J0NyeXB0dXJlbGx1cyBib3VjYXJkaSc+U2xhdHktYnJlYXN0ZWQgVGluYW1vdS48L1NwZWNpZXM+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgIDwvRmFtaWx5PiIgKyAiXG4iCisgICAgICAgICAgICArICIgICA8L09yZGVyPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICA8T3JkZXIgTmFtZT0nUE9ESUNJUEVESUZPUk1FUycvPiIgKyAiXG4iCisgICAgICAgICAgICArICI8U2lnbmF0dXJlIElkPSdTaWduYXR1cmVUb0JlT21pdHRlZCcgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMnPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgIDxTaWduZWRJbmZvPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgPFJlZmVyZW5jZT4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgPFRyYW5zZm9ybXM+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyNlbnZlbG9wZWQtc2lnbmF0dXJlJyAvPiIgKyAiXG4iCisgICAgICAgICAgICAvLyAgICAgICArICIgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMnIC8+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgIDwvVHJhbnNmb3Jtcz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgIDwvUmVmZXJlbmNlPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgIDwvU2lnbmVkSW5mbz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgPC9TaWduYXR1cmU+IgorICAgICAgICAgICAgKyAiPC9DbGFzcz4iICsgIlxuIgorICAgICAgICAgICAgOworCisgICAgICAgIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LkluaXQuaW5pdCgpOworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0KKyAgICAgICAgICAgIGRiLnBhcnNlKG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKHRyYW5zZm9ybVN0ci5nZXRCeXRlcygpKSk7CisKKyAgICAgICAgU3RyaW5nIEJhc2VVUkkgPSBudWxsOworICAgICAgICBUcmFuc2Zvcm1zIHRyYW5zZm9ybXMgPSBuZXcgVHJhbnNmb3Jtcyhkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCksIEJhc2VVUkkpOworCisgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IGlucHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KGlucHV0U3RyLmdldEJ5dGVzKCkpOworCisgICAgICAgIC8vIGlucHV0LnNldENhbm9uaWNhbGl6ZXJVUkkoQ2Fub25pY2FsaXplci5BTEdPX0lEX0MxNE5fV0lUSF9DT01NRU5UUyk7CisKKyAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgcmVzdWx0ID0gdHJhbnNmb3Jtcy5wZXJmb3JtVHJhbnNmb3JtcyhpbnB1dCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcocmVzdWx0LmdldEJ5dGVzKCkpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybVhQYXRoMkZpbHRlci5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3RyYW5zZm9ybXMvU2FtcGxlVHJhbnNmb3JtWFBhdGgyRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI5MGZmYgotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybVhQYXRoMkZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy50cmFuc2Zvcm1zOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5jMTRuLkNhbm9uaWNhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLlRyYW5zZm9ybXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5wYXJhbXMuWFBhdGgyRmlsdGVyQ29udGFpbmVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5KYXZhVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlTGlzdDsKKworLyoqCisgKiBTYW1wbGUgZm9yIHRoZSA8ST5YTUwgU2lnbmF0dXJlIFhQYXRoIEZpbHRlciB2Mi4wPC9JPgorICoKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqIEBzZWUgPEEgSFJFRj0iaHR0cDovL3d3dy53My5vcmcvVFIveG1sZHNpZy1maWx0ZXIyLyI+WFBhdGggRmlsdGVyIHYyLjAgKFRSKTwvQT4KKyAqIEBzZWUgPEEgSFJFRj1odHRwOi8vd3d3LnczLm9yZy9TaWduYXR1cmUvRHJhZnRzL3htbGRzaWcteGZpbHRlcjIvIj5YUGF0aCBGaWx0ZXIgdjIuMCAoZWRpdG9ycyBjb3B5KTwvQT4KKyAqLworcHVibGljIGNsYXNzIFNhbXBsZVRyYW5zZm9ybVhQYXRoMkZpbHRlciB7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LkluaXQuaW5pdCgpOworCisgICAgICAgIGJvb2xlYW4gdmVyYm9zZSA9IHRydWU7CisKKyAgICAgICAgY3JlYXRlKCJidWlsZC93aXRoQ29tbWVudHMueG1sIiwgdHJ1ZSwgdmVyYm9zZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIGNyZWF0ZSgiYnVpbGQvb21pdENvbW1lbnRzLnhtbCIsIGZhbHNlLCB2ZXJib3NlKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgY2hlY2soImJ1aWxkL3dpdGhDb21tZW50cy54bWwiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgY3JlYXRlCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiBAcGFyYW0gd2l0aENvbW1lbnRzCisgICAgICogQHBhcmFtIHZlcmJvc2UKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGUoCisgICAgICAgIFN0cmluZyBmaWxlbmFtZSwgYm9vbGVhbiB3aXRoQ29tbWVudHMsIGJvb2xlYW4gdmVyYm9zZQorICAgICkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZyBpbnB1dERvYyA9CisgICAgICAgICAgICAiPERvY3VtZW50PlxuIiArCisgICAgICAgICAgICAiICAgICA8VG9CZVNpZ25lZD5cbiIgKworICAgICAgICAgICAgIiAgICAgICA8IS0tIGNvbW1lbnQgLS0+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgPERhdGEgLz5cbiIgKworICAgICAgICAgICAgIiAgICAgICA8Tm90VG9CZVNpZ25lZD5cbiIgKworICAgICAgICAgICAgIiAgICAgICAgIDxSZWFsbHlUb0JlU2lnbmVkPlxuIiArCisgICAgICAgICAgICAiICAgICAgICAgICA8IS0tIGNvbW1lbnQgLS0+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgICAgIDxEYXRhIC8+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgICA8L1JlYWxseVRvQmVTaWduZWQ+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgPC9Ob3RUb0JlU2lnbmVkPlxuIiArCisgICAgICAgICAgICAiICAgICA8L1RvQmVTaWduZWQ+XG4iICsKKyAgICAgICAgICAgICIgICAgIDxUb0JlU2lnbmVkPlxuIiArCisgICAgICAgICAgICAiICAgICAgIDxEYXRhIC8+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgPE5vdFRvQmVTaWduZWQ+XG4iICsKKyAgICAgICAgICAgICIgICAgICAgICA8RGF0YSAvPlxuIiArCisgICAgICAgICAgICAiICAgICAgIDwvTm90VG9CZVNpZ25lZD5cbiIgKworICAgICAgICAgICAgIiAgICAgPC9Ub0JlU2lnbmVkPlxuIiArCisgICAgICAgICAgICAiPC9Eb2N1bWVudD4iOworICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXREb2MuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBYTUxTaWduYXR1cmUgc2lnID0gbmV3IFhNTFNpZ25hdHVyZShkb2MsIG51bGwsIFhNTFNpZ25hdHVyZS5BTEdPX0lEX01BQ19ITUFDX1NIQTEpOworCisgICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChzaWcuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CisKKyAgICAgICAgVHJhbnNmb3JtcyB0cmFuc2Zvcm1zID0gbmV3IFRyYW5zZm9ybXMoZG9jKTsKKworICAgICAgICBTdHJpbmcgZmlsdGVyc1tdW10gPSB7e1hQYXRoMkZpbHRlckNvbnRhaW5lci5JTlRFUlNFQ1QsICIvL1RvQmVTaWduZWQifSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtYUGF0aDJGaWx0ZXJDb250YWluZXIuU1VCVFJBQ1QsICAiLy9Ob3RUb0JlU2lnbmVkIn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7WFBhdGgyRmlsdGVyQ29udGFpbmVyLlVOSU9OLCAgICAgIi8vUmVhbGx5VG9CZVNpZ25lZCJ9fTsKKworICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybSgKKyAgICAgICAgICAgIFRyYW5zZm9ybXMuVFJBTlNGT1JNX1hQQVRIMkZJTFRFUiwgWFBhdGgyRmlsdGVyQ29udGFpbmVyLm5ld0luc3RhbmNlcyhkb2MsIGZpbHRlcnMpCisgICAgICAgICk7CisgICAgICAgIGlmICh3aXRoQ29tbWVudHMpIHsKKyAgICAgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX0MxNE5fV0lUSF9DT01NRU5UUyk7CisgICAgICAgIH0KKworICAgICAgICBzaWcuYWRkRG9jdW1lbnQoIiN4cG9pbnRlcigvKSIsIHRyYW5zZm9ybXMpOworCisgICAgICAgIFN0cmluZyBzZWNyZXRLZXkgPSAic2VjcmV0IjsKKworICAgICAgICBzaWcuZ2V0S2V5SW5mbygpLmFkZEtleU5hbWUoIlRoZSBVVEYtOCBvY3RldHMgb2YgXCIiICsgc2VjcmV0S2V5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcIiBhcmUgdXNlZCBmb3Igc2lnbmluZyAoIiArIHNlY3JldEtleS5sZW5ndGgoKSArICIgb2N0ZXRzKSIpOworICAgICAgICBzaWcuc2lnbihzaWcuY3JlYXRlU2VjcmV0S2V5KHNlY3JldEtleS5nZXRCeXRlcygpKSk7CisKKyAgICAgICAgQ2Fub25pY2FsaXplciBjMTRuID0KKyAgICAgICAgICAgIENhbm9uaWNhbGl6ZXIuZ2V0SW5zdGFuY2UoQ2Fub25pY2FsaXplci5BTEdPX0lEX0MxNE5fV0lUSF9DT01NRU5UUyk7CisgICAgICAgIGJ5dGVbXSBmdWxsID0gYzE0bi5jYW5vbmljYWxpemVTdWJ0cmVlKGRvYyk7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmlsZW5hbWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3Mud3JpdGUoZnVsbCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh2ZXJib3NlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW5wdXQgdG8gdGhlIHRyYW5zZm9ybXMgaXMiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgIG5ldyBTdHJpbmcoc2lnLmdldFNpZ25lZEluZm8oKS5pdGVtKDApLmdldENvbnRlbnRzQmVmb3JlVHJhbnNmb3JtYXRpb24oKS5nZXRCeXRlcygpKQorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGUgc2lnbmVkIG9jdGV0cyAob3V0cHV0IG9mIHRoZSB0cmFuc2Zvcm1zKSBhcmUgIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKHNpZy5nZXRTaWduZWRJbmZvKCkuaXRlbSgwKS5nZXRUcmFuc2Zvcm1zT3V0cHV0KCkuZ2V0Qnl0ZXMoKSkKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlIGRvY3VtZW50IGlzICIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhmdWxsKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgfQorCisgICAgICAgIEphdmFVdGlscy53cml0ZUJ5dGVzVG9GaWxlbmFtZSgKKyAgICAgICAgICAgICJidWlsZC94ZmlsdGVyMi5odG1sIiwgc2lnLmdldFNpZ25lZEluZm8oKS5pdGVtKDApLmdldEhUTUxSZXByZXNlbnRhdGlvbigpLmdldEJ5dGVzKCkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgY2hlY2sKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZW5hbWUpKTsKKyAgICAgICAgTm9kZUxpc3Qgc2lncyA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMsIENvbnN0YW50cy5fVEFHX1NJR05BVFVSRSk7CisKKyAgICAgICAgWE1MU2lnbmF0dXJlIHNpZyA9CisgICAgICAgICAgICBuZXcgWE1MU2lnbmF0dXJlKChFbGVtZW50KXNpZ3MuaXRlbSgwKSwgbmV3IEZpbGUoZmlsZW5hbWUpLnRvVVJJKCkudG9VUkwoKS50b1N0cmluZygpKTsKKyAgICAgICAgYm9vbGVhbiBjaGVjayA9IHNpZy5jaGVja1NpZ25hdHVyZVZhbHVlKHNpZy5jcmVhdGVTZWNyZXRLZXkoInNlY3JldCIuZ2V0Qnl0ZXMoKSkpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmVyaWZpY2F0aW9uIG9mICIgKyBmaWxlbmFtZSArICI6ICIgKyBjaGVjayk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHNpZy5nZXRTaWduZWRJbmZvKCkuaXRlbSgwKS5nZXRUcmFuc2Zvcm1zT3V0cHV0KCkuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3RyYW5zZm9ybXMvU2FtcGxlVHJhbnNmb3JtWFBhdGgyRmlsdGVyMi5qYXZhIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3RyYW5zZm9ybXMvU2FtcGxlVHJhbnNmb3JtWFBhdGgyRmlsdGVyMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMDA4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdHJhbnNmb3Jtcy9TYW1wbGVUcmFuc2Zvcm1YUGF0aDJGaWx0ZXIyLmphdmEKQEAgLTAsMCArMSwyMDQgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudHJhbnNmb3JtczsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYzE0bi5DYW5vbmljYWxpemVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1zOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMucGFyYW1zLlhQYXRoMkZpbHRlckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuRWxlbWVudFByb3h5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkphdmFVdGlsczsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OworCisvKioKKyAqIFNhbXBsZSBmb3IgdGhlIDxJPlhNTCBTaWduYXR1cmUgWFBhdGggRmlsdGVyIHYyLjA8L0k+CisgKgorICogQGF1dGhvciAkQXV0aG9yJAorICogQHNlZSA8QSBIUkVGPSJodHRwOi8vd3d3LnczLm9yZy9UUi94bWxkc2lnLWZpbHRlcjIvIj5YUGF0aCBGaWx0ZXIgdjIuMCAoVFIpPC9BPgorICogQHNlZSA8QSBIUkVGPWh0dHA6Ly93d3cudzMub3JnL1NpZ25hdHVyZS9EcmFmdHMveG1sZHNpZy14ZmlsdGVyMi8iPgorICogWFBhdGggRmlsdGVyIHYyLjAgKGVkaXRvcnMgY29weSk8L0E+CisgKi8KKworcHVibGljIGNsYXNzIFNhbXBsZVRyYW5zZm9ybVhQYXRoMkZpbHRlcjIgeworCisgICAgLyoqCisgICAgICogTWV0aG9kIG1haW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICBib29sZWFuIHZlcmJvc2UgPSB0cnVlOworCisgICAgICAgIGNyZWF0ZSgiYnVpbGQvd2l0aENvbW1lbnRzLnhtbCIsIHRydWUsIHZlcmJvc2UpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICBjcmVhdGUoImJ1aWxkL29taXRDb21tZW50cy54bWwiLCBmYWxzZSwgdmVyYm9zZSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCk7CisgICAgICAgIGNoZWNrKCJidWlsZC93aXRoQ29tbWVudHMueG1sIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGNyZWF0ZQorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lCisgICAgICogQHBhcmFtIHdpdGhDb21tZW50cworICAgICAqIEBwYXJhbSB2ZXJib3NlCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlKAorICAgICAgICBTdHJpbmcgZmlsZW5hbWUsIGJvb2xlYW4gd2l0aENvbW1lbnRzLCBib29sZWFuIHZlcmJvc2UKKyAgICApIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZyBpbnB1dERvYyA9ICI8QT48VU5TSUdORUQ+PEI+PFNJR05FRD48TU9SRV9TSUdORURfU1RVRkYvPjwvU0lHTkVEPjxDPjxVTlNJR05FRC8+PC9DPjwvQj48RD48VU5TSUdORUQvPjwvRD48VU5TSUdORUQ+PEU+PFNJR05FRD48TU9SRV9TSUdORURfU1RVRkYvPjwvU0lHTkVEPjwvRT48VU5TSUdORUQ+PEY+PEc+PEgvPjwvRz48L0Y+PC9VTlNJR05FRD48L1VOU0lHTkVEPjwvVU5TSUdORUQ+PC9BPiI7CisKKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0RG9jLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgWE1MU2lnbmF0dXJlIHNpZyA9IG5ldyBYTUxTaWduYXR1cmUoZG9jLCBudWxsLCBYTUxTaWduYXR1cmUuQUxHT19JRF9NQUNfSE1BQ19TSEExKTsKKworICAgICAgICBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoc2lnLmdldEVsZW1lbnQoKSk7CisgICAgICAgIHNpZy5nZXRFbGVtZW50KCkuc2V0QXR0cmlidXRlTlMoCisgICAgICAgICAgICBDb25zdGFudHMuTmFtZXNwYWNlU3BlY05TLAorICAgICAgICAgICAgInhtbG5zOiIgKyBFbGVtZW50UHJveHkuZ2V0RGVmYXVsdFByZWZpeChUcmFuc2Zvcm1zLlRSQU5TRk9STV9YUEFUSDJGSUxURVIpLAorICAgICAgICAgICAgVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fWFBBVEgyRklMVEVSCisgICAgICAgICk7CisgICAgICAgIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOworCisgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKGRvYyk7CisKKyAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fWFBBVEgyRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aDJGaWx0ZXJDb250YWluZXIubmV3SW5zdGFuY2VJbnRlcnNlY3QoZG9jLCAiLy9FIikuZ2V0RWxlbWVudCgpKTsKKworICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9YUEFUSDJGSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoMkZpbHRlckNvbnRhaW5lci5uZXdJbnN0YW5jZVVuaW9uKGRvYywgIi8vQiIpLmdldEVsZW1lbnQoKSk7CisgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX1hQQVRIMkZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGgyRmlsdGVyQ29udGFpbmVyLm5ld0luc3RhbmNlU3VidHJhY3QoZG9jLCAiLy9DIikuZ2V0RWxlbWVudCgpKTsKKworICAgICAgICB0cmFuc2Zvcm1zLmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1zLlRSQU5TRk9STV9YUEFUSDJGSUxURVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoMkZpbHRlckNvbnRhaW5lci5uZXdJbnN0YW5jZVVuaW9uKGRvYywgIi8vRiIpLmdldEVsZW1lbnQoKSk7CisgICAgICAgIHRyYW5zZm9ybXMuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybXMuVFJBTlNGT1JNX1hQQVRIMkZJTFRFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGgyRmlsdGVyQ29udGFpbmVyLm5ld0luc3RhbmNlU3VidHJhY3QoZG9jLCAiLy9HIikuZ2V0RWxlbWVudCgpKTsKKyAgICAgICAgdHJhbnNmb3Jtcy5hZGRUcmFuc2Zvcm0oVHJhbnNmb3Jtcy5UUkFOU0ZPUk1fWFBBVEgyRklMVEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aDJGaWx0ZXJDb250YWluZXIubmV3SW5zdGFuY2VVbmlvbihkb2MsICIvL0giKS5nZXRFbGVtZW50KCkpOworCisgICAgICAgIHNpZy5hZGREb2N1bWVudCgiIiwgdHJhbnNmb3Jtcyk7CisKKyAgICAgICAgU3RyaW5nIHNlY3JldEtleSA9ICJzZWNyZXQiOworCisgICAgICAgIHNpZy5nZXRLZXlJbmZvKCkuYWRkS2V5TmFtZSgiVGhlIFVURi04IG9jdGV0cyBvZiBcIiIgKyBzZWNyZXRLZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlwiIGFyZSB1c2VkIGZvciBzaWduaW5nICgiICsgc2VjcmV0S2V5Lmxlbmd0aCgpICsgIiBvY3RldHMpIik7CisgICAgICAgIHNpZy5zaWduKHNpZy5jcmVhdGVTZWNyZXRLZXkoc2VjcmV0S2V5LmdldEJ5dGVzKCkpKTsKKworICAgICAgICBDYW5vbmljYWxpemVyIGMxNG4gPQorICAgICAgICAgICAgQ2Fub25pY2FsaXplci5nZXRJbnN0YW5jZShDYW5vbmljYWxpemVyLkFMR09fSURfQzE0Tl9XSVRIX0NPTU1FTlRTKTsKKyAgICAgICAgYnl0ZVtdIGZ1bGwgPSBjMTRuLmNhbm9uaWNhbGl6ZVN1YnRyZWUoZG9jKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlbmFtZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvcy53cml0ZShmdWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbnB1dCB0byB0aGUgdHJhbnNmb3JtcyBpcyIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhzaWcuZ2V0U2lnbmVkSW5mbygpLml0ZW0oMCkuZ2V0Q29udGVudHNCZWZvcmVUcmFuc2Zvcm1hdGlvbigpLmdldEJ5dGVzKCkpCisgICAgICAgICAgICApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0CisgICAgICAgICAgICAucHJpbnRsbigiVGhlIHNpZ25lZCBvY3RldHMgKG91dHB1dCBvZiB0aGUgdHJhbnNmb3JtcykgYXJlICIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhzaWcuZ2V0U2lnbmVkSW5mbygpLml0ZW0oMCkuZ2V0VHJhbnNmb3Jtc091dHB1dCgpLmdldEJ5dGVzKCkpCisgICAgICAgICAgICApOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRoZSBkb2N1bWVudCBpcyAiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoZnVsbCkpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgY2hlY2sKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlbmFtZQorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UobmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlbmFtZSkpOworICAgICAgICBOb2RlTGlzdCBzaWdzID0gZG9jLmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoQ29uc3RhbnRzLlNpZ25hdHVyZVNwZWNOUywgQ29uc3RhbnRzLl9UQUdfU0lHTkFUVVJFKTsKKworICAgICAgICBYTUxTaWduYXR1cmUgc2lnID0KKyAgICAgICAgICAgIG5ldyBYTUxTaWduYXR1cmUoKEVsZW1lbnQpc2lncy5pdGVtKDApLCBuZXcgRmlsZShmaWxlbmFtZSkudG9VUkkoKS50b1VSTCgpLnRvU3RyaW5nKCkpOworICAgICAgICBib29sZWFuIGNoZWNrID0gc2lnLmNoZWNrU2lnbmF0dXJlVmFsdWUoc2lnLmNyZWF0ZVNlY3JldEtleSgic2VjcmV0Ii5nZXRCeXRlcygpKSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWZXJpZmljYXRpb24gb2YgIiArIGZpbGVuYW1lICsgIjogIiArIGNoZWNrKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoc2lnLmdldFNpZ25lZEluZm8oKS5pdGVtKDApLmdldFRyYW5zZm9ybXNPdXRwdXQoKS5nZXRCeXRlcygpKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisKKyAgICAgICAgSmF2YVV0aWxzLndyaXRlQnl0ZXNUb0ZpbGVuYW1lKAorICAgICAgICAgICAgImJ1aWxkLzEuaHRtbCIsIHNpZy5nZXRTaWduZWRJbmZvKCkuaXRlbSgwKS5nZXRIVE1MUmVwcmVzZW50YXRpb24oKS5nZXRCeXRlcygpCisgICAgICAgICk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdHJhbnNmb3Jtcy9TYW1wbGVUcmFuc2Zvcm1YUGF0aEhlcmVGdW5jLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdHJhbnNmb3Jtcy9TYW1wbGVUcmFuc2Zvcm1YUGF0aEhlcmVGdW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmYTYxMAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybVhQYXRoSGVyZUZ1bmMuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudHJhbnNmb3JtczsKKworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmVJbnB1dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLkRTTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zYW1wbGVzLlNhbXBsZVV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMuVHJhbnNmb3JtczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYSBUcmFuc2Zvcm0gZm9yIFhTTFQuIFRoZQorICogPENPREU+eHNsOnN0eWxlc2hlZXQ8L0NPREU+IGlzIGRpcmVjdGx5IGVtYmVkZGVkIGluIHRoZSA8Q09ERT5kczpUcmFuc2Zvcm08L0NPREU+LAorICogc28gdGhlIHtAbGluayBUcmFuc2Zvcm19IG9iamVjdCBpcyBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBFbGVtZW50LgorICoKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEdldWVyLVBvbGxtYW5uCisgKiBAdmVyc2lvbiAlSSUsICVHJQorICovCitwdWJsaWMgY2xhc3MgU2FtcGxlVHJhbnNmb3JtWFBhdGhIZXJlRnVuYyB7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaW5wdXRTdHIgPQorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+IiArICJcbiIKKyAgICAgICAgICAgICsgIjxEb2N1bWVudD4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgPERhdGEgYXR0cj0nYXR0clZhbHVlJz50ZXh0IGluIERhdGE8L0RhdGE+IiArICJcbiIKKyAgICAgICAgICAgICsgIjxTaWduYXR1cmUgeG1sbnM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMnPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgIDxTaWduZWRJbmZvPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgPFJlZmVyZW5jZT4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgPFRyYW5zZm9ybXM+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgPFRyYW5zZm9ybSB4bWxuczpkcz0naHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIycgQWxnb3JpdGhtPSdodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk5L1JFQy14cGF0aC0xOTk5MTExNic+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgICA8WFBhdGg+Y291bnQoYW5jZXN0b3Itb3Itc2VsZjo6ZHM6U2lnbmF0dXJlIHwgaGVyZSgpL2FuY2VzdG9yOjpkczpTaWduYXR1cmVbMV0pICZndDsgY291bnQoYW5jZXN0b3Itb3Itc2VsZjo6ZHM6U2lnbmF0dXJlKTwvWFBhdGg+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgPC9UcmFuc2Zvcm0+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1I1dpdGhDb21tZW50cycgLz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzJyAvPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICAgIDxUcmFuc2Zvcm0gQWxnb3JpdGhtPSdodHRwOi8vd3d3LnczLm9yZy9UUi8yMDAxL1JFQy14bWwtYzE0bi0yMDAxMDMxNSNXaXRoQ29tbWVudHMnIC8+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgPFRyYW5zZm9ybSBBbGdvcml0aG09J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDEvUkVDLXhtbC1jMTRuLTIwMDEwMzE1I1dpdGhDb21tZW50cycgLz4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICA8VHJhbnNmb3JtIEFsZ29yaXRobT0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMS9SRUMteG1sLWMxNG4tMjAwMTAzMTUjV2l0aENvbW1lbnRzJyAvPiIgKyAiXG4iCisgICAgICAgICAgICArICIgICAgICAgICA8L1RyYW5zZm9ybXM+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICA8L1JlZmVyZW5jZT4iICsgIlxuIgorICAgICAgICAgICAgKyAiICAgICA8L1NpZ25lZEluZm8+IiArICJcbiIKKyAgICAgICAgICAgICsgIiAgIDwvU2lnbmF0dXJlPiIKKyAgICAgICAgICAgICsgIjwvRG9jdW1lbnQ+IgorICAgICAgICAgICAgOworCisgICAgICAgIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LkluaXQuaW5pdCgpOworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9CisgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgZGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlciBkYiA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgb3JnLnczYy5kb20uRG9jdW1lbnQgZG9jID0KKyAgICAgICAgICAgIGRiLnBhcnNlKG5ldyBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0U3RyLmdldEJ5dGVzKCkpKTsKKworICAgICAgICBYUGF0aEZhY3RvcnkgeHBmID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIFhQYXRoIHhwYXRoID0geHBmLm5ld1hQYXRoKCk7CisgICAgICAgIHhwYXRoLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IERTTmFtZXNwYWNlQ29udGV4dCgpKTsKKworICAgICAgICBTdHJpbmcgZXhwcmVzc2lvbiA9ICIvRG9jdW1lbnQvZHM6U2lnbmF0dXJlWzFdL2RzOlNpZ25lZEluZm8vZHM6UmVmZXJlbmNlWzFdL2RzOlRyYW5zZm9ybXMiOworICAgICAgICBFbGVtZW50IHRyYW5zZm9ybXNFbGVtID0KKyAgICAgICAgICAgIChFbGVtZW50KSB4cGF0aC5ldmFsdWF0ZShleHByZXNzaW9uLCBkb2MsIFhQYXRoQ29uc3RhbnRzLk5PREUpOworCisgICAgICAgIFRyYW5zZm9ybXMgdHJhbnNmb3JtcyA9IG5ldyBUcmFuc2Zvcm1zKHRyYW5zZm9ybXNFbGVtLCAibWVtb3J5Oi8vIik7CisgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IGlucHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KChOb2RlKSBkb2MpOworCisgICAgICAgIC8vIGlucHV0LnNldENhbm9uaWNhbGl6ZXJVUkkoQ2Fub25pY2FsaXplci5BTEdPX0lEX0MxNE5fV0lUSF9DT01NRU5UUyk7CisKKyAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgcmVzdWx0ID0gdHJhbnNmb3Jtcy5wZXJmb3JtVHJhbnNmb3JtcyhpbnB1dCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcocmVzdWx0LmdldEJ5dGVzKCkpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybVhTTFQuamF2YSBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy90cmFuc2Zvcm1zL1NhbXBsZVRyYW5zZm9ybVhTTFQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWRkYTVjCi0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zYW1wbGVzL3RyYW5zZm9ybXMvU2FtcGxlVHJhbnNmb3JtWFNMVC5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy50cmFuc2Zvcm1zOworCisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1zOworCisvKioKKyAqIFRoaXMgY2xhc3MgZGVtb25zdHJhdGVzIHRoZSB1c2Ugb2YgYSBUcmFuc2Zvcm0gZm9yIFhTTFQuIFRoZQorICogPENPREU+eHNsOnN0eWxlc2hlZXQ8L0NPREU+IGlzIGRpcmVjdGx5IGVtYmVkZGVkIGluIHRoZSA8Q09ERT5kczpUcmFuc2Zvcm08L0NPREU+LAorICogc28gdGhlIHtAbGluayBUcmFuc2Zvcm19IG9iamVjdCBpcyBjcmVhdGVkIGJ5IHVzaW5nIHRoZSBFbGVtZW50LgorICoKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEdldWVyLVBvbGxtYW5uCisgKiBAdmVyc2lvbiAlSSUsICVHJQorICovCitwdWJsaWMgY2xhc3MgU2FtcGxlVHJhbnNmb3JtWFNMVCB7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZyBhcmdzW10pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICBTdHJpbmcgdHJhbnNmb3JtU3RyID0KKyAgICAgICAgICAgICI8P3htbCB2ZXJzaW9uPVwiMS4wXCI/PlxuIgorICAgICAgICAgICAgKyAiPGRzOlRyYW5zZm9ybXMgeG1sbnM6ZHM9J2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMDkveG1sZHNpZyMnPlxuIgorICAgICAgICAgICAgKyAiPGRzOlRyYW5zZm9ybSBBbGdvcml0aG09J2h0dHA6Ly93d3cudzMub3JnL1RSLzE5OTkvUkVDLXhzbHQtMTk5OTExMTYnPlxuIgorICAgICAgICAgICAgKyAiPHhzbDpzdHlsZXNoZWV0ICB2ZXJzaW9uPVwiMS4wXCJcbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgICAgICAgeG1sbnM6eHNsPSdodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0nPlxuIgorICAgICAgICAgICAgKyAiPHhzbDpvdXRwdXQgbWV0aG9kPVwieG1sXCIgaW5kZW50PVwieWVzXCIvPlxuIgorCisgICAgICAgICAgICArICI8eHNsOnRlbXBsYXRlIG1hdGNoPVwiQ2xhc3NcIj5cbiIKKyAgICAgICAgICAgICsgIjxCaXJkSW5mbz5cbiIKKyAgICAgICAgICAgICsgIgk8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9XCJPcmRlclwiLz5cbiIKKyAgICAgICAgICAgICsgIjwvQmlyZEluZm8+XG4iCisgICAgICAgICAgICArICI8L3hzbDp0ZW1wbGF0ZT5cbiIKKworICAgICAgICAgICAgKyAiPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIk9yZGVyXCI+XG4iCisgICAgICAgICAgICArICJPcmRlciBpczogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiQE5hbWVcIi8+XG4iCisgICAgICAgICAgICArICIJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiRmFtaWx5XCIvPjx4c2w6dGV4dD5cbiIKKyAgICAgICAgICAgICsgIjwveHNsOnRleHQ+XG4iCisgICAgICAgICAgICArICI8L3hzbDp0ZW1wbGF0ZT5cbiIKKworICAgICAgICAgICAgKyAiPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIkZhbWlseVwiPlxuIgorICAgICAgICAgICAgKyAiCUZhbWlseSBpczogIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiQE5hbWVcIi8+XG4iCisgICAgICAgICAgICArICIJPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PVwiU3BlY2llcyB8IFN1YkZhbWlseSB8IHRleHQoKVwiLz5cbiIKKyAgICAgICAgICAgICsgIjwveHNsOnRlbXBsYXRlPlxuIgorICAgICAgICAgICAgKyAiPHhzbDp0ZW1wbGF0ZSBtYXRjaD1cIlN1YkZhbWlseVwiPlxuIgorICAgICAgICAgICAgKyAiCQlTdWJGYW1pbHkgaXMgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9XCJATmFtZVwiLz5cbiIKKyAgICAgICAgICAgICsgIiAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9XCJTcGVjaWVzIHwgdGV4dCgpXCIvPlxuIgorICAgICAgICAgICAgKyAiPC94c2w6dGVtcGxhdGU+XG4iCisKKyAgICAgICAgICAgICsgIjx4c2w6dGVtcGxhdGUgbWF0Y2g9XCJTcGVjaWVzXCI+XG4iCisgICAgICAgICAgICArICIJPHhzbDpjaG9vc2U+XG4iCisgICAgICAgICAgICArICIJICA8eHNsOndoZW4gdGVzdD1cIm5hbWUoLi4pPSdTdWJGYW1pbHknXCI+XG4iCisgICAgICAgICAgICArICIJCTx4c2w6dGV4dD4JPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD1cIi5cIi8+PHhzbDp0ZXh0PiA8L3hzbDp0ZXh0Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PVwiQFNjaWVudGlmaWNfTmFtZVwiLz5cbiIKKyAgICAgICAgICAgICsgIgkgIDwveHNsOndoZW4+XG4iCisgICAgICAgICAgICArICIJICA8eHNsOm90aGVyd2lzZT5cbiIKKyAgICAgICAgICAgICsgIgkJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9XCIuXCIvPjx4c2w6dGV4dD4gPC94c2w6dGV4dD48eHNsOnZhbHVlLW9mIHNlbGVjdD1cIkBTY2llbnRpZmljX05hbWVcIi8+XG4iCisgICAgICAgICAgICArICIJICA8L3hzbDpvdGhlcndpc2U+XG4iCisgICAgICAgICAgICArICIJPC94c2w6Y2hvb3NlPlxuIgorICAgICAgICAgICAgKyAiPC94c2w6dGVtcGxhdGU+XG4iCisKKyAgICAgICAgICAgICsgIjwveHNsOnN0eWxlc2hlZXQ+XG4iCisgICAgICAgICAgICArICI8L2RzOlRyYW5zZm9ybT5cbiIKKyAgICAgICAgICAgICsgIjwvZHM6VHJhbnNmb3Jtcz5cbiIKKyAgICAgICAgICAgIDsKKworICAgICAgICBTdHJpbmcgaW5wdXRTdHIgPQorICAgICAgICAgICAgIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+XG4iCisgICAgICAgICAgICArICI8Q2xhc3M+XG4iCisgICAgICAgICAgICArICI8T3JkZXIgTmFtZT1cIlRJTkFNSUZPUk1FU1wiPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICA8RmFtaWx5IE5hbWU9XCJUSU5BTUlEQUVcIj5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT1cIlRpbmFtdXMgbWFqb3JcIj4gIEdyZWF0IFRpbmFtb3UuPC9TcGVjaWVzPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPVwiTm90aG9jZXJjdXNcIj5IaWdobGFuZCBUaW5hbW91LjwvU3BlY2llcz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT1cIkNyeXB0dXJlbGx1cyBzb3VpXCI+TGl0dGxlIFRpbmFtb3UuPC9TcGVjaWVzPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPVwiQ3J5cHR1cmVsbHVzIGNpbm5hbW9tZXVzXCI+VGhpY2tldCBUaW5hbW91LjwvU3BlY2llcz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT1cIkNyeXB0dXJlbGx1cyBib3VjYXJkaVwiPlNsYXR5LWJyZWFzdGVkIFRpbmFtb3UuPC9TcGVjaWVzPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPVwiQ3J5cHR1cmVsbHVzIGtlcnJpYWVcIj5DaG9jbyBUaW5hbW91LjwvU3BlY2llcz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgPC9GYW1pbHk+XG4iCisgICAgICAgICAgICArICIgICAgPC9PcmRlcj5cbiIKKyAgICAgICAgICAgICsgIiAgICA8T3JkZXIgTmFtZT1cIkdBVklJRk9STUVTXCI+XG4iCisgICAgICAgICAgICArICIgICAgICAgIDxGYW1pbHkgTmFtZT1cIkdBVklJREFFXCI+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9XCJHYXZpYSBzdGVsbGF0YVwiPlJlZC10aHJvYXRlZCBMb29uLjwvU3BlY2llcz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT1cIkdhdmlhIGFyY3RpY2FcIj5BcmN0aWMgTG9vbi48L1NwZWNpZXM+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9XCJHYXZpYSBwYWNpZmljYVwiPlBhY2lmaWMgTG9vbi48L1NwZWNpZXM+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9XCJHYXZpYSBpbW1lclwiPkNvbW1vbiBMb29uLjwvU3BlY2llcz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT1cIkdhdmlhIGFkYW1zaWlcIj5ZZWxsb3ctYmlsbGVkIExvb24uPC9TcGVjaWVzPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICA8L0ZhbWlseT5cbiIKKyAgICAgICAgICAgICsgIiAgICA8L09yZGVyPlxuIgorICAgICAgICAgICAgKyAiICAgIDxPcmRlciBOYW1lPVwiUE9ESUNJUEVESUZPUk1FU1wiPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICA8RmFtaWx5IE5hbWU9XCJQT0RJQ0lQRURJREFFXCI+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9XCJUYWNoeWJhcHR1cyBkb21pbmljdXNcIj5MZWFzdCBHcmViZS48L1NwZWNpZXM+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9XCJQb2RpbHltYnVzIHBvZGljZXBzXCI+UGllZC1iaWxsZWQgR3JlYmUuPC9TcGVjaWVzPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPVwiXCI+QXRpdGxhbiBHcmViZS48L1NwZWNpZXM+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9XCJcIj5Ib3JuZWQgR3JlYmUuPC9TcGVjaWVzPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICAgICAgPFNwZWNpZXMgU2NpZW50aWZpY19OYW1lPVwiXCI+UmVkLW5lY2tlZCBHcmViZS48L1NwZWNpZXM+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9XCJcIj5FYXJlZCBHcmViZS48L1NwZWNpZXM+XG4iCisgICAgICAgICAgICArICIgICAgICAgICAgICA8U3BlY2llcyBTY2llbnRpZmljX05hbWU9XCJcIj5XZXN0ZXJuIEdyZWJlLjwvU3BlY2llcz5cbiIKKyAgICAgICAgICAgICsgIiAgICAgICAgICAgIDxTcGVjaWVzIFNjaWVudGlmaWNfTmFtZT1cIlwiPkNsYXJrJ3MgR3JlYmUuPC9TcGVjaWVzPlxuIgorICAgICAgICAgICAgKyAiICAgICAgICA8L0ZhbWlseT5cbiIKKyAgICAgICAgICAgICsgIiAgICA8L09yZGVyPlxuIgorICAgICAgICAgICAgKyAiPC9DbGFzcz5cbiIKKyAgICAgICAgICAgIDsKKyAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBkYmYgPQorICAgICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGRiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKworICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPSBkYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9CisgICAgICAgICAgICBkYi5wYXJzZShuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbSh0cmFuc2Zvcm1TdHIuZ2V0Qnl0ZXMoKSkpOworCisgICAgICAgIFRyYW5zZm9ybXMgdCA9IG5ldyBUcmFuc2Zvcm1zKGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwgIm1lbW9yeTovLyIpOworICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCByZXN1bHQgPQorICAgICAgICAgICAgdC5wZXJmb3JtVHJhbnNmb3JtcyhuZXcgWE1MU2lnbmF0dXJlSW5wdXQoaW5wdXRTdHIuZ2V0Qnl0ZXMoKSkpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgU3RyaW5nKHJlc3VsdC5nZXRCeXRlcygpKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdXRpbHMvQmFzZTY0U2FtcGxlLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdXRpbHMvQmFzZTY0U2FtcGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZmMGJmOAotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy91dGlscy9CYXNlNjRTYW1wbGUuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCisgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgorICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCisgKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQorICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucworICogdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2FtcGxlcy51dGlsczsKKworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5jMTRuLkNhbm9uaWNhbGl6ZXI7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKKworLyoqCisgKiBTYW1wbGUgdXNhZ2UgZm9yIEJhc2U2NCBjbGFzcworICoKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqLworcHVibGljIGNsYXNzIEJhc2U2NFNhbXBsZSB7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgbWFpbgorICAgICAqCisgICAgICogQHBhcmFtIHVudXNlZAorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gdW51c2VkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBkYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5uZXdEb2N1bWVudCgpOworICAgICAgICBCaWdJbnRlZ2VyIGJpID0KKyAgICAgICAgICAgIG5ldyBCaWdJbnRlZ2VyKCI0MzI2ODc0MzI2NzQ2MzI2NDE2OTIzNjMyODY0ODczMjY5NDE2Nzg2MiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjM0OTYxMzI3ODY0ODczMjE2NDk4NjEzMjg0OTc2MTMyOTU0MzU0MyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjg3NDYxODMyNzk2NDg5NzE2NDgyMzY5ODQxNjIzNjM0NTQzNTQzNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQ5MTgyMzY0ODkxMzI2ODQ5NjIxODk3NDY5ODEyNjQ5ODcxMjY5OCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQyNjg2MTQzMjg5MjM0MzI0MjM0MzI0MzI0MjM0MjM0MjM1NDM1NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjM0OTYxMzI3ODY0ODczMjE2NDk4NjEzMjg0OTc2MTMyOTU0MzU0MyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjg3NDYxODMyNzk2NDg5NzE2NDgyMzY5ODQxNjIzNjM0NTQzNTQzNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQ5MTgyMzY0ODkxMzI2ODQ5NjIxODk3NDY5ODEyNjQ5ODcxMjY5OCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQyNjg2MTQzMjg5MjM0MzI0MjM0MzI0MzI0MjM0MjM0MjM1NDM1NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjM0OTYxMzI3ODY0ODczMjE2NDk4NjEzMjg0OTc2MTMyOTU0MzU0MyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjg3NDYxODMyNzk2NDg5NzE2NDgyMzY5ODQxNjIzNjM0NTQzNTQzNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQ5MTgyMzY0ODkxMzI2ODQ5NjIxODk3NDY5ODEyNjQ5ODcxMjY5OCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQyNjg2MTQzMjg5MjM0MzI0MjM0MzI0MzI0MjM0MjM0MjM1NDM1NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjM0OTYxMzI3ODY0ODczMjE2NDk4NjEzMjg0OTc2MTMyOTU0MzU0MyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjg3NDYxODMyNzk2NDg5NzE2NDgyMzY5ODQxNjIzNjM0NTQzNTQzNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQ5MTgyMzY0ODkxMzI2ODQ5NjIxODk3NDY5ODEyNjQ5ODcxMjY5OCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQyNjg2MTQzMjg5MjM0MzI0MjM0MzI0MzI0MjM0MjM0MjM1NDM1NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjM0OTYxMzI3ODY0ODczMjE2NDk4NjEzMjg0OTc2MTMyOTU0MzU0MyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjg3NDYxODMyNzk2NDg5NzE2NDgyMzY5ODQxNjIzNjM0NTQzNTQzNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQ5MTgyMzY0ODkxMzI2ODQ5NjIxODk3NDY5ODEyNjQ5ODcxMjY5OCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjQyNjg2MTQzMjg5MjM0MzI0MjM0MzI0MzI0MjM0MjM0MjM1NDM1NCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjMyNDY4NzQ2MjE0OTY4MjkxMzYiKTsKKworICAgICAgICBUZXh0IGJhc2U2NHRleHQgPSBkb2MuY3JlYXRlVGV4dE5vZGUoQmFzZTY0LmVuY29kZShiaSkpOworICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2MuY3JlYXRlRWxlbWVudE5TKG51bGwsICJCYXNlNjQiKTsKKworICAgICAgICBkb2MuYXBwZW5kQ2hpbGQocm9vdCk7CisgICAgICAgIHJvb3QuYXBwZW5kQ2hpbGQoYmFzZTY0dGV4dCk7CisKKyAgICAgICAgQ2Fub25pY2FsaXplciBjMTRuID0KKyAgICAgICAgICAgIENhbm9uaWNhbGl6ZXIuZ2V0SW5zdGFuY2UoQ2Fub25pY2FsaXplci5BTEdPX0lEX0MxNE5fV0lUSF9DT01NRU5UUyk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG5ldyBTdHJpbmcoYzE0bi5jYW5vbmljYWxpemVTdWJ0cmVlKGRvYykpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdXRpbHMvcmVzb2x2ZXIvT2ZmbGluZVJlc29sdmVyLmphdmEgYi9zYW1wbGVzL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NhbXBsZXMvdXRpbHMvcmVzb2x2ZXIvT2ZmbGluZVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzNTkzYwotLS0gL2Rldi9udWxsCisrKyBiL3NhbXBsZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy91dGlscy9yZXNvbHZlci9PZmZsaW5lUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoqCisgKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCisgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gU2VlIHRoZSBOT1RJQ0UgZmlsZQorICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQorICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQorICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQorICogd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNhbXBsZXMudXRpbHMucmVzb2x2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLlhNTFNpZ25hdHVyZUlucHV0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLnJlc29sdmVyLlJlc291cmNlUmVzb2x2ZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMucmVzb2x2ZXIuUmVzb3VyY2VSZXNvbHZlclNwaTsKK2ltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworCisvKioKKyAqIFRoaXMgY2xhc3MgaGVscHMgdXMgaG9tZSB1c2VycyB0byByZXNvbHZlIGh0dHAgVVJJcyB3aXRob3V0IGEgbmV0d29yaworICogY29ubmVjdGlvbgorICoKKyAqIEBhdXRob3IgJEF1dGhvciQKKyAqLworcHVibGljIGNsYXNzIE9mZmxpbmVSZXNvbHZlciBleHRlbmRzIFJlc291cmNlUmVzb2x2ZXJTcGkgeworCisgICAgc3RhdGljIG9yZy5zbGY0ai5Mb2dnZXIgbG9nID0KKyAgICAgICAgb3JnLnNsZjRqLkxvZ2dlckZhY3RvcnkuZ2V0TG9nZ2VyKE9mZmxpbmVSZXNvbHZlci5jbGFzcyk7CisKKyAgICAvKiogRmllbGQgX3VyaU1hcCAqLworICAgIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IF91cmlNYXAgPSBudWxsOworCisgICAgLyoqIEZpZWxkIF9taW1lTWFwICovCisgICAgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gX21pbWVNYXAgPSBudWxsOworCisgICAgc3RhdGljIHsKKyAgICAgICAgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdC5pbml0KCk7CisKKyAgICAgICAgT2ZmbGluZVJlc29sdmVyLl91cmlNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgT2ZmbGluZVJlc29sdmVyLl9taW1lTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgICAgICAgT2ZmbGluZVJlc29sdmVyLnJlZ2lzdGVyKCJodHRwOi8vd3d3LnczLm9yZy9UUi94bWwtc3R5bGVzaGVldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlcy9kYXRhL29yZy93M2Mvd3d3L1RSL3htbC1zdHlsZXNoZWV0Lmh0bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHQvaHRtbCIpOworICAgICAgICBPZmZsaW5lUmVzb2x2ZXIucmVnaXN0ZXIoImh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLXhtbC0yMDAwMTAwNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlcy9kYXRhL29yZy93M2Mvd3d3L1RSLzIwMDAvUkVDLXhtbC0yMDAwMTAwNiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dC94bWwiKTsKKyAgICAgICAgT2ZmbGluZVJlc29sdmVyLnJlZ2lzdGVyKCJodHRwOi8vd3d3Lm51ZS5ldC1pbmYudW5pLXNpZWdlbi5kZS9pbmRleC5odG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYW1wbGVzL2RhdGEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVtcC9udWVob21lcGFnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dC9odG1sIik7CisgICAgICAgIE9mZmxpbmVSZXNvbHZlci5yZWdpc3RlcigiaHR0cDovL3d3dy5udWUuZXQtaW5mLnVuaS1zaWVnZW4uZGUvfmdldWVyLXBvbGxtYW5uL2lkMi54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZXMvZGF0YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZW1wL2lkMi54bWwiLCAidGV4dC94bWwiKTsKKyAgICAgICAgT2ZmbGluZVJlc29sdmVyLnJlZ2lzdGVyKCJodHRwOi8veG1sZHNpZy5wb3Rob2xlLmNvbS94bWwtc3R5bGVzaGVldC50eHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNhbXBsZXMvZGF0YS9jb20vcG90aG9sZS94bWxkc2lnL3htbC1zdHlsZXNoZWV0LnR4dCIsICJ0ZXh0L3htbCIpOworICAgICAgICBPZmZsaW5lUmVzb2x2ZXIucmVnaXN0ZXIoImh0dHA6Ly93d3cudzMub3JnL1NpZ25hdHVyZS8yMDAyLzA0L3htbC1zdHlsZXNoZWV0LmI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2FtcGxlcy9kYXRhL2llL2JhbHRpbW9yZS9tZXJsaW4tZXhhbXBsZXMvbWVybGluLXhtbGRzaWctdHdlbnR5LXRocmVlL3htbC1zdHlsZXNoZWV0LmI2NCIsICJ0ZXh0L3BsYWluIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGVuZ2luZVJlc29sdmUKKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkKKyAgICAgKiBAcGFyYW0gQmFzZVVSSQorICAgICAqCisgICAgICogQHRocm93cyBSZXNvdXJjZVJlc29sdmVyRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFhNTFNpZ25hdHVyZUlucHV0IGVuZ2luZVJlc29sdmUoQXR0ciB1cmksIFN0cmluZyBCYXNlVVJJKQorICAgICAgICB0aHJvd3MgUmVzb3VyY2VSZXNvbHZlckV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmcgVVJJID0gdXJpLmdldE5vZGVWYWx1ZSgpOworCisgICAgICAgICAgICBpZiAoT2ZmbGluZVJlc29sdmVyLl91cmlNYXAuY29udGFpbnNLZXkoVVJJKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVUkkgPSBPZmZsaW5lUmVzb2x2ZXIuX3VyaU1hcC5nZXQoVVJJKTsKKworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiTWFwcGVkICIgKyBVUkkgKyAiIHRvICIgKyBuZXdVUkkpOworCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ld1VSSSk7CisKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkF2YWlsYWJsZSBieXRlcyA9ICIgKyBpcy5hdmFpbGFibGUoKSk7CisKKyAgICAgICAgICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCByZXN1bHQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoaXMpOworCisgICAgICAgICAgICAgICAgLy8gWE1MU2lnbmF0dXJlSW5wdXQgcmVzdWx0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICByZXN1bHQuc2V0U291cmNlVVJJKFVSSSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnNldE1JTUVUeXBlKChTdHJpbmcpIE9mZmxpbmVSZXNvbHZlci5fbWltZU1hcC5nZXQoVVJJKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZXhBcmdzW10gPSB7IlRoZSBVUkkgIiArIFVSSSArICIgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG9mZmxpbmUgd29yayJ9OworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlUmVzb2x2ZXJFeGNlcHRpb24oImdlbmVyaWMuRW1wdHlNZXNzYWdlIiwgZXhBcmdzLCB1cmksIEJhc2VVUkkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlUmVzb2x2ZXJFeGNlcHRpb24oImdlbmVyaWMuRW1wdHlNZXNzYWdlIiwgZXgsIHVyaSwgQmFzZVVSSSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXZSByZXNvbHZlIGh0dHAgVVJJcyA8ST53aXRob3V0PC9JPiBmcmFnbWVudC4uLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaQorICAgICAqIEBwYXJhbSBCYXNlVVJJCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlbmdpbmVDYW5SZXNvbHZlKEF0dHIgdXJpLCBTdHJpbmcgQmFzZVVSSSkgeworCisgICAgICAgIFN0cmluZyB1cmlOb2RlVmFsdWUgPSB1cmkuZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgIGlmICh1cmlOb2RlVmFsdWUuZXF1YWxzKCIiKSB8fCB1cmlOb2RlVmFsdWUuc3RhcnRzV2l0aCgiIyIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVVJJIHVyaU5ldyA9IGdldE5ld1VSSSh1cmkuZ2V0Tm9kZVZhbHVlKCksIEJhc2VVUkkpOworICAgICAgICAgICAgaWYgKHVyaU5ldy5nZXRTY2hlbWUoKS5lcXVhbHMoImh0dHAiKSkgeworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiSSBzdGF0ZSB0aGF0IEkgY2FuIHJlc29sdmUgIiArIHVyaU5ldy50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbG9nLmRlYnVnKCJJIHN0YXRlIHRoYXQgSSBjYW4ndCByZXNvbHZlICIgKyB1cmlOZXcudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgcmVnaXN0ZXIKKyAgICAgKgorICAgICAqIEBwYXJhbSBVUkkKKyAgICAgKiBAcGFyYW0gZmlsZW5hbWUKKyAgICAgKiBAcGFyYW0gTUlNRQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcmVnaXN0ZXIoU3RyaW5nIFVSSSwgU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgTUlNRSkgeworICAgICAgICBPZmZsaW5lUmVzb2x2ZXIuX3VyaU1hcC5wdXQoVVJJLCBmaWxlbmFtZSk7CisgICAgICAgIE9mZmxpbmVSZXNvbHZlci5fbWltZU1hcC5wdXQoVVJJLCBNSU1FKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVUkkgZ2V0TmV3VVJJKFN0cmluZyB1cmksIFN0cmluZyBiYXNlVVJJKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgVVJJIG5ld1VyaSA9IG51bGw7CisgICAgICAgIGlmIChiYXNlVVJJID09IG51bGwgfHwgIiIuZXF1YWxzKGJhc2VVUkkpKSB7CisgICAgICAgICAgICBuZXdVcmkgPSBuZXcgVVJJKHVyaSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdVcmkgPSBuZXcgVVJJKGJhc2VVUkkpLnJlc29sdmUodXJpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIHRoZSBVUkkgY29udGFpbnMgYSBmcmFnbWVudCwgaWdub3JlIGl0CisgICAgICAgIGlmIChuZXdVcmkuZ2V0RnJhZ21lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBVUkkgdXJpTmV3Tm9GcmFnID0KKyAgICAgICAgICAgICAgICBuZXcgVVJJKG5ld1VyaS5nZXRTY2hlbWUoKSwgbmV3VXJpLmdldFNjaGVtZVNwZWNpZmljUGFydCgpLCBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiB1cmlOZXdOb0ZyYWc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld1VyaTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01LZXlWYWx1ZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NS2V5VmFsdWUuamF2YQppbmRleCA0NjQwOTYzLi40YTQxOTNjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01LZXlWYWx1ZS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTUtleVZhbHVlLmphdmEKQEAgLTQ5LDEwICs0OSwxMCBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5LZXlTcGVjOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5SU0FQdWJsaWNLZXlTcGVjOwogaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkJhc2U2NDsKIAotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZXhjZXB0aW9ucy5CYXNlNjREZWNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5CYXNlNjQ7CiAKIC8qKgogICogRE9NLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIEtleVZhbHVlLgpAQCAtMTYwLDcgKzE2MCw3IEBACiAgICAgcHVibGljIHN0YXRpYyBCaWdJbnRlZ2VyIGRlY29kZShFbGVtZW50IGVsZW0pIHRocm93cyBNYXJzaGFsRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIFN0cmluZyBiYXNlNjRzdHIgPSBCYXNlU3RydWN0dXJlLnRleHRPZk5vZGUoZWxlbSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoMSwgQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGJhc2U2NHN0cikpOworICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGVCaWdJbnRlZ2VyRnJvbVN0cmluZyhiYXNlNjRzdHIpOwogICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKGV4KTsKICAgICAgICAgfQpAQCAtMTY5LDEzICsxNjksMTEgQEAKICAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVCYXNlNjRCaWdJbnRlZ2VyRWxlbWVudCgKICAgICAgICAgWG1sV3JpdGVyIHh3cml0ZXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZyBsb2NhbE5hbWUsIFN0cmluZyBuYW1lc3BhY2VVUkksIEJpZ0ludGVnZXIgdmFsdWUKICAgICApIHsKLSAgICAgICAgYnl0ZVtdIGJ5dGVzID0gWE1MVXRpbHMuZ2V0Qnl0ZXModmFsdWUsIHZhbHVlLmJpdExlbmd0aCgpKTsKLSAgICAgICAgeHdyaXRlci53cml0ZVRleHRFbGVtZW50KHByZWZpeCwgbG9jYWxOYW1lLCBuYW1lc3BhY2VVUkksIEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGJ5dGVzKSk7CisgICAgICAgIHh3cml0ZXIud3JpdGVUZXh0RWxlbWVudChwcmVmaXgsIGxvY2FsTmFtZSwgbmFtZXNwYWNlVVJJLCBCYXNlNjQuZW5jb2RlKHZhbHVlKSk7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcnNoYWwoWG1sV3JpdGVyIHh3cml0ZXIsIEJpZ0ludGVnZXIgYmlnTnVtKSB7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IFhNTFV0aWxzLmdldEJ5dGVzKGJpZ051bSwgYmlnTnVtLmJpdExlbmd0aCgpKTsKLSAgICAgICAgeHdyaXRlci53cml0ZUNoYXJhY3RlcnMoQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoYnl0ZXMpKTsKKyAgICAgICAgeHdyaXRlci53cml0ZUNoYXJhY3RlcnMoQmFzZTY0LmVuY29kZShiaWdOdW0pKTsKICAgICB9CiAKICAgICBAT3ZlcnJpZGUKQEAgLTQ3NCw3ICs0NzIsNyBAQAogICAgICAgICAgICAgeHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKIAogICAgICAgICAgICAgeHdyaXRlci53cml0ZVN0YXJ0RWxlbWVudChwcmVmaXgsICJQdWJsaWNLZXkiLCBYTUxEU0lHXzExX1hNTE5TKTsKLSAgICAgICAgICAgIFN0cmluZyBlbmNvZGVkID0gQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoZWNQdWJsaWNLZXkpOworICAgICAgICAgICAgU3RyaW5nIGVuY29kZWQgPSBCYXNlNjQuZW5jb2RlKGVjUHVibGljS2V5KTsKICAgICAgICAgICAgIHh3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKGVuY29kZWQpOwogICAgICAgICAgICAgeHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsgLy8gIlB1YmxpY0tleSIKICAgICAgICAgICAgIHh3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7IC8vICJFQ0tleVZhbHVlIgpAQCAtNTIyLDkgKzUyMCwxMCBAQAogICAgICAgICAgICAgRUNQb2ludCBlY1BvaW50ID0gbnVsbDsKIAogICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgY29udGVudCA9IFhNTFV0aWxzLmdldEZ1bGxUZXh0Q2hpbGRyZW5Gcm9tRWxlbWVudChjdXJFbGVtKTsKLSAgICAgICAgICAgICAgICBlY1BvaW50ID0gZGVjb2RlUG9pbnQoQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQpLAorICAgICAgICAgICAgICAgIGVjUG9pbnQgPSBkZWNvZGVQb2ludChCYXNlNjQuZGVjb2RlKGN1ckVsZW0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY1BhcmFtcy5nZXRDdXJ2ZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJhc2U2NERlY29kaW5nRXhjZXB0aW9uIGJkZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJJbnZhbGlkIEVDIFB1YmxpY0tleSIsIGJkZSk7CiAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiSW52YWxpZCBFQyBQb2ludCIsIGlvZSk7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01QR1BEYXRhLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01QR1BEYXRhLmphdmEKaW5kZXggMGExNWNmZi4uNTA2NmUwNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NUEdQRGF0YS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTVBHUERhdGEuamF2YQpAQCAtMzIsOCArMzIsOCBAQAogCiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZXhjZXB0aW9ucy5CYXNlNjREZWNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5CYXNlNjQ7CiAKIC8qKgogICogRE9NLWJhc2VkIGltcGxlbWVudGF0aW9uIG9mIFBHUERhdGEuCkBAIC0xNTEsMTUgKzE1MSwxNyBAQAogICAgICAgICAgICAgICAgIEVsZW1lbnQgY2hpbGRFbGVtID0gKEVsZW1lbnQpZmlyc3RDaGlsZDsKICAgICAgICAgICAgICAgICBTdHJpbmcgbG9jYWxOYW1lID0gY2hpbGRFbGVtLmdldExvY2FsTmFtZSgpOwogICAgICAgICAgICAgICAgIFN0cmluZyBuYW1lc3BhY2UgPSBjaGlsZEVsZW0uZ2V0TmFtZXNwYWNlVVJJKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoIlBHUEtleUlEIikgJiYgWE1MU2lnbmF0dXJlLlhNTE5TLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gWE1MVXRpbHMuZ2V0RnVsbFRleHRDaGlsZHJlbkZyb21FbGVtZW50KGNoaWxkRWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIHBncEtleUlkID0gQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxOYW1lLmVxdWFscygiUEdQS2V5UGFja2V0IikgJiYgWE1MU2lnbmF0dXJlLlhNTE5TLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gWE1MVXRpbHMuZ2V0RnVsbFRleHRDaGlsZHJlbkZyb21FbGVtZW50KGNoaWxkRWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIHBncEtleVBhY2tldCA9IEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZShjb250ZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdGhlci5hZGQKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBqYXZheC54bWwuY3J5cHRvLmRvbS5ET01TdHJ1Y3R1cmUoY2hpbGRFbGVtKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvY2FsTmFtZS5lcXVhbHMoIlBHUEtleUlEIikgJiYgWE1MU2lnbmF0dXJlLlhNTE5TLmVxdWFscyhuYW1lc3BhY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwZ3BLZXlJZCA9IEJhc2U2NC5kZWNvZGUoY2hpbGRFbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKCJQR1BLZXlQYWNrZXQiKSAmJiBYTUxTaWduYXR1cmUuWE1MTlMuZXF1YWxzKG5hbWVzcGFjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBncEtleVBhY2tldCA9IEJhc2U2NC5kZWNvZGUoY2hpbGRFbGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmFkZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgamF2YXgueG1sLmNyeXB0by5kb20uRE9NU3RydWN0dXJlKGNoaWxkRWxlbSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoQmFzZTY0RGVjb2RpbmdFeGNlcHRpb24gYmRlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKGJkZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZmlyc3RDaGlsZCA9IGZpcnN0Q2hpbGQuZ2V0TmV4dFNpYmxpbmcoKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTVJlZmVyZW5jZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NUmVmZXJlbmNlLmphdmEKaW5kZXggMDFmNTU5Yi4uNGUzYWUwZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NUmVmZXJlbmNlLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NUmVmZXJlbmNlLmphdmEKQEAgLTQ0LDEyICs0NCwxMSBAQAogaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7Ci0KIGltcG9ydCBvcmcuYXBhY2hlLmpjcC54bWwuZHNpZy5pbnRlcm5hbC5EaWdlc3Rlck91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5hbGdvcml0aG1zLk1lc3NhZ2VEaWdlc3RBbGdvcml0aG07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZXhjZXB0aW9ucy5CYXNlNjREZWNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlVuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtOwogCiAvKioKQEAgLTI0NCw5ICsyNDMsMTIgQEAKIAogICAgICAgICAvLyB1bm1hcnNoYWwgRGlnZXN0VmFsdWUKICAgICAgICAgRWxlbWVudCBkdkVsZW0gPSBET01VdGlscy5nZXROZXh0U2libGluZ0VsZW1lbnQoZG1FbGVtLCAiRGlnZXN0VmFsdWUiLCBYTUxTaWduYXR1cmUuWE1MTlMpOwotICAgICAgICBTdHJpbmcgY29udGVudCA9IFhNTFV0aWxzLmdldEZ1bGxUZXh0Q2hpbGRyZW5Gcm9tRWxlbWVudChkdkVsZW0pOwotICAgICAgICB0aGlzLmRpZ2VzdFZhbHVlID0gQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQpOwotICAgICAgICAKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRoaXMuZGlnZXN0VmFsdWUgPSBCYXNlNjQuZGVjb2RlKGR2RWxlbSk7CisgICAgICAgIH0gY2F0Y2ggKEJhc2U2NERlY29kaW5nRXhjZXB0aW9uIGJkZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oYmRlKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIGNoZWNrIGZvciBleHRyYSBlbGVtZW50cwogICAgICAgICBpZiAoRE9NVXRpbHMuZ2V0TmV4dFNpYmxpbmdFbGVtZW50KGR2RWxlbSkgIT0gbnVsbCkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oCkBAIC0zMzYsNyArMzM4LDcgQEAKICAgICAgICAgfQogICAgICAgICB4d3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KGRzUHJlZml4LCAiRGlnZXN0VmFsdWUiLCBYTUxTaWduYXR1cmUuWE1MTlMpOwogICAgICAgICBpZiAoZGlnZXN0VmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgeHdyaXRlci53cml0ZUNoYXJhY3RlcnMoQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoZGlnZXN0VmFsdWUpKTsKKyAgICAgICAgICAgIHh3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKEJhc2U2NC5lbmNvZGUoZGlnZXN0VmFsdWUpKTsKICAgICAgICAgfQogICAgICAgICB4d3JpdGVyLndyaXRlRW5kRWxlbWVudCgpOyAvLyAiRGlnZXN0VmFsdWUiCiAgICAgICAgIHh3cml0ZXIud3JpdGVFbmRFbGVtZW50KCk7IC8vICJSZWZlcmVuY2UiCkBAIC0zNTQsNyArMzU2LDcgQEAKICAgICAgICAgZGlnZXN0VmFsdWUgPSB0cmFuc2Zvcm0oZGF0YSwgc2lnbkNvbnRleHQpOwogCiAgICAgICAgIC8vIGluc2VydCBkaWdlc3RWYWx1ZSBpbnRvIERpZ2VzdFZhbHVlIGVsZW1lbnQKLSAgICAgICAgU3RyaW5nIGVuY29kZWREViA9IEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGRpZ2VzdFZhbHVlKTsKKyAgICAgICAgU3RyaW5nIGVuY29kZWREViA9IEJhc2U2NC5lbmNvZGUoZGlnZXN0VmFsdWUpOwogICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUmVmZXJlbmNlIG9iamVjdCB1cmkgPSAiICsgdXJpKTsKICAgICAgICAgfQpAQCAtMzg2LDggKzM4OCw4IEBACiAgICAgICAgIGNhbGNEaWdlc3RWYWx1ZSA9IHRyYW5zZm9ybShkYXRhLCB2YWxpZGF0ZUNvbnRleHQpOwogCiAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgbG9nLmRlYnVnKCJFeHBlY3RlZCBkaWdlc3Q6ICIgKyBCYXNlNjQuZ2V0TWltZUVuY29kZXIoKS5lbmNvZGVUb1N0cmluZyhkaWdlc3RWYWx1ZSkpOwotICAgICAgICAgICAgbG9nLmRlYnVnKCJBY3R1YWwgZGlnZXN0OiAiICsgQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoY2FsY0RpZ2VzdFZhbHVlKSk7CisgICAgICAgICAgICBsb2cuZGVidWcoIkV4cGVjdGVkIGRpZ2VzdDogIiArIEJhc2U2NC5lbmNvZGUoZGlnZXN0VmFsdWUpKTsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiQWN0dWFsIGRpZ2VzdDogIiArIEJhc2U2NC5lbmNvZGUoY2FsY0RpZ2VzdFZhbHVlKSk7CiAgICAgICAgIH0KIAogICAgICAgICB2YWxpZGF0aW9uU3RhdHVzID0gQXJyYXlzLmVxdWFscyhkaWdlc3RWYWx1ZSwgY2FsY0RpZ2VzdFZhbHVlKTsKQEAgLTQ1MCw4ICs0NTIsMTAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGRvcyA9IG5ldyBEaWdlc3Rlck91dHB1dFN0cmVhbShtZCk7CiAgICAgICAgIH0KKyAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbnVsbDsKICAgICAgICAgRGF0YSBkYXRhID0gZGVyZWZlcmVuY2VkRGF0YTsKLSAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW0gb3MgPSBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oZG9zKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3MgPSBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oZG9zKTsKICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gdHJhbnNmb3Jtcy5zaXplKCk7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgICAgICAgICBET01UcmFuc2Zvcm0gdHJhbnNmb3JtID0gKERPTVRyYW5zZm9ybSl0cmFuc2Zvcm1zLmdldChpKTsKICAgICAgICAgICAgICAgICBpZiAoaSA8IHNpemUgLSAxKSB7CkBAIC01NTMsNiArNTU3LDEzIEBACiAgICAgICAgIH0gY2F0Y2ggKG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmMxNG4uQ2Fub25pY2FsaXphdGlvbkV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU2lnbmF0dXJlRXhjZXB0aW9uKGUpOwogICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKG9zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFNpZ25hdHVyZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZG9zICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICBkb3MuY2xvc2UoKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTVJldHJpZXZhbE1ldGhvZC5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NUmV0cmlldmFsTWV0aG9kLmphdmEKaW5kZXggZTcyZDgxMi4uMjViYjEwZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NUmV0cmlldmFsTWV0aG9kLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NUmV0cmlldmFsTWV0aG9kLmphdmEKQEAgLTMyLDcgKzMyLDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5qY3AueG1sLmRzaWcuaW50ZXJuYWwuZG9tOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubmV0LlVSSTsKIGltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcm92aWRlcjsKQEAgLTI2OSwxMCArMjY4LDExIEBACiAgICAgewogICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZGIgPSBudWxsOwogICAgICAgICBib29sZWFuIHNlY1ZhbCA9IFV0aWxzLnNlY3VyZVZhbGlkYXRpb24oY29udGV4dCk7Ci0gICAgICAgIEFwYWNoZURhdGEgZGF0YSA9IChBcGFjaGVEYXRhKWRlcmVmZXJlbmNlKGNvbnRleHQpOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEuZ2V0WE1MU2lnbmF0dXJlSW5wdXQoKS5nZXRCeXRlcygpKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXBhY2hlRGF0YSBkYXRhID0gKEFwYWNoZURhdGEpZGVyZWZlcmVuY2UoY29udGV4dCk7CiAgICAgICAgICAgICBkYiA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSwgc2VjVmFsKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKGlzKTsKKyAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbQorICAgICAgICAgICAgICAgIChkYXRhLmdldFhNTFNpZ25hdHVyZUlucHV0KCkuZ2V0Qnl0ZXMoKSkpOwogICAgICAgICAgICAgRWxlbWVudCBraUVsZW0gPSBkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CiAgICAgICAgICAgICBpZiAoa2lFbGVtLmdldExvY2FsTmFtZSgpLmVxdWFscygiWDUwOURhdGEiKQogICAgICAgICAgICAgICAgICYmIFhNTFNpZ25hdHVyZS5YTUxOUy5lcXVhbHMoa2lFbGVtLmdldE5hbWVzcGFjZVVSSSgpKSkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NU2lnbmF0dXJlTWV0aG9kLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01TaWduYXR1cmVNZXRob2QuamF2YQppbmRleCBmNTI0ZThjLi42NGRmMGRjIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01TaWduYXR1cmVNZXRob2QuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01TaWduYXR1cmVNZXRob2QuamF2YQpAQCAtMjI0LDEwICsyMjQsOSBAQAogICAgICAgICAgICAgbG9nLmRlYnVnKCJKQ0EgQWxnb3JpdGhtOiAiICsgZ2V0SkNBQWxnb3JpdGhtKCkpOwogICAgICAgICAgICAgbG9nLmRlYnVnKCJTaWduYXR1cmUgQnl0ZXMgbGVuZ3RoOiAiICsgc2lnLmxlbmd0aCk7CiAgICAgICAgIH0KKyAgICAgICAgc2kuY2Fub25pY2FsaXplKGNvbnRleHQsIG5ldyBTaWduZXJPdXRwdXRTdHJlYW0oc2lnbmF0dXJlKSk7CiAKLSAgICAgICAgdHJ5IChTaWduZXJPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IFNpZ25lck91dHB1dFN0cmVhbShzaWduYXR1cmUpKSB7Ci0gICAgICAgICAgICBzaS5jYW5vbmljYWxpemUoY29udGV4dCwgb3V0cHV0U3RyZWFtKTsKLSAgICAgICAgICAgIAorICAgICAgICB0cnkgewogICAgICAgICAgICAgVHlwZSB0eXBlID0gZ2V0QWxnb3JpdGhtVHlwZSgpOwogICAgICAgICAgICAgaWYgKHR5cGUgPT0gVHlwZS5EU0EpIHsKICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9ICgoRFNBS2V5KWtleSkuZ2V0UGFyYW1zKCkuZ2V0USgpLmJpdExlbmd0aCgpOwpAQCAtMjcyLDkgKzI3MSw5IEBACiAgICAgICAgICAgICBsb2cuZGVidWcoIkpDQSBBbGdvcml0aG06ICIgKyBnZXRKQ0FBbGdvcml0aG0oKSk7CiAgICAgICAgIH0KIAotICAgICAgICB0cnkgKFNpZ25lck91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgU2lnbmVyT3V0cHV0U3RyZWFtKHNpZ25hdHVyZSkpIHsKLSAgICAgICAgICAgIHNpLmNhbm9uaWNhbGl6ZShjb250ZXh0LCBvdXRwdXRTdHJlYW0pOwotICAgICAgICAgICAgCisgICAgICAgIHNpLmNhbm9uaWNhbGl6ZShjb250ZXh0LCBuZXcgU2lnbmVyT3V0cHV0U3RyZWFtKHNpZ25hdHVyZSkpOworCisgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBUeXBlIHR5cGUgPSBnZXRBbGdvcml0aG1UeXBlKCk7CiAgICAgICAgICAgICBpZiAodHlwZSA9PSBUeXBlLkRTQSkgewogICAgICAgICAgICAgICAgIGludCBzaXplID0gKChEU0FLZXkpa2V5KS5nZXRQYXJhbXMoKS5nZXRRKCkuYml0TGVuZ3RoKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01TaWduZWRJbmZvLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01TaWduZWRJbmZvLmphdmEKaW5kZXggNTVjNmY2ZC4uNjUyMjgzNyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NU2lnbmVkSW5mby5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTVNpZ25lZEluZm8uamF2YQpAQCAtMzYsNiArMzYsNyBAQAogaW1wb3J0IGphdmEudXRpbC4qOwogCiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5CYXNlNjQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlVuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtOwogCkBAIC0yMTYsMzEgKzIxNyw0MiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJjb250ZXh0IGNhbm5vdCBiZSBudWxsIik7CiAgICAgICAgIH0KIAorICAgICAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm9zKTsKKwogICAgICAgICBET01TdWJUcmVlRGF0YSBzdWJUcmVlID0gbmV3IERPTVN1YlRyZWVEYXRhKGxvY2FsU2lFbGVtLCB0cnVlKTsKLSAgICAgICAgdHJ5IChPdXRwdXRTdHJlYW0gb3MgPSBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oYm9zKSkgeworICAgICAgICB0cnkgewogICAgICAgICAgICAgKChET01DYW5vbmljYWxpemF0aW9uTWV0aG9kKQogICAgICAgICAgICAgICAgIGNhbm9uaWNhbGl6YXRpb25NZXRob2QpLmNhbm9uaWNhbGl6ZShzdWJUcmVlLCBjb250ZXh0LCBvcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIG9zLmZsdXNoKCk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGJ5dGVbXSBzaWduZWRJbmZvQnl0ZXMgPSBib3MudG9CeXRlQXJyYXkoKTsKLQotICAgICAgICAgICAgLy8gdGhpcyB3aG9sZSBibG9jayBzaG91bGQgb25seSBiZSBkb25lIGlmIGxvZ2dpbmcgaXMgZW5hYmxlZAotICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYW5vbmljYWxpemVkIFNpZ25lZEluZm86Iik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHNpZ25lZEluZm9CeXRlcy5sZW5ndGgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2lnbmVkSW5mb0J5dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcilzaWduZWRJbmZvQnl0ZXNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2cuZGVidWcoc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJEYXRhIHRvIGJlIHNpZ25lZC92ZXJpZmllZDoiICsgQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoc2lnbmVkSW5mb0J5dGVzKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRoaXMuY2Fub25EYXRhID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNpZ25lZEluZm9CeXRlcyk7Ci0KLSAgICAgICAgICAgIG9zLmNsb3NlKCk7CiAgICAgICAgIH0gY2F0Y2ggKFRyYW5zZm9ybUV4Y2VwdGlvbiB0ZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFNpZ25hdHVyZUV4Y2VwdGlvbih0ZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3MuZmx1c2goKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEltcG9zc2libGUKKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBzaWduZWRJbmZvQnl0ZXMgPSBib3MudG9CeXRlQXJyYXkoKTsKKworICAgICAgICAvLyB0aGlzIHdob2xlIGJsb2NrIHNob3VsZCBvbmx5IGJlIGRvbmUgaWYgbG9nZ2luZyBpcyBlbmFibGVkCisgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgbG9nLmRlYnVnKCJDYW5vbmljYWxpemVkIFNpZ25lZEluZm86Iik7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoc2lnbmVkSW5mb0J5dGVzLmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpZ25lZEluZm9CeXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcilzaWduZWRJbmZvQnl0ZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9nLmRlYnVnKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJEYXRhIHRvIGJlIHNpZ25lZC92ZXJpZmllZDoiICsgQmFzZTY0LmVuY29kZShzaWduZWRJbmZvQnl0ZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY2Fub25EYXRhID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNpZ25lZEluZm9CeXRlcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9zLmNsb3NlKCk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhlLmdldE1lc3NhZ2UoKSwgZSk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01YNTA5RGF0YS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vRE9NWDUwOURhdGEuamF2YQppbmRleCBlNzcxMjhlLi4xZjIzZWFiIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01YNTA5RGF0YS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTVg1MDlEYXRhLmphdmEKQEAgLTI1LDcgKzI1LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5qY3AueG1sLmRzaWcuaW50ZXJuYWwuZG9tOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC4qOwogaW1wb3J0IGphdmEudXRpbC4qOwogCkBAIC0zNiw4ICszNSw4IEBACiAKIGltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5leGNlcHRpb25zLkJhc2U2NERlY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkJhc2U2NDsKIAogLyoqCiAgKiBET00tYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgWDUwOURhdGEuCkBAIC0xMDksOCArMTA4LDExIEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKCJYNTA5U3ViamVjdE5hbWUiKSAmJiBYTUxTaWduYXR1cmUuWE1MTlMuZXF1YWxzKG5hbWVzcGFjZSkpIHsKICAgICAgICAgICAgICAgICAgICAgbmV3Q29udGVudC5hZGQoY2hpbGRFbGVtLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKCJYNTA5U0tJIikgJiYgWE1MU2lnbmF0dXJlLlhNTE5TLmVxdWFscyhuYW1lc3BhY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gWE1MVXRpbHMuZ2V0RnVsbFRleHRDaGlsZHJlbkZyb21FbGVtZW50KGNoaWxkRWxlbSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuYWRkKEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZShjb250ZW50KSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb250ZW50LmFkZChCYXNlNjQuZGVjb2RlKGNoaWxkRWxlbSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChCYXNlNjREZWNvZGluZ0V4Y2VwdGlvbiBiZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJjYW5ub3QgZGVjb2RlIFg1MDlTS0kiLCBiZGUpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhbE5hbWUuZXF1YWxzKCJYNTA5Q1JMIikgJiYgWE1MU2lnbmF0dXJlLlhNTE5TLmVxdWFscyhuYW1lc3BhY2UpKSB7CiAgICAgICAgICAgICAgICAgICAgIG5ld0NvbnRlbnQuYWRkKHVubWFyc2hhbFg1MDlDUkwoY2hpbGRFbGVtKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTE1NCw4ICsxNTYsNyBAQAogCiAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBtYXJzaGFsU0tJKFhtbFdyaXRlciB4d3JpdGVyLCBieXRlW10gc2tpZCwgU3RyaW5nIGRzUHJlZml4KQogICAgIHsKLSAgICAgICAgeHdyaXRlci53cml0ZVRleHRFbGVtZW50KGRzUHJlZml4LCAiWDUwOVNLSSIsIFhNTFNpZ25hdHVyZS5YTUxOUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlNjQuZ2V0TWltZUVuY29kZXIoKS5lbmNvZGVUb1N0cmluZyhza2lkKSk7CisgICAgICAgIHh3cml0ZXIud3JpdGVUZXh0RWxlbWVudChkc1ByZWZpeCwgIlg1MDlTS0kiLCBYTUxTaWduYXR1cmUuWE1MTlMsIEJhc2U2NC5lbmNvZGUoc2tpZCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWFyc2hhbFN1YmplY3ROYW1lKFhtbFdyaXRlciB4d3JpdGVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRzUHJlZml4KQpAQCAtMTY4LDggKzE2OSw3IEBACiAgICAgewogICAgICAgICB0cnkgewogICAgICAgICAgICAgYnl0ZVtdIGVuY29kZWQgPSBjZXJ0LmdldEVuY29kZWQoKTsKLSAgICAgICAgICAgIHh3cml0ZXIud3JpdGVUZXh0RWxlbWVudChkc1ByZWZpeCwgIlg1MDlDZXJ0aWZpY2F0ZSIsIFhNTFNpZ25hdHVyZS5YTUxOUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoZW5jb2RlZCkpOworICAgICAgICAgICAgeHdyaXRlci53cml0ZVRleHRFbGVtZW50KGRzUHJlZml4LCAiWDUwOUNlcnRpZmljYXRlIiwgWE1MU2lnbmF0dXJlLlhNTE5TLCBCYXNlNjQuZW5jb2RlKGVuY29kZWQpKTsKICAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiRXJyb3IgZW5jb2RpbmcgWDUwOUNlcnRpZmljYXRlIiwgZSk7CiAgICAgICAgIH0KQEAgLTE4MCw4ICsxODAsNyBAQAogICAgIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGJ5dGVbXSBlbmNvZGVkID0gY3JsLmdldEVuY29kZWQoKTsKLSAgICAgICAgICAgIHh3cml0ZXIud3JpdGVUZXh0RWxlbWVudChkc1ByZWZpeCwgIlg1MDlDUkwiLCBYTUxTaWduYXR1cmUuWE1MTlMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGVuY29kZWQpKTsKKyAgICAgICAgICAgIHh3cml0ZXIud3JpdGVUZXh0RWxlbWVudChkc1ByZWZpeCwgIlg1MDlDUkwiLCBYTUxTaWduYXR1cmUuWE1MTlMsIEJhc2U2NC5lbmNvZGUoZW5jb2RlZCkpOwogICAgICAgICB9IGNhdGNoIChDUkxFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIkVycm9yIGVuY29kaW5nIFg1MDlDUkwiLCBlKTsKICAgICAgICAgfQpAQCAtMTkwLDIyICsxODksMjAgQEAKICAgICBwcml2YXRlIFg1MDlDZXJ0aWZpY2F0ZSB1bm1hcnNoYWxYNTA5Q2VydGlmaWNhdGUoRWxlbWVudCBlbGVtKQogICAgICAgICB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdHJ5IChCeXRlQXJyYXlJbnB1dFN0cmVhbSBicyA9IHVubWFyc2hhbEJhc2U2NEJpbmFyeShlbGVtKSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYnMgPSB1bm1hcnNoYWxCYXNlNjRCaW5hcnkoZWxlbSk7CiAgICAgICAgICAgICByZXR1cm4gKFg1MDlDZXJ0aWZpY2F0ZSljZi5nZW5lcmF0ZUNlcnRpZmljYXRlKGJzKTsKICAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIkNhbm5vdCBjcmVhdGUgWDUwOUNlcnRpZmljYXRlIiwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJFcnJvciBjbG9zaW5nIHN0cmVhbSIsIGUpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgcHJpdmF0ZSBYNTA5Q1JMIHVubWFyc2hhbFg1MDlDUkwoRWxlbWVudCBlbGVtKSB0aHJvd3MgTWFyc2hhbEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoQnl0ZUFycmF5SW5wdXRTdHJlYW0gYnMgPSB1bm1hcnNoYWxCYXNlNjRCaW5hcnkoZWxlbSkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJzID0gdW5tYXJzaGFsQmFzZTY0QmluYXJ5KGVsZW0pOwogICAgICAgICAgICAgcmV0dXJuIChYNTA5Q1JMKWNmLmdlbmVyYXRlQ1JMKGJzKTsKICAgICAgICAgfSBjYXRjaCAoQ1JMRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBNYXJzaGFsRXhjZXB0aW9uKCJDYW5ub3QgY3JlYXRlIFg1MDlDUkwiLCBlKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1hcnNoYWxFeGNlcHRpb24oIkVycm9yIGNsb3Npbmcgc3RyZWFtIiwgZSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxNSwxMCArMjEyLDExIEBACiAgICAgICAgICAgICBpZiAoY2YgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgIGNmID0gQ2VydGlmaWNhdGVGYWN0b3J5LmdldEluc3RhbmNlKCJYLjUwOSIpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBYTUxVdGlscy5nZXRGdWxsVGV4dENoaWxkcmVuRnJvbUVsZW1lbnQoZWxlbSk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZShjb250ZW50KSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKEJhc2U2NC5kZWNvZGUoZWxlbSkpOwogICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBDZXJ0aWZpY2F0ZUZhY3RvcnkiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoQmFzZTY0RGVjb2RpbmdFeGNlcHRpb24gYmRlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbigiQ2Fubm90IGRlY29kZSBCYXNlNjQtZW5jb2RlZCB2YWwiLCBiZGUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9ET01YTUxTaWduYXR1cmUuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTVhNTFNpZ25hdHVyZS5qYXZhCmluZGV4IGM1ZWI5ZjEuLmVhYzk3NGYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTVhNTFNpZ25hdHVyZS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL0RPTVhNTFNpZ25hdHVyZS5qYXZhCkBAIC00MiwxNSArNDIsMTQgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByb3ZpZGVyOwogaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CiBpbXBvcnQgamF2YS51dGlsLk1hcDsKIAogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CiBpbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmV4Y2VwdGlvbnMuQmFzZTY0RGVjb2RpbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogCiAvKioKICAqIERPTS1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBYTUxTaWduYXR1cmUuCkBAIC01MDAsOSArNDk5LDEyIEBACiAgICAgICAgIERPTVNpZ25hdHVyZVZhbHVlKEVsZW1lbnQgc2lnVmFsdWVFbGVtKQogICAgICAgICAgICAgdGhyb3dzIE1hcnNoYWxFeGNlcHRpb24KICAgICAgICAgewotICAgICAgICAgICAgLy8gYmFzZTY0IGRlY29kZSBzaWduYXR1cmVWYWx1ZQotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBYTUxVdGlscy5nZXRGdWxsVGV4dENoaWxkcmVuRnJvbUVsZW1lbnQoc2lnVmFsdWVFbGVtKTsKLSAgICAgICAgICAgIHZhbHVlID0gQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBiYXNlNjQgZGVjb2RlIHNpZ25hdHVyZVZhbHVlCisgICAgICAgICAgICAgICAgdmFsdWUgPSBCYXNlNjQuZGVjb2RlKHNpZ1ZhbHVlRWxlbSk7CisgICAgICAgICAgICB9IGNhdGNoIChCYXNlNjREZWNvZGluZ0V4Y2VwdGlvbiBiZGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTWFyc2hhbEV4Y2VwdGlvbihiZGUpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZCA9IERPTVV0aWxzLmdldElkQXR0cmlidXRlVmFsdWUoc2lnVmFsdWVFbGVtLCAiSWQiKTsKICAgICAgICAgfQpAQCAtNjE1LDcgKzYxNyw3IEBACiAKICAgICAgICAgdm9pZCBzZXRWYWx1ZShYbWxXcml0ZXIgeHdyaXRlciwgYnl0ZVtdIHZhbHVlKSB7CiAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICAgICAgICB2YWx1ZUJhc2U2NCA9IEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgICAgIHZhbHVlQmFzZTY0ID0gQmFzZTY0LmVuY29kZSh2YWx1ZSk7CiAgICAgICAgICAgICBpZiAoeHdyaXRlciAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgeHdyaXRlci53cml0ZUNoYXJhY3RlcnModmFsdWVCYXNlNjQpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vTWFyc2hhbGxlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vTWFyc2hhbGxlci5qYXZhCmluZGV4IDY0OGQ5MDEuLjM3MTQxZjAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL01hcnNoYWxsZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9NYXJzaGFsbGVyLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS5qY3AueG1sLmRzaWcuaW50ZXJuYWwuZG9tOwogCiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwogaW1wb3J0IGphdmEudXRpbC5MaXN0OwogCiBpbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKQEAgLTM4LDYgKzM3LDcgQEAKIGltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRzaWcua2V5aW5mby5YNTA5RGF0YTsKIGltcG9ydCBqYXZheC54bWwuY3J5cHRvLmRzaWcua2V5aW5mby5YNTA5SXNzdWVyU2VyaWFsOwogCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogaW1wb3J0IG9yZy53M2MuZG9tLkF0dHI7CiBpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOwogaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CkBAIC04MiwxNSArODIsMTMgQEAKICAgICAgICAgLy8gY3JlYXRlIGFuZCBhcHBlbmQgUEdQS2V5SUQgZWxlbWVudAogICAgICAgICBieXRlW10ga2V5SWQgPSBwZ3BEYXRhLmdldEtleUlkKCk7CiAgICAgICAgIGlmIChrZXlJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4d3JpdGVyLndyaXRlVGV4dEVsZW1lbnQoZHNQcmVmaXgsICJQR1BLZXlJRCIsIFhNTFNpZ25hdHVyZS5YTUxOUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoa2V5SWQpKTsKKyAgICAgICAgICAgIHh3cml0ZXIud3JpdGVUZXh0RWxlbWVudChkc1ByZWZpeCwgIlBHUEtleUlEIiwgWE1MU2lnbmF0dXJlLlhNTE5TLCBCYXNlNjQuZW5jb2RlKGtleUlkKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBjcmVhdGUgYW5kIGFwcGVuZCBQR1BLZXlQYWNrZXQgZWxlbWVudAogICAgICAgICBieXRlW10ga2V5UGFja2V0ID0gcGdwRGF0YS5nZXRLZXlQYWNrZXQoKTsKICAgICAgICAgaWYgKGtleVBhY2tldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICB4d3JpdGVyLndyaXRlVGV4dEVsZW1lbnQoZHNQcmVmaXgsICJYTUxTaWduYXR1cmUuWE1MTlMiLCBYTUxTaWduYXR1cmUuWE1MTlMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGtleVBhY2tldCkpOworICAgICAgICAgICAgeHdyaXRlci53cml0ZVRleHRFbGVtZW50KGRzUHJlZml4LCAiWE1MU2lnbmF0dXJlLlhNTE5TIiwgWE1MU2lnbmF0dXJlLlhNTE5TLCBCYXNlNjQuZW5jb2RlKGtleVBhY2tldCkpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gY3JlYXRlIGFuZCBhcHBlbmQgYW55IGVsZW1lbnRzCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9VdGlscy5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vVXRpbHMuamF2YQppbmRleCBiOTQwOTQyLi42ZTU2N2Y2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9VdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9qY3AveG1sL2RzaWcvaW50ZXJuYWwvZG9tL1V0aWxzLmphdmEKQEAgLTQ0LDIwICs0NCwxOSBAQAogICAgIHB1YmxpYyBzdGF0aWMgYnl0ZVtdIHJlYWRCeXRlc0Zyb21TdHJlYW0oSW5wdXRTdHJlYW0gaXMpCiAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgogICAgIHsKLSAgICAgICAgdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewotICAgICAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOwotICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICBpbnQgcmVhZCA9IGlzLnJlYWQoYnVmKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhZCA9PSAtMSkgeyAvLyBFT0YKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJhb3Mud3JpdGUoYnVmLCAwLCByZWFkKTsKLSAgICAgICAgICAgICAgICBpZiAocmVhZCA8IDEwMjQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IHJlYWQgPSBpcy5yZWFkKGJ1Zik7CisgICAgICAgICAgICBpZiAocmVhZCA9PSAtMSkgeyAvLyBFT0YKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICBiYW9zLndyaXRlKGJ1ZiwgMCwgcmVhZCk7CisgICAgICAgICAgICBpZiAocmVhZCA8IDEwMjQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2pjcC94bWwvZHNpZy9pbnRlcm5hbC9kb20vWE1MRFNpZ1JJLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9YTUxEU2lnUkkuamF2YQppbmRleCA0N2ZlNzNmLi42OTc4YzA3IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9YTUxEU2lnUkkuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvamNwL3htbC9kc2lnL2ludGVybmFsL2RvbS9YTUxEU2lnUkkuamF2YQpAQCAtNTcsNyArNTcsNyBAQAogCiAgICAgcHVibGljIFhNTERTaWdSSSgpIHsKICAgICAgICAgLyogV2UgYXJlIHRoZSBBcGFjaGVYTUxEU2lnIHByb3ZpZGVyICovCi0gICAgICAgIHN1cGVyKCJBcGFjaGVYTUxEU2lnIiwgMi4xMCwgSU5GTyk7CisgICAgICAgIHN1cGVyKCJBcGFjaGVYTUxEU2lnIiwgMi4wOCwgSU5GTyk7CiAKICAgICAgICAgZmluYWwgTWFwPE9iamVjdCwgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxPYmplY3QsIE9iamVjdD4oKTsKICAgICAgICAgbWFwLnB1dCgiWE1MU2lnbmF0dXJlRmFjdG9yeS5ET00iLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9hbGdvcml0aG1zL2ltcGxlbWVudGF0aW9ucy9TaWduYXR1cmVEU0EuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvYWxnb3JpdGhtcy9pbXBsZW1lbnRhdGlvbnMvU2lnbmF0dXJlRFNBLmphdmEKaW5kZXggYzlhNTkwYS4uZjA2ZjEzMiAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9hbGdvcml0aG1zL2ltcGxlbWVudGF0aW9ucy9TaWduYXR1cmVEU0EuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2FsZ29yaXRobXMvaW1wbGVtZW50YXRpb25zL1NpZ25hdHVyZURTQS5qYXZhCkBAIC0yOSwxMiArMjksMTIgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlNpZ25hdHVyZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmludGVyZmFjZXMuRFNBS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5hbGdvcml0aG1zLkpDRU1hcHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5hbGdvcml0aG1zLlNpZ25hdHVyZUFsZ29yaXRobVNwaTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5KYXZhVXRpbHM7CiAKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgICB0aHJvd3MgWE1MU2lnbmF0dXJlRXhjZXB0aW9uIHsKICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGVkIERTQS52ZXJpZnkoKSBvbiAiICsgQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoc2lnbmF0dXJlKSk7CisgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJDYWxsZWQgRFNBLnZlcmlmeSgpIG9uICIgKyBCYXNlNjQuZW5jb2RlKHNpZ25hdHVyZSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBieXRlW10gamNlYnl0ZXMgPSBKYXZhVXRpbHMuY29udmVydERzYVhNTERTSUd0b0FTTjEoc2lnbmF0dXJlLApkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9hbGdvcml0aG1zL2ltcGxlbWVudGF0aW9ucy9TaWduYXR1cmVFQ0RTQS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9hbGdvcml0aG1zL2ltcGxlbWVudGF0aW9ucy9TaWduYXR1cmVFQ0RTQS5qYXZhCmluZGV4IGEyMDAwZTEuLmFkMmE5MzIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvYWxnb3JpdGhtcy9pbXBsZW1lbnRhdGlvbnMvU2lnbmF0dXJlRUNEU0EuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2FsZ29yaXRobXMvaW1wbGVtZW50YXRpb25zL1NpZ25hdHVyZUVDRFNBLmphdmEKQEAgLTI5LDEyICsyOSwxMiBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5hbGdvcml0aG1zLkpDRU1hcHBlcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5hbGdvcml0aG1zLlNpZ25hdHVyZUFsZ29yaXRobVNwaTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnNpZ25hdHVyZS5YTUxTaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogCiAvKioKICAqCkBAIC0xMzIsNyArMTMyLDcgQEAKICAgICAgICAgICAgIGJ5dGVbXSBqY2VieXRlcyA9IFNpZ25hdHVyZUVDRFNBLmNvbnZlcnRYTUxEU0lHdG9BU04xKHNpZ25hdHVyZSk7CiAKICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ2FsbGVkIEVDRFNBLnZlcmlmeSgpIG9uICIgKyBCYXNlNjQuZ2V0TWltZUVuY29kZXIoKS5lbmNvZGVUb1N0cmluZyhzaWduYXR1cmUpKTsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNhbGxlZCBFQ0RTQS52ZXJpZnkoKSBvbiAiICsgQmFzZTY0LmVuY29kZShzaWduYXR1cmUpKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2lnbmF0dXJlQWxnb3JpdGhtLnZlcmlmeShqY2VieXRlcyk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2MxNG4vQ2Fub25pY2FsaXplci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9jMTRuL0Nhbm9uaWNhbGl6ZXIuamF2YQppbmRleCBiNWQyZjJiLi41MTFmODQzIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2MxNG4vQ2Fub25pY2FsaXplci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvYzE0bi9DYW5vbmljYWxpemVyLmphdmEKQEAgLTI1Miw0MSArMjUyLDQwIEBACiAgICAgcHVibGljIGJ5dGVbXSBjYW5vbmljYWxpemUoYnl0ZVtdIGlucHV0Qnl0ZXMpCiAgICAgICAgIHRocm93cyBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAogICAgICAgICBqYXZhLmlvLklPRXhjZXB0aW9uLCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb24sIENhbm9uaWNhbGl6YXRpb25FeGNlcHRpb24gewotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dEJ5dGVzKSkgewotICAgICAgICAgICAgSW5wdXRTb3VyY2UgaW4gPSBuZXcgSW5wdXRTb3VyY2UoYmFpcyk7Ci0gICAgCi0gICAgICAgICAgICAvLyBuZWVkcyB0byB2YWxpZGF0ZSBmb3IgSUQgYXR0cmlidXRlIG5vcm1hbGl6YXRpb24KLSAgICAgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcih0cnVlLCBzZWN1cmVWYWxpZGF0aW9uKTsKLSAgICAKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBmb3Igc29tZSBvZiB0aGUgdGVzdCB2ZWN0b3JzIGZyb20gdGhlIHNwZWNpZmljYXRpb24sCi0gICAgICAgICAgICAgKiB0aGVyZSBoYXMgdG8gYmUgYSB2YWxpZGF0aW5nIHBhcnNlciBmb3IgSUQgYXR0cmlidXRlcywgZGVmYXVsdAotICAgICAgICAgICAgICogYXR0cmlidXRlIHZhbHVlcywgTk1UT0tFTlMsIGV0Yy4KLSAgICAgICAgICAgICAqIFVuZm9ydHVuYXRlbHksIHRoZSB0ZXN0IHZlY3RvcnMgZG8gdXNlIGRpZmZlcmVudCBEVERzIG9yCi0gICAgICAgICAgICAgKiBldmVuIG5vIERURC4gU28gWGVyY2VzIDEuMy4xIGZpcmVzIG1hbnkgd2FybmluZ3MgYWJvdXQgdXNpbmcKLSAgICAgICAgICAgICAqIEVycm9ySGFuZGxlcnMuCi0gICAgICAgICAgICAgKgotICAgICAgICAgICAgICogVGV4dCBmcm9tIHRoZSBzcGVjOgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIFRoZSBpbnB1dCBvY3RldCBzdHJlYW0gTVVTVCBjb250YWluIGEgd2VsbC1mb3JtZWQgWE1MIGRvY3VtZW50LAotICAgICAgICAgICAgICogYnV0IHRoZSBpbnB1dCBuZWVkIG5vdCBiZSB2YWxpZGF0ZWQuIEhvd2V2ZXIsIHRoZSBhdHRyaWJ1dGUKLSAgICAgICAgICAgICAqIHZhbHVlIG5vcm1hbGl6YXRpb24gYW5kIGVudGl0eSByZWZlcmVuY2UgcmVzb2x1dGlvbiBNVVNUIGJlCi0gICAgICAgICAgICAgKiBwZXJmb3JtZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBiZWhhdmlvcnMgb2YgYSB2YWxpZGF0aW5nCi0gICAgICAgICAgICAgKiBYTUwgcHJvY2Vzc29yLiBBcyB3ZWxsLCBub2RlcyBmb3IgZGVmYXVsdCBhdHRyaWJ1dGVzIChkZWNsYXJlZAotICAgICAgICAgICAgICogaW4gdGhlIEFUVExJU1Qgd2l0aCBhbiBBdHRWYWx1ZSBidXQgbm90IHNwZWNpZmllZCkgYXJlIGNyZWF0ZWQKLSAgICAgICAgICAgICAqIGluIGVhY2ggZWxlbWVudC4gVGh1cywgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgZG9jdW1lbnQgdHlwZQotICAgICAgICAgICAgICogZGVjbGFyYXRpb24gYXJlIHVzZWQgdG8gaGVscCBjcmVhdGUgdGhlIGNhbm9uaWNhbCBmb3JtLCBldmVuCi0gICAgICAgICAgICAgKiB0aG91Z2ggdGhlIGRvY3VtZW50IHR5cGUgZGVjbGFyYXRpb24gaXMgbm90IHJldGFpbmVkIGluIHRoZQotICAgICAgICAgICAgICogY2Fub25pY2FsIGZvcm0uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGRiLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSWdub3JlQWxsRXJyb3JIYW5kbGVyKCkpOwotICAgIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGRiLnBhcnNlKGluKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMucmVwb29sRG9jdW1lbnRCdWlsZGVyKGRiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgSW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dEJ5dGVzKTsKKyAgICAgICAgSW5wdXRTb3VyY2UgaW4gPSBuZXcgSW5wdXRTb3VyY2UoYmFpcyk7CisKKyAgICAgICAgLy8gbmVlZHMgdG8gdmFsaWRhdGUgZm9yIElEIGF0dHJpYnV0ZSBub3JtYWxpemF0aW9uCisgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcih0cnVlLCBzZWN1cmVWYWxpZGF0aW9uKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBmb3Igc29tZSBvZiB0aGUgdGVzdCB2ZWN0b3JzIGZyb20gdGhlIHNwZWNpZmljYXRpb24sCisgICAgICAgICAqIHRoZXJlIGhhcyB0byBiZSBhIHZhbGlkYXRpbmcgcGFyc2VyIGZvciBJRCBhdHRyaWJ1dGVzLCBkZWZhdWx0CisgICAgICAgICAqIGF0dHJpYnV0ZSB2YWx1ZXMsIE5NVE9LRU5TLCBldGMuCisgICAgICAgICAqIFVuZm9ydHVuYXRlbHksIHRoZSB0ZXN0IHZlY3RvcnMgZG8gdXNlIGRpZmZlcmVudCBEVERzIG9yCisgICAgICAgICAqIGV2ZW4gbm8gRFRELiBTbyBYZXJjZXMgMS4zLjEgZmlyZXMgbWFueSB3YXJuaW5ncyBhYm91dCB1c2luZworICAgICAgICAgKiBFcnJvckhhbmRsZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBUZXh0IGZyb20gdGhlIHNwZWM6CisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBpbnB1dCBvY3RldCBzdHJlYW0gTVVTVCBjb250YWluIGEgd2VsbC1mb3JtZWQgWE1MIGRvY3VtZW50LAorICAgICAgICAgKiBidXQgdGhlIGlucHV0IG5lZWQgbm90IGJlIHZhbGlkYXRlZC4gSG93ZXZlciwgdGhlIGF0dHJpYnV0ZQorICAgICAgICAgKiB2YWx1ZSBub3JtYWxpemF0aW9uIGFuZCBlbnRpdHkgcmVmZXJlbmNlIHJlc29sdXRpb24gTVVTVCBiZQorICAgICAgICAgKiBwZXJmb3JtZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBiZWhhdmlvcnMgb2YgYSB2YWxpZGF0aW5nCisgICAgICAgICAqIFhNTCBwcm9jZXNzb3IuIEFzIHdlbGwsIG5vZGVzIGZvciBkZWZhdWx0IGF0dHJpYnV0ZXMgKGRlY2xhcmVkCisgICAgICAgICAqIGluIHRoZSBBVFRMSVNUIHdpdGggYW4gQXR0VmFsdWUgYnV0IG5vdCBzcGVjaWZpZWQpIGFyZSBjcmVhdGVkCisgICAgICAgICAqIGluIGVhY2ggZWxlbWVudC4gVGh1cywgdGhlIGRlY2xhcmF0aW9ucyBpbiB0aGUgZG9jdW1lbnQgdHlwZQorICAgICAgICAgKiBkZWNsYXJhdGlvbiBhcmUgdXNlZCB0byBoZWxwIGNyZWF0ZSB0aGUgY2Fub25pY2FsIGZvcm0sIGV2ZW4KKyAgICAgICAgICogdGhvdWdoIHRoZSBkb2N1bWVudCB0eXBlIGRlY2xhcmF0aW9uIGlzIG5vdCByZXRhaW5lZCBpbiB0aGUKKyAgICAgICAgICogY2Fub25pY2FsIGZvcm0uCisgICAgICAgICAqLworICAgICAgICBkYi5zZXRFcnJvckhhbmRsZXIobmV3IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLklnbm9yZUFsbEVycm9ySGFuZGxlcigpKTsKKworICAgICAgICBEb2N1bWVudCBkb2N1bWVudDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGRvY3VtZW50ID0gZGIucGFyc2UoaW4pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgWE1MVXRpbHMucmVwb29sRG9jdW1lbnRCdWlsZGVyKGRiKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdGhpcy5jYW5vbmljYWxpemVTdWJ0cmVlKGRvY3VtZW50KTsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2MxNG4vQ2Fub25pY2FsaXplclNwaS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9jMTRuL0Nhbm9uaWNhbGl6ZXJTcGkuamF2YQppbmRleCA5M2U5MWQyLi5hZTk5MzZmIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2MxNG4vQ2Fub25pY2FsaXplclNwaS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvYzE0bi9DYW5vbmljYWxpemVyU3BpLmphdmEKQEAgLTU2LDE3ICs1NiwxNiBAQAogICAgICAgICB0aHJvd3MgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgamF2YS5pby5JT0V4Y2VwdGlvbiwKICAgICAgICAgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uLCBDYW5vbmljYWxpemF0aW9uRXhjZXB0aW9uIHsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoamF2YS5pby5JbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0Qnl0ZXMpKSB7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBpbiA9IG5ldyBJbnB1dFNvdXJjZShiYWlzKTsKKyAgICAgICAgamF2YS5pby5JbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0Qnl0ZXMpOworICAgICAgICBJbnB1dFNvdXJjZSBpbiA9IG5ldyBJbnB1dFNvdXJjZShiYWlzKTsKIAotICAgICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlLCBzZWN1cmVWYWxpZGF0aW9uKTsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlLCBzZWN1cmVWYWxpZGF0aW9uKTsKIAotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkb2N1bWVudCA9IGRiLnBhcnNlKGluKTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMucmVwb29sRG9jdW1lbnRCdWlsZGVyKGRiKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkb2N1bWVudCA9IGRiLnBhcnNlKGluKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFhNTFV0aWxzLnJlcG9vbERvY3VtZW50QnVpbGRlcihkYik7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRoaXMuZW5naW5lQ2Fub25pY2FsaXplU3ViVHJlZShkb2N1bWVudCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL0Fic3RyYWN0U2VyaWFsaXplci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL0Fic3RyYWN0U2VyaWFsaXplci5qYXZhCmluZGV4IDhjMjUzMzMuLmIzMGQwODAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvZW5jcnlwdGlvbi9BYnN0cmFjdFNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2VuY3J5cHRpb24vQWJzdHJhY3RTZXJpYWxpemVyLmphdmEKQEAgLTk2LDE3ICs5NiwxNiBAQAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIFN0cmluZyBzZXJpYWxpemUoTm9kZUxpc3QgY29udGVudCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKLSAgICAgICAgICAgIGNhbm9uLnNldFNlY3VyZVZhbGlkYXRpb24oc2VjdXJlVmFsaWRhdGlvbik7Ci0gICAgICAgICAgICBjYW5vbi5zZXRXcml0ZXIoYmFvcyk7Ci0gICAgICAgICAgICBjYW5vbi5ub3RSZXNldCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50LmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjYW5vbi5jYW5vbmljYWxpemVTdWJ0cmVlKGNvbnRlbnQuaXRlbShpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgcmV0ID0gYmFvcy50b1N0cmluZygiVVRGLTgiKTsKLSAgICAgICAgICAgIGJhb3MucmVzZXQoKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBjYW5vbi5zZXRTZWN1cmVWYWxpZGF0aW9uKHNlY3VyZVZhbGlkYXRpb24pOworICAgICAgICBjYW5vbi5zZXRXcml0ZXIoYmFvcyk7CisgICAgICAgIGNhbm9uLm5vdFJlc2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBjYW5vbi5jYW5vbmljYWxpemVTdWJ0cmVlKGNvbnRlbnQuaXRlbShpKSk7CiAgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHJldCA9IGJhb3MudG9TdHJpbmcoIlVURi04Iik7CisgICAgICAgIGJhb3MucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKICAgICAvKioKQEAgLTExOSwxNSArMTE4LDE0IEBACiAgICAgICogQHRocm93cyBFeGNlcHRpb24KICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIHNlcmlhbGl6ZVRvQnl0ZUFycmF5KE5vZGVMaXN0IGNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7Ci0gICAgICAgICAgICBjYW5vbi5zZXRTZWN1cmVWYWxpZGF0aW9uKHNlY3VyZVZhbGlkYXRpb24pOwotICAgICAgICAgICAgY2Fub24uc2V0V3JpdGVyKGJhb3MpOwotICAgICAgICAgICAgY2Fub24ubm90UmVzZXQoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudC5nZXRMZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgY2Fub24uY2Fub25pY2FsaXplU3VidHJlZShjb250ZW50Lml0ZW0oaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGNhbm9uLnNldFNlY3VyZVZhbGlkYXRpb24oc2VjdXJlVmFsaWRhdGlvbik7CisgICAgICAgIGNhbm9uLnNldFdyaXRlcihiYW9zKTsKKyAgICAgICAgY2Fub24ubm90UmVzZXQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250ZW50LmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNhbm9uLmNhbm9uaWNhbGl6ZVN1YnRyZWUoY29udGVudC5pdGVtKGkpKTsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTM3LDE1ICsxMzUsMTQgQEAKICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgogICAgICAqLwogICAgIHB1YmxpYyBTdHJpbmcgY2Fub25TZXJpYWxpemUoTm9kZSBub2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKSkgewotICAgICAgICAgICAgY2Fub24uc2V0U2VjdXJlVmFsaWRhdGlvbihzZWN1cmVWYWxpZGF0aW9uKTsKLSAgICAgICAgICAgIGNhbm9uLnNldFdyaXRlcihiYW9zKTsKLSAgICAgICAgICAgIGNhbm9uLm5vdFJlc2V0KCk7Ci0gICAgICAgICAgICBjYW5vbi5jYW5vbmljYWxpemVTdWJ0cmVlKG5vZGUpOwotICAgICAgICAgICAgU3RyaW5nIHJldCA9IGJhb3MudG9TdHJpbmcoIlVURi04Iik7Ci0gICAgICAgICAgICBiYW9zLnJlc2V0KCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBjYW5vbi5zZXRTZWN1cmVWYWxpZGF0aW9uKHNlY3VyZVZhbGlkYXRpb24pOworICAgICAgICBjYW5vbi5zZXRXcml0ZXIoYmFvcyk7CisgICAgICAgIGNhbm9uLm5vdFJlc2V0KCk7CisgICAgICAgIGNhbm9uLmNhbm9uaWNhbGl6ZVN1YnRyZWUobm9kZSk7CisgICAgICAgIFN0cmluZyByZXQgPSBiYW9zLnRvU3RyaW5nKCJVVEYtOCIpOworICAgICAgICBiYW9zLnJlc2V0KCk7CisgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCiAgICAgLyoqCkBAIC0xNTUsMTMgKzE1MiwxMiBAQAogICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBjYW5vblNlcmlhbGl6ZVRvQnl0ZUFycmF5KE5vZGUgbm9kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKLSAgICAgICAgICAgIGNhbm9uLnNldFNlY3VyZVZhbGlkYXRpb24oc2VjdXJlVmFsaWRhdGlvbik7Ci0gICAgICAgICAgICBjYW5vbi5zZXRXcml0ZXIoYmFvcyk7Ci0gICAgICAgICAgICBjYW5vbi5ub3RSZXNldCgpOwotICAgICAgICAgICAgY2Fub24uY2Fub25pY2FsaXplU3VidHJlZShub2RlKTsKLSAgICAgICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgIH0KKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGNhbm9uLnNldFNlY3VyZVZhbGlkYXRpb24oc2VjdXJlVmFsaWRhdGlvbik7CisgICAgICAgIGNhbm9uLnNldFdyaXRlcihiYW9zKTsKKyAgICAgICAgY2Fub24ubm90UmVzZXQoKTsKKyAgICAgICAgY2Fub24uY2Fub25pY2FsaXplU3VidHJlZShub2RlKTsKKyAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKICAgICB9CiAKICAgICAvKioKQEAgLTE3OCwxMSArMTc0LDEyIEBACiAgICAgICogQHJldHVybiB0aGUgTm9kZSByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2Ugb2YgdGhlIHNvdXJjZQogICAgICAqIEB0aHJvd3MgWE1MRW5jcnlwdGlvbkV4Y2VwdGlvbgogICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBOb2RlIGRlc2VyaWFsaXplKGJ5dGVbXSBzb3VyY2UsIE5vZGUgY3R4KSB0aHJvd3MgWE1MRW5jcnlwdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisgICAgcHVibGljIGFic3RyYWN0IE5vZGUgZGVzZXJpYWxpemUoYnl0ZVtdIHNvdXJjZSwgTm9kZSBjdHgpIHRocm93cyBYTUxFbmNyeXB0aW9uRXhjZXB0aW9uOwogCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBieXRlW10gY3JlYXRlQ29udGV4dChieXRlW10gc291cmNlLCBOb2RlIGN0eCkgdGhyb3dzIFhNTEVuY3J5cHRpb25FeGNlcHRpb24gewogICAgICAgICAvLyBDcmVhdGUgdGhlIGNvbnRleHQgdG8gcGFyc2UgdGhlIGRvY3VtZW50IGFnYWluc3QKLSAgICAgICAgdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHRyeSB7CiAgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3V0cHV0U3RyZWFtV3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihieXRlQXJyYXlPdXRwdXRTdHJlYW0sICJVVEYtOCIpOwogICAgICAgICAgICAgb3V0cHV0U3RyZWFtV3JpdGVyLndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiPz48ZHVtbXkiKTsKIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL0RvY3VtZW50U2VyaWFsaXplci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL0RvY3VtZW50U2VyaWFsaXplci5qYXZhCmluZGV4IDNjN2NlM2MuLmI3MzU4NmUgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvZW5jcnlwdGlvbi9Eb2N1bWVudFNlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2VuY3J5cHRpb24vRG9jdW1lbnRTZXJpYWxpemVyLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwpAQCAtNDUsMTEgKzQ0LDkgQEAKICAgICAgKiBAcmV0dXJuIHRoZSBOb2RlIHJlc3VsdGluZyBmcm9tIHRoZSBwYXJzZSBvZiB0aGUgc291cmNlCiAgICAgICogQHRocm93cyBYTUxFbmNyeXB0aW9uRXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIE5vZGUgZGVzZXJpYWxpemUoYnl0ZVtdIHNvdXJjZSwgTm9kZSBjdHgpIHRocm93cyBYTUxFbmNyeXB0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIE5vZGUgZGVzZXJpYWxpemUoYnl0ZVtdIHNvdXJjZSwgTm9kZSBjdHgpIHRocm93cyBYTUxFbmNyeXB0aW9uRXhjZXB0aW9uIHsKICAgICAgICAgYnl0ZVtdIGZyYWdtZW50ID0gY3JlYXRlQ29udGV4dChzb3VyY2UsIGN0eCk7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZnJhZ21lbnQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemUoY3R4LCBuZXcgSW5wdXRTb3VyY2UoaXMpKTsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVzZXJpYWxpemUoY3R4LCBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZyYWdtZW50KSkpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL1NlcmlhbGl6ZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvZW5jcnlwdGlvbi9TZXJpYWxpemVyLmphdmEKaW5kZXggOTRkOTI3Ny4uM2U5NDk4NyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL1NlcmlhbGl6ZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2VuY3J5cHRpb24vU2VyaWFsaXplci5qYXZhCkBAIC0xOCw4ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZW5jcnlwdGlvbjsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5jMTRuLkNhbm9uaWNhbGl6ZXI7CiBpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKIGltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOwpAQCAtNzEsNSArNjksNSBAQAogICAgICAqIEByZXR1cm4gdGhlIE5vZGUgcmVzdWx0aW5nIGZyb20gdGhlIHBhcnNlIG9mIHRoZSBzb3VyY2UKICAgICAgKiBAdGhyb3dzIFhNTEVuY3J5cHRpb25FeGNlcHRpb24KICAgICAgKi8KLSAgICBOb2RlIGRlc2VyaWFsaXplKGJ5dGVbXSBzb3VyY2UsIE5vZGUgY3R4KSB0aHJvd3MgWE1MRW5jcnlwdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb247CisgICAgTm9kZSBkZXNlcmlhbGl6ZShieXRlW10gc291cmNlLCBOb2RlIGN0eCkgdGhyb3dzIFhNTEVuY3J5cHRpb25FeGNlcHRpb247CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2VuY3J5cHRpb24vVHJhbnNmb3JtU2VyaWFsaXplci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL1RyYW5zZm9ybVNlcmlhbGl6ZXIuamF2YQppbmRleCA3M2RmNTlhLi4yMWMxZDhlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2VuY3J5cHRpb24vVHJhbnNmb3JtU2VyaWFsaXplci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvZW5jcnlwdGlvbi9UcmFuc2Zvcm1TZXJpYWxpemVyLmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZW5jcnlwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwogCiBpbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKQEAgLTQ4LDExICs0Niw5IEBACiAgICAgICogQHJldHVybiB0aGUgTm9kZSByZXN1bHRpbmcgZnJvbSB0aGUgcGFyc2Ugb2YgdGhlIHNvdXJjZQogICAgICAqIEB0aHJvd3MgWE1MRW5jcnlwdGlvbkV4Y2VwdGlvbgogICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGRlc2VyaWFsaXplKGJ5dGVbXSBzb3VyY2UsIE5vZGUgY3R4KSB0aHJvd3MgWE1MRW5jcnlwdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgIHB1YmxpYyBOb2RlIGRlc2VyaWFsaXplKGJ5dGVbXSBzb3VyY2UsIE5vZGUgY3R4KSB0aHJvd3MgWE1MRW5jcnlwdGlvbkV4Y2VwdGlvbiB7CiAgICAgICAgIGJ5dGVbXSBmcmFnbWVudCA9IGNyZWF0ZUNvbnRleHQoc291cmNlLCBjdHgpOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZyYWdtZW50KSkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplKGN0eCwgbmV3IFN0cmVhbVNvdXJjZShpcykpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZShjdHgsIG5ldyBTdHJlYW1Tb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGZyYWdtZW50KSkpOwogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL1hNTENpcGhlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9lbmNyeXB0aW9uL1hNTENpcGhlci5qYXZhCmluZGV4IGVhZmMxZmYuLjYzM2E1MGQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvZW5jcnlwdGlvbi9YTUxDaXBoZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2VuY3J5cHRpb24vWE1MQ2lwaGVyLmphdmEKQEAgLTE5LDcgKzE5LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZW5jcnlwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgamF2YS5uZXQuVVJJOwpAQCAtMzIsNyArMzEsNiBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5BbGdvcml0aG1QYXJhbWV0ZXJTcGVjOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5NR0YxUGFyYW1ldGVyU3BlYzsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwpAQCAtNTEsNiArNDksNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmFsZ29yaXRobXMuTWVzc2FnZURpZ2VzdEFsZ29yaXRobTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5jMTRuLkNhbm9uaWNhbGl6ZXI7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYzE0bi5JbnZhbGlkQ2Fub25pY2FsaXplckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5leGNlcHRpb25zLkJhc2U2NERlY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmV4Y2VwdGlvbnMuWE1MU2VjdXJpdHlFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5LZXlJbmZvOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMua2V5cmVzb2x2ZXIuS2V5UmVzb2x2ZXJFeGNlcHRpb247CkBAIC02MCw2ICs1OSw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5leHQuWE1MU2VjdXJpdHlDb25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5JbnZhbGlkVHJhbnNmb3JtRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMuVHJhbnNmb3JtYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5FbGVtZW50UHJveHk7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuRW5jcnlwdGlvbkNvbnN0YW50czsKQEAgLTExODgsMTQgKzExODgsMTMgQEAKICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkRGF0YSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgaW50IG51bUJ5dGVzOwogICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVs4MTkyXTsKLSAgICAgICAgICAgICAgICB0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICgobnVtQnl0ZXMgPSBzZXJpYWxpemVkRGF0YS5yZWFkKGJ1ZikpICE9IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gZGF0YSA9IGMudXBkYXRlKGJ1ZiwgMCwgbnVtQnl0ZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgYmFvcy53cml0ZShkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBiYW9zLndyaXRlKGMuZG9GaW5hbCgpKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkQnl0ZXMgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKChudW1CeXRlcyA9IHNlcmlhbGl6ZWREYXRhLnJlYWQoYnVmKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBjLnVwZGF0ZShidWYsIDAsIG51bUJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgYmFvcy53cml0ZShkYXRhKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmFvcy53cml0ZShjLmRvRmluYWwoKSk7CisgICAgICAgICAgICAgICAgZW5jcnlwdGVkQnl0ZXMgPSBiYW9zLnRvQnl0ZUFycmF5KCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGVuY3J5cHRlZEJ5dGVzID0gYy5kb0ZpbmFsKHNlcmlhbGl6ZWRPY3RldHMpOwogICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewpAQCAtMTIyNiw3ICsxMjI1LDcgQEAKICAgICAgICAgYnl0ZVtdIGZpbmFsRW5jcnlwdGVkQnl0ZXMgPSBuZXcgYnl0ZVtpdi5sZW5ndGggKyBlbmNyeXB0ZWRCeXRlcy5sZW5ndGhdOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGl2LCAwLCBmaW5hbEVuY3J5cHRlZEJ5dGVzLCAwLCBpdi5sZW5ndGgpOwogICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVuY3J5cHRlZEJ5dGVzLCAwLCBmaW5hbEVuY3J5cHRlZEJ5dGVzLCBpdi5sZW5ndGgsIGVuY3J5cHRlZEJ5dGVzLmxlbmd0aCk7Ci0gICAgICAgIFN0cmluZyBiYXNlNjRFbmNvZGVkRW5jcnlwdGVkT2N0ZXRzID0gQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoZmluYWxFbmNyeXB0ZWRCeXRlcyk7CisgICAgICAgIFN0cmluZyBiYXNlNjRFbmNvZGVkRW5jcnlwdGVkT2N0ZXRzID0gQmFzZTY0LmVuY29kZShmaW5hbEVuY3J5cHRlZEJ5dGVzKTsKIAogICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5jcnlwdGVkIG9jdGV0czpcbiIgKyBiYXNlNjRFbmNvZGVkRW5jcnlwdGVkT2N0ZXRzKTsKQEAgLTE0MjAsNyArMTQxOSw3IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MRW5jcnlwdGlvbkV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogCi0gICAgICAgIFN0cmluZyBiYXNlNjRFbmNvZGVkRW5jcnlwdGVkT2N0ZXRzID0gQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoZW5jcnlwdGVkQnl0ZXMpOworICAgICAgICBTdHJpbmcgYmFzZTY0RW5jb2RlZEVuY3J5cHRlZE9jdGV0cyA9IEJhc2U2NC5lbmNvZGUoZW5jcnlwdGVkQnl0ZXMpOwogICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKICAgICAgICAgICAgIGxvZy5kZWJ1ZygiRW5jcnlwdGVkIGtleSBvY3RldHM6XG4iICsgYmFzZTY0RW5jb2RlZEVuY3J5cHRlZE9jdGV0cyk7CiAgICAgICAgICAgICBsb2cuZGVidWcoIkVuY3J5cHRlZCBrZXkgb2N0ZXRzIGxlbmd0aCA9ICIgKyBiYXNlNjRFbmNvZGVkRW5jcnlwdGVkT2N0ZXRzLmxlbmd0aCgpKTsKQEAgLTE3MTgsMTkgKzE3MTcsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIE5vZGUgc291cmNlUGFyZW50ID0gZWxlbWVudC5nZXRQYXJlbnROb2RlKCk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBOb2RlIGRlY3J5cHRlZE5vZGUgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKG9jdGV0cywgc291cmNlUGFyZW50KTsKLSAgICAKLSAgICAgICAgICAgIC8vIFRoZSBkZS1zZXJpYWxpc2VyIHJldHVybnMgYSBub2RlIHdob3NlIGNoaWxkcmVuIHdlIG5lZWQgdG8gdGFrZSBvbi4KLSAgICAgICAgICAgIGlmIChzb3VyY2VQYXJlbnQgIT0gbnVsbCAmJiBOb2RlLkRPQ1VNRU5UX05PREUgPT0gc291cmNlUGFyZW50LmdldE5vZGVUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgY29udGVudCBkZWNyeXB0aW9uLCB0aGlzIG1heSBoYXZlIHByb2JsZW1zCi0gICAgICAgICAgICAgICAgY29udGV4dERvY3VtZW50LnJlbW92ZUNoaWxkKGNvbnRleHREb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7Ci0gICAgICAgICAgICAgICAgY29udGV4dERvY3VtZW50LmFwcGVuZENoaWxkKGRlY3J5cHRlZE5vZGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNvdXJjZVBhcmVudC5yZXBsYWNlQ2hpbGQoZGVjcnlwdGVkTm9kZSwgZWxlbWVudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgWE1MRW5jcnlwdGlvbkV4Y2VwdGlvbihleCk7CisgICAgICAgIE5vZGUgZGVjcnlwdGVkTm9kZSA9IHNlcmlhbGl6ZXIuZGVzZXJpYWxpemUob2N0ZXRzLCBzb3VyY2VQYXJlbnQpOworCisgICAgICAgIC8vIFRoZSBkZS1zZXJpYWxpc2VyIHJldHVybnMgYSBub2RlIHdob3NlIGNoaWxkcmVuIHdlIG5lZWQgdG8gdGFrZSBvbi4KKyAgICAgICAgaWYgKHNvdXJjZVBhcmVudCAhPSBudWxsICYmIE5vZGUuRE9DVU1FTlRfTk9ERSA9PSBzb3VyY2VQYXJlbnQuZ2V0Tm9kZVR5cGUoKSkgeworICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGNvbnRlbnQgZGVjcnlwdGlvbiwgdGhpcyBtYXkgaGF2ZSBwcm9ibGVtcworICAgICAgICAgICAgY29udGV4dERvY3VtZW50LnJlbW92ZUNoaWxkKGNvbnRleHREb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKSk7CisgICAgICAgICAgICBjb250ZXh0RG9jdW1lbnQuYXBwZW5kQ2hpbGQoZGVjcnlwdGVkTm9kZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlUGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZVBhcmVudC5yZXBsYWNlQ2hpbGQoZGVjcnlwdGVkTm9kZSwgZWxlbWVudCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXR1cm4gY29udGV4dERvY3VtZW50OwpAQCAtMjQ0OCw5ICsyNDQzLDExIEBACiAgICAgICAgICAgICBpZiAobnVsbCAhPSBvYWVwUGFyYW1zRWxlbWVudCkgewogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBvYWVwUGFyYW1zID0gb2FlcFBhcmFtc0VsZW1lbnQuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0T0FFUHBhcmFtcyhCYXNlNjQuZ2V0TWltZURlY29kZXIoKS5kZWNvZGUob2FlcFBhcmFtcy5nZXRCeXRlcygiVVRGLTgiKSkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0T0FFUHBhcmFtcyhCYXNlNjQuZGVjb2RlKG9hZXBQYXJhbXMuZ2V0Qnl0ZXMoIlVURi04IikpKTsKICAgICAgICAgICAgICAgICB9IGNhdGNoKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewogICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVVRGLTggbm90IHN1cHBvcnRlZCIsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEJhc2U2NERlY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkJBU0UtNjQgZGVjb2RpbmcgZXJyb3IiLCBlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTMyMjYsOCArMzIyMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVFbGVtZW50SW5FbmNyeXB0aW9uU3BhY2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dERvY3VtZW50LCBFbmNyeXB0aW9uQ29uc3RhbnRzLl9UQUdfT0FFUFBBUkFNUwogICAgICAgICAgICAgICAgICAgICAgICAgKTsKLSAgICAgICAgICAgICAgICAgICAgb2FlcEVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGV4dERvY3VtZW50LmNyZWF0ZVRleHROb2RlKAotICAgICAgICAgICAgICAgICAgICAgICAgQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcob2FlcFBhcmFtcykpKTsKKyAgICAgICAgICAgICAgICAgICAgb2FlcEVsZW1lbnQuYXBwZW5kQ2hpbGQoY29udGV4dERvY3VtZW50LmNyZWF0ZVRleHROb2RlKEJhc2U2NC5lbmNvZGUob2FlcFBhcmFtcykpKTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZENoaWxkKG9hZXBFbGVtZW50KTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGRpZ2VzdEFsZ29yaXRobSAhPSBudWxsKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2VuY3J5cHRpb24vWE1MQ2lwaGVySW5wdXQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvZW5jcnlwdGlvbi9YTUxDaXBoZXJJbnB1dC5qYXZhCmluZGV4IDJhNDRjMDAuLjAwM2I0MDIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvZW5jcnlwdGlvbi9YTUxDaXBoZXJJbnB1dC5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvZW5jcnlwdGlvbi9YTUxDaXBoZXJJbnB1dC5qYXZhCkBAIC0xOSwxNCArMTksMTUgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZW5jcnlwdGlvbjsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkJhc2U2NDsKIAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmMxNG4uQ2Fub25pY2FsaXphdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5yZXNvbHZlci5SZXNvdXJjZVJlc29sdmVyOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLnJlc29sdmVyLlJlc291cmNlUmVzb2x2ZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZXhjZXB0aW9ucy5CYXNlNjREZWNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlSW5wdXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1hdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcudzNjLmRvbS5BdHRyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkJhc2U2NDsKIAogLyoqCiAgKiA8Y29kZT5YTUxDaXBoZXJJbnB1dDwvY29kZT4gaXMgdXNlZCB0byB3cmFwIGlucHV0IHBhc3NlZCBpbnRvIHRoZQpAQCAtMTc4LDYgKzE3OSwxMCBAQAogICAgICAgICAgICAgbG9nLmRlYnVnKCJFbmNyeXB0ZWQgb2N0ZXRzOlxuIiArIGJhc2U2NEVuY29kZWRFbmNyeXB0ZWRPY3RldHMpOwogICAgICAgICB9CiAKLSAgICAgICAgcmV0dXJuIEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZShiYXNlNjRFbmNvZGVkRW5jcnlwdGVkT2N0ZXRzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBCYXNlNjQuZGVjb2RlKGJhc2U2NEVuY29kZWRFbmNyeXB0ZWRPY3RldHMpOworICAgICAgICB9IGNhdGNoIChCYXNlNjREZWNvZGluZ0V4Y2VwdGlvbiBiZGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxFbmNyeXB0aW9uRXhjZXB0aW9uKGJkZSk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMvY29udGVudC94NTA5L1hNTFg1MDlDZXJ0aWZpY2F0ZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL2NvbnRlbnQveDUwOS9YTUxYNTA5Q2VydGlmaWNhdGUuamF2YQppbmRleCAzZjY5MTI0Li4xZGIwMjFlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMvY29udGVudC94NTA5L1hNTFg1MDlDZXJ0aWZpY2F0ZS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkva2V5cy9jb250ZW50L3g1MDkvWE1MWDUwOUNlcnRpZmljYXRlLmphdmEKQEAgLTE5LDggKzE5LDYgQEAKIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50Lng1MDk7CiAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVFeGNlcHRpb247CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlRmFjdG9yeTsKQEAgLTk1LDEzICs5MywxNSBAQAogICAgICAqIEByZXR1cm4gdGhlIHg1MDkgY2VydGlmaWNhdGUKICAgICAgKiBAdGhyb3dzIFhNTFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICovCi0gICAgcHVibGljIFg1MDlDZXJ0aWZpY2F0ZSBnZXRYNTA5Q2VydGlmaWNhdGUoKSB0aHJvd3MgWE1MU2VjdXJpdHlFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKLSAgICAgICAgYnl0ZSBjZXJ0Ynl0ZXNbXSA9IHRoaXMuZ2V0Q2VydGlmaWNhdGVCeXRlcygpOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNlcnRieXRlcykpIHsKKyAgICBwdWJsaWMgWDUwOUNlcnRpZmljYXRlIGdldFg1MDlDZXJ0aWZpY2F0ZSgpIHRocm93cyBYTUxTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBieXRlIGNlcnRieXRlc1tdID0gdGhpcy5nZXRDZXJ0aWZpY2F0ZUJ5dGVzKCk7CiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkgY2VydEZhY3QgPQogICAgICAgICAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeS5nZXRJbnN0YW5jZShYTUxYNTA5Q2VydGlmaWNhdGUuSkNBX0NFUlRfSUQpOwogICAgICAgICAgICAgWDUwOUNlcnRpZmljYXRlIGNlcnQgPQotICAgICAgICAgICAgICAgIChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0LmdlbmVyYXRlQ2VydGlmaWNhdGUoaXMpOworICAgICAgICAgICAgICAgIChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0LmdlbmVyYXRlQ2VydGlmaWNhdGUoCisgICAgICAgICAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjZXJ0Ynl0ZXMpCisgICAgICAgICAgICAgICAgKTsKIAogICAgICAgICAgICAgaWYgKGNlcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIHJldHVybiBjZXJ0OwpAQCAtMTE5LDcgKzExOSw3IEBACiAgICAgICogQHJldHVybiB0aGUgcHVibGlja2V5CiAgICAgICogQHRocm93cyBYTUxTZWN1cml0eUV4Y2VwdGlvbgogICAgICAqLwotICAgIHB1YmxpYyBQdWJsaWNLZXkgZ2V0UHVibGljS2V5KCkgdGhyb3dzIFhNTFNlY3VyaXR5RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgcHVibGljIFB1YmxpY0tleSBnZXRQdWJsaWNLZXkoKSB0aHJvd3MgWE1MU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9IHRoaXMuZ2V0WDUwOUNlcnRpZmljYXRlKCk7CiAKICAgICAgICAgaWYgKGNlcnQgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL2NvbnRlbnQveDUwOS9YTUxYNTA5U0tJLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMvY29udGVudC94NTA5L1hNTFg1MDlTS0kuamF2YQppbmRleCAzNjc0YjI5Li5kYTNkN2ZkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMvY29udGVudC94NTA5L1hNTFg1MDlTS0kuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMvY29udGVudC94NTA5L1hNTFg1MDlTS0kuamF2YQpAQCAtMjAsOSArMjAsOSBAQAogCiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5leGNlcHRpb25zLlhNTFNlY3VyaXR5RXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkJhc2U2NDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuU2lnbmF0dXJlRWxlbWVudFByb3h5OwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwpAQCAtMTM0LDcgKzEzNCw3IEBACiAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZXh0ZW5zaW9uVmFsdWUsIDQsIHNraWRWYWx1ZSwgMCwgc2tpZFZhbHVlLmxlbmd0aCk7CiAKICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoIkJhc2U2NCBvZiBTS0kgaXMgIiArIEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKHNraWRWYWx1ZSkpOworICAgICAgICAgICAgbG9nLmRlYnVnKCJCYXNlNjQgb2YgU0tJIGlzICIgKyBCYXNlNjQuZW5jb2RlKHNraWRWYWx1ZSkpOwogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHNraWRWYWx1ZTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkva2V5cy9rZXlyZXNvbHZlci9LZXlSZXNvbHZlclNwaS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL2tleXJlc29sdmVyL0tleVJlc29sdmVyU3BpLmphdmEKaW5kZXggYjJmY2U5YS4uNmVlZmE1NiAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL2tleXJlc29sdmVyL0tleVJlc29sdmVyU3BpLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL2tleXJlc29sdmVyL0tleVJlc29sdmVyU3BpLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmF0ZUtleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwpAQCAtMjcyLDkgKzI3MSw5IEBACiAgICAgICovCiAgICAgcHJvdGVjdGVkIHN0YXRpYyBFbGVtZW50IGdldERvY0Zyb21CeXRlcyhieXRlW10gYnl0ZXMsIGJvb2xlYW4gc2VjdXJlVmFsaWRhdGlvbikgdGhyb3dzIEtleVJlc29sdmVyRXhjZXB0aW9uIHsKICAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGRiID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpIHsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGRiID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlLCBzZWN1cmVWYWxpZGF0aW9uKTsKLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKGlzKTsKKyAgICAgICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpOwogICAgICAgICAgICAgcmV0dXJuIGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgS2V5UmVzb2x2ZXJFeGNlcHRpb24oZXgpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL2tleXJlc29sdmVyL2ltcGxlbWVudGF0aW9ucy9SZXRyaWV2YWxNZXRob2RSZXNvbHZlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL2tleXJlc29sdmVyL2ltcGxlbWVudGF0aW9ucy9SZXRyaWV2YWxNZXRob2RSZXNvbHZlci5qYXZhCmluZGV4IGY0YWIyN2QuLjgxMWRjYzYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkva2V5cy9rZXlyZXNvbHZlci9pbXBsZW1lbnRhdGlvbnMvUmV0cmlldmFsTWV0aG9kUmVzb2x2ZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMva2V5cmVzb2x2ZXIvaW1wbGVtZW50YXRpb25zL1JldHJpZXZhbE1ldGhvZFJlc29sdmVyLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuUHVibGljS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OwpAQCAtMjg0LDkgKzI4Myw5IEBACiAgICAgICAgIC8vIGlmIHRoZSByZXNvdXJjZSBzdG9yZXMgYSByYXcgY2VydGlmaWNhdGUsIHdlIGhhdmUgdG8gaGFuZGxlIGl0CiAgICAgICAgIENlcnRpZmljYXRlRmFjdG9yeSBjZXJ0RmFjdCA9CiAgICAgICAgICAgICBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoWE1MWDUwOUNlcnRpZmljYXRlLkpDQV9DRVJUX0lEKTsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dEJ5dGVzKSkgewotICAgICAgICAgICAgcmV0dXJuIChYNTA5Q2VydGlmaWNhdGUpIGNlcnRGYWN0LmdlbmVyYXRlQ2VydGlmaWNhdGUoaXMpOwotICAgICAgICB9CisgICAgICAgIFg1MDlDZXJ0aWZpY2F0ZSBjZXJ0ID0gKFg1MDlDZXJ0aWZpY2F0ZSkKKyAgICAgICAgICAgIGNlcnRGYWN0LmdlbmVyYXRlQ2VydGlmaWNhdGUobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0Qnl0ZXMpKTsKKyAgICAgICAgcmV0dXJuIGNlcnQ7CiAgICAgfQogCiAgICAgLyoqCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMva2V5cmVzb2x2ZXIvaW1wbGVtZW50YXRpb25zL1g1MDlDZXJ0aWZpY2F0ZVJlc29sdmVyLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMva2V5cmVzb2x2ZXIvaW1wbGVtZW50YXRpb25zL1g1MDlDZXJ0aWZpY2F0ZVJlc29sdmVyLmphdmEKaW5kZXggMDM5N2U5ZS4uNGEzNzhjMyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL2tleXJlc29sdmVyL2ltcGxlbWVudGF0aW9ucy9YNTA5Q2VydGlmaWNhdGVSZXNvbHZlci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkva2V5cy9rZXlyZXNvbHZlci9pbXBsZW1lbnRhdGlvbnMvWDUwOUNlcnRpZmljYXRlUmVzb2x2ZXIuamF2YQpAQCAtMTgsNyArMTgsNiBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMua2V5cmVzb2x2ZXIuaW1wbGVtZW50YXRpb25zOwogCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwogCkBAIC05OSw5ICs5OCw5IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gY2F0Y2ggKFhNTFNlY3VyaXR5RXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfSBjYXRjaCAoWE1MU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiU2VjdXJpdHkgRXhjZXB0aW9uIiwgZXgpOworICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiWE1MU2VjdXJpdHlFeGNlcHRpb24iLCBleCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB0aHJvdyBuZXcgS2V5UmVzb2x2ZXJFeGNlcHRpb24oZXgpOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMvc3RvcmFnZS9pbXBsZW1lbnRhdGlvbnMvQ2VydHNJbkZpbGVzeXN0ZW1EaXJlY3RvcnlSZXNvbHZlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9rZXlzL3N0b3JhZ2UvaW1wbGVtZW50YXRpb25zL0NlcnRzSW5GaWxlc3lzdGVtRGlyZWN0b3J5UmVzb2x2ZXIuamF2YQppbmRleCA1YmFkNzI1Li4wMDg2MDM2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L2tleXMvc3RvcmFnZS9pbXBsZW1lbnRhdGlvbnMvQ2VydHNJbkZpbGVzeXN0ZW1EaXJlY3RvcnlSZXNvbHZlci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkva2V5cy9zdG9yYWdlL2ltcGxlbWVudGF0aW9ucy9DZXJ0c0luRmlsZXN5c3RlbURpcmVjdG9yeVJlc29sdmVyLmphdmEKQEAgLTI5LDEyICsyOSwxMiBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZU5vdFlldFZhbGlkRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuc3RvcmFnZS5TdG9yYWdlUmVzb2x2ZXJFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5zdG9yYWdlLlN0b3JhZ2VSZXNvbHZlclNwaTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5CYXNlNjQ7CiAKIC8qKgogICogVGhpcyB7QGxpbmsgU3RvcmFnZVJlc29sdmVyU3BpfSBtYWtlcyBhbGwgcmF3IChiaW5hcnkpIHtAbGluayBYNTA5Q2VydGlmaWNhdGV9cwpAQCAtMTAwLDcgKzEwMCw5IEBACiAgICAgICAgICAgICBib29sZWFuIGFkZGVkID0gZmFsc2U7CiAgICAgICAgICAgICBTdHJpbmcgZG4gPSBudWxsOwogCi0gICAgICAgICAgICB0cnkgKEZpbGVJbnB1dFN0cmVhbSBmaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKSB7CisgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKICAgICAgICAgICAgICAgICBYNTA5Q2VydGlmaWNhdGUgY2VydCA9CiAgICAgICAgICAgICAgICAgICAgIChYNTA5Q2VydGlmaWNhdGUpIGNmLmdlbmVyYXRlQ2VydGlmaWNhdGUoZmlzKTsKIApAQCAtMTI2LDkgKzEyOCwxNSBAQAogICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkNvdWxkIG5vdCBhZGQgY2VydGlmaWNhdGUgZnJvbSBmaWxlICIgKyBmaWxlbmFtZSwgZXgpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGFkZCBjZXJ0aWZpY2F0ZSBmcm9tIGZpbGUgIiArIGZpbGVuYW1lLCBleCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmaXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlzLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiQ291bGQgbm90IGFkZCBjZXJ0aWZpY2F0ZSBmcm9tIGZpbGUgIiArIGZpbGVuYW1lLCBleCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTIwMiw3ICsyMTAsNyBAQAogCiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oKTsKICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQmFzZTY0KFNLSSgpKT0gICAgICAgICAgICAgICAgIFwiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoc2tpKSArICJcIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgQmFzZTY0LmVuY29kZShza2kpICsgIlwiIik7CiAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImNlcnQuZ2V0U2VyaWFsTnVtYmVyKCk9ICAgICAgICBcIiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNlcnQuZ2V0U2VyaWFsTnVtYmVyKCkudG9TdHJpbmcoKSArICJcIiIpOwogICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjZXJ0LmdldFN1YmplY3RYNTAwUHJpbmNpcGFsKCkuZ2V0TmFtZSgpPSBcIiIKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2lnbmF0dXJlL1JlZmVyZW5jZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zaWduYXR1cmUvUmVmZXJlbmNlLmphdmEKaW5kZXggZjY4YTQ0OS4uNmNiYTZmYyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zaWduYXR1cmUvUmVmZXJlbmNlLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zaWduYXR1cmUvUmVmZXJlbmNlLmphdmEKQEAgLTIyLDcgKzIyLDYgQEAKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CiBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CiBpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwogaW1wb3J0IGphdmEudXRpbC5TZXQ7CkBAIC0zMSw2ICszMCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYWxnb3JpdGhtcy5NZXNzYWdlRGlnZXN0QWxnb3JpdGhtOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmMxNG4uQ2Fub25pY2FsaXphdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5jMTRuLkludmFsaWRDYW5vbmljYWxpemVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmV4Y2VwdGlvbnMuQmFzZTY0RGVjb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZXhjZXB0aW9ucy5YTUxTZWN1cml0eUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUucmVmZXJlbmNlLlJlZmVyZW5jZURhdGE7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc2lnbmF0dXJlLnJlZmVyZW5jZS5SZWZlcmVuY2VOb2RlU2V0RGF0YTsKQEAgLTQxLDYgKzQxLDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLlRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMuVHJhbnNmb3JtczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLnBhcmFtcy5JbmNsdXNpdmVOYW1lc3BhY2VzOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkJhc2U2NDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuRGlnZXN0ZXJPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuU2lnbmF0dXJlRWxlbWVudFByb3h5OwpAQCAtMzg3LDcgKzM4OCw3IEBACiAgICAgICAgICAgICBuID0gbi5nZXROZXh0U2libGluZygpOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIGJhc2U2NGNvZGVkVmFsdWUgPSBCYXNlNjQuZ2V0TWltZUVuY29kZXIoKS5lbmNvZGVUb1N0cmluZyhkaWdlc3RWYWx1ZSk7CisgICAgICAgIFN0cmluZyBiYXNlNjRjb2RlZFZhbHVlID0gQmFzZTY0LmVuY29kZShkaWdlc3RWYWx1ZSk7CiAgICAgICAgIFRleHQgdCA9IGNyZWF0ZVRleHQoYmFzZTY0Y29kZWRWYWx1ZSk7CiAKICAgICAgICAgZGlnZXN0VmFsdWVFbGVtZW50LmFwcGVuZENoaWxkKHQpOwpAQCAtNzA4LDE1ICs3MDksMTYgQEAKICAgICBwcml2YXRlIGJ5dGVbXSBjYWxjdWxhdGVEaWdlc3QoYm9vbGVhbiB2YWxpZGF0aW5nKQogICAgICAgICB0aHJvd3MgUmVmZXJlbmNlTm90SW5pdGlhbGl6ZWRFeGNlcHRpb24sIFhNTFNpZ25hdHVyZUV4Y2VwdGlvbiB7CiAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IGlucHV0ID0gdGhpcy5nZXRDb250ZW50c0JlZm9yZVRyYW5zZm9ybWF0aW9uKCk7Ci0gICAgICAgIGlmIChpbnB1dC5pc1ByZUNhbGN1bGF0ZWREaWdlc3QoKSkgeworICAgICAgICBpZihpbnB1dC5pc1ByZUNhbGN1bGF0ZWREaWdlc3QoKSkgewogICAgICAgICAgICAgcmV0dXJuIGdldFByZUNhbGN1bGF0ZWREaWdlc3QoaW5wdXQpOwogICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBNZXNzYWdlRGlnZXN0QWxnb3JpdGhtIG1kYSA9IHRoaXMuZ2V0TWVzc2FnZURpZ2VzdEFsZ29yaXRobSgpOwotICAgICAgICBtZGEucmVzZXQoKTsKLSAgICAgICAgCi0gICAgICAgIHRyeSAoRGlnZXN0ZXJPdXRwdXRTdHJlYW0gZGlPcyA9IG5ldyBEaWdlc3Rlck91dHB1dFN0cmVhbShtZGEpOwotICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IFVuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtKGRpT3MpKSB7CisgICAgICAgIE91dHB1dFN0cmVhbSBvcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXNzYWdlRGlnZXN0QWxnb3JpdGhtIG1kYSA9IHRoaXMuZ2V0TWVzc2FnZURpZ2VzdEFsZ29yaXRobSgpOworCisgICAgICAgICAgICBtZGEucmVzZXQoKTsKKyAgICAgICAgICAgIERpZ2VzdGVyT3V0cHV0U3RyZWFtIGRpT3MgPSBuZXcgRGlnZXN0ZXJPdXRwdXRTdHJlYW0obWRhKTsKKyAgICAgICAgICAgIG9zID0gbmV3IFVuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtKGRpT3MpOwogICAgICAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgb3V0cHV0ID0gdGhpcy5kZXJlZmVyZW5jZVVSSWFuZFBlcmZvcm1UcmFuc2Zvcm1zKG9zKTsKICAgICAgICAgICAgIC8vIGlmIHNpZ25pbmcgYW5kIGMxNG4xMSBwcm9wZXJ0eSA9PSB0cnVlIGV4cGxpY2l0bHkgYWRkCiAgICAgICAgICAgICAvLyBDMTROMTEgdHJhbnNmb3JtIGlmIG5lZWRlZApAQCAtNzQ2LDYgKzc0OCwxNCBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZU5vdEluaXRpYWxpemVkRXhjZXB0aW9uKGV4KTsKICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSZWZlcmVuY2VOb3RJbml0aWFsaXplZEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAob3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9zLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZU5vdEluaXRpYWxpemVkRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTc1OSw5ICs3NjksMTQgQEAKICAgICAgKi8KICAgICBwcml2YXRlIGJ5dGVbXSBnZXRQcmVDYWxjdWxhdGVkRGlnZXN0KFhNTFNpZ25hdHVyZUlucHV0IGlucHV0KQogICAgICAgICAgICAgdGhyb3dzIFJlZmVyZW5jZU5vdEluaXRpYWxpemVkRXhjZXB0aW9uIHsKLSAgICAgICAgbG9nLmRlYnVnKCJWZXJpZnlpbmcgZWxlbWVudCB3aXRoIHByZS1jYWxjdWxhdGVkIGRpZ2VzdCIpOwotICAgICAgICBTdHJpbmcgcHJlQ2FsY3VsYXRlZERpZ2VzdCA9IGlucHV0LmdldFByZUNhbGN1bGF0ZWREaWdlc3QoKTsKLSAgICAgICAgcmV0dXJuIEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZShwcmVDYWxjdWxhdGVkRGlnZXN0KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZy5kZWJ1ZygiVmVyaWZ5aW5nIGVsZW1lbnQgd2l0aCBwcmUtY2FsY3VsYXRlZCBkaWdlc3QiKTsKKyAgICAgICAgICAgIFN0cmluZyBwcmVDYWxjdWxhdGVkRGlnZXN0ID0gaW5wdXQuZ2V0UHJlQ2FsY3VsYXRlZERpZ2VzdCgpOworICAgICAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGUocHJlQ2FsY3VsYXRlZERpZ2VzdCk7CisgICAgICAgIH0gY2F0Y2ggKEJhc2U2NERlY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGxvZy5lcnJvcigiRmFpbGVkIHRvIGRlY29kZSBwcmUtY2FsY3VsYXRlZCBkaWdlc3QgaW4gYmFzZTY0OiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgdGhyb3cgbmV3IFJlZmVyZW5jZU5vdEluaXRpYWxpemVkRXhjZXB0aW9uKGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgLyoqCkBAIC03NzEsNyArNzg2LDcgQEAKICAgICAgKiBAdGhyb3dzIEJhc2U2NERlY29kaW5nRXhjZXB0aW9uIGlmIFJlZmVyZW5jZSBjb250YWlucyBubyBwcm9wZXIgYmFzZTY0IGVuY29kZWQgZGF0YS4KICAgICAgKiBAdGhyb3dzIFhNTFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBSZWZlcmVuY2UgZG9lcyBub3QgY29udGFpbiBhIERpZ2VzdFZhbHVlIGVsZW1lbnQKICAgICAgKi8KLSAgICBwdWJsaWMgYnl0ZVtdIGdldERpZ2VzdFZhbHVlKCkgdGhyb3dzIFhNTFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgYnl0ZVtdIGdldERpZ2VzdFZhbHVlKCkgdGhyb3dzIEJhc2U2NERlY29kaW5nRXhjZXB0aW9uLCBYTUxTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIGlmIChkaWdlc3RWYWx1ZUVsZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgLy8gVGhlIHJlcXVpcmVkIGVsZW1lbnQgaXMgbm90IGluIHRoZSBYTUwhCiAgICAgICAgICAgICBPYmplY3RbXSBleEFyZ3MgPXsgQ29uc3RhbnRzLl9UQUdfRElHRVNUVkFMVUUsIENvbnN0YW50cy5TaWduYXR1cmVTcGVjTlMgfTsKQEAgLTc3OSw4ICs3OTQsNyBAQAogICAgICAgICAgICAgICAgICJzaWduYXR1cmUuVmVyaWZpY2F0aW9uLk5vU2lnbmF0dXJlRWxlbWVudCIsIGV4QXJncwogICAgICAgICAgICAgKTsKICAgICAgICAgfQotICAgICAgICBTdHJpbmcgY29udGVudCA9IFhNTFV0aWxzLmdldEZ1bGxUZXh0Q2hpbGRyZW5Gcm9tRWxlbWVudChkaWdlc3RWYWx1ZUVsZW1lbnQpOwotICAgICAgICByZXR1cm4gQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQpOworICAgICAgICByZXR1cm4gQmFzZTY0LmRlY29kZShkaWdlc3RWYWx1ZUVsZW1lbnQpOwogICAgIH0KIAogCkBAIC03OTksOCArODEzLDggQEAKIAogICAgICAgICBpZiAoIWVxdWFsKSB7CiAgICAgICAgICAgICBsb2cud2FybigiVmVyaWZpY2F0aW9uIGZhaWxlZCBmb3IgVVJJIFwiIiArIHRoaXMuZ2V0VVJJKCkgKyAiXCIiKTsKLSAgICAgICAgICAgIGxvZy53YXJuKCJFeHBlY3RlZCBEaWdlc3Q6ICIgKyBCYXNlNjQuZ2V0TWltZUVuY29kZXIoKS5lbmNvZGVUb1N0cmluZyhlbGVtRGlnKSk7Ci0gICAgICAgICAgICBsb2cud2FybigiQWN0dWFsIERpZ2VzdDogIiArIEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGNhbGNEaWcpKTsKKyAgICAgICAgICAgIGxvZy53YXJuKCJFeHBlY3RlZCBEaWdlc3Q6ICIgKyBCYXNlNjQuZW5jb2RlKGVsZW1EaWcpKTsKKyAgICAgICAgICAgIGxvZy53YXJuKCJBY3R1YWwgRGlnZXN0OiAiICsgQmFzZTY0LmVuY29kZShjYWxjRGlnKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIlZlcmlmaWNhdGlvbiBzdWNjZXNzZnVsIGZvciBVUkkgXCIiICsgdGhpcy5nZXRVUkkoKSArICJcIiIpOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zaWduYXR1cmUvU2lnbmVkSW5mby5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zaWduYXR1cmUvU2lnbmVkSW5mby5qYXZhCmluZGV4IDcyN2Y3MmUuLmRhNDUzOGYgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2lnbmF0dXJlL1NpZ25lZEluZm8uamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NpZ25hdHVyZS9TaWduZWRJbmZvLmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiBpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKQEAgLTIxNCw4ICsyMTMsOSBAQAogICAgICAgICAgICAgICAgIGJ5dGVbXSBjMTRuaXplZEJ5dGVzID0gYzE0bml6ZXIuY2Fub25pY2FsaXplU3VidHJlZShlbGVtZW50KTsKICAgICAgICAgICAgICAgICBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXIgZGIgPQogICAgICAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UsIHNlY3VyZVZhbGlkYXRpb24pOwotICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYzE0bml6ZWRCeXRlcykpIHsKLSAgICAgICAgICAgICAgICAgICAgRG9jdW1lbnQgbmV3ZG9jID0gZGIucGFyc2UoaXMpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIERvY3VtZW50IG5ld2RvYyA9IGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjMTRuaXplZEJ5dGVzKSk7CiAgICAgICAgICAgICAgICAgICAgIE5vZGUgaW1wb3J0ZWQgPSBlbGVtZW50LmdldE93bmVyRG9jdW1lbnQoKS5pbXBvcnROb2RlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld2RvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZ2V0UGFyZW50Tm9kZSgpLnJlcGxhY2VDaGlsZChpbXBvcnRlZCwgZWxlbWVudCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NpZ25hdHVyZS9YTUxTaWduYXR1cmUuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2lnbmF0dXJlL1hNTFNpZ25hdHVyZS5qYXZhCmluZGV4IGYxOGMxMzAuLjNmZDhjOTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2lnbmF0dXJlL1hNTFNpZ25hdHVyZS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2lnbmF0dXJlL1hNTFNpZ25hdHVyZS5qYXZhCkBAIC0yMyw3ICsyMyw2IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwogCiBpbXBvcnQgamF2YXguY3J5cHRvLlNlY3JldEtleTsKIApAQCAtMzEsMTAgKzMwLDEyIEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYzE0bi5DYW5vbmljYWxpemF0aW9uRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmMxNG4uQ2Fub25pY2FsaXplcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5jMTRuLkludmFsaWRDYW5vbmljYWxpemVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmV4Y2VwdGlvbnMuQmFzZTY0RGVjb2RpbmdFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZXhjZXB0aW9ucy5YTUxTZWN1cml0eUV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLktleUluZm87CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50Llg1MDlEYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMuVHJhbnNmb3JtczsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5CYXNlNjQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkkxOG47CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuU2lnbmF0dXJlRWxlbWVudFByb3h5OwpAQCAtNDg0LDggKzQ4NSwxMSBAQAogICAgICAqIEB0aHJvd3MgWE1MU2lnbmF0dXJlRXhjZXB0aW9uIElmIHRoZXJlIGlzIG5vIGNvbnRlbnQKICAgICAgKi8KICAgICBwdWJsaWMgYnl0ZVtdIGdldFNpZ25hdHVyZVZhbHVlKCkgdGhyb3dzIFhNTFNpZ25hdHVyZUV4Y2VwdGlvbiB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50ID0gWE1MVXRpbHMuZ2V0RnVsbFRleHRDaGlsZHJlbkZyb21FbGVtZW50KHNpZ25hdHVyZVZhbHVlRWxlbWVudCk7Ci0gICAgICAgIHJldHVybiBCYXNlNjQuZ2V0TWltZURlY29kZXIoKS5kZWNvZGUoY29udGVudCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQmFzZTY0LmRlY29kZShzaWduYXR1cmVWYWx1ZUVsZW1lbnQpOworICAgICAgICB9IGNhdGNoIChCYXNlNjREZWNvZGluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFNpZ25hdHVyZUV4Y2VwdGlvbihleCwgImVtcHR5Iik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKQEAgLTUwMCw3ICs1MDQsNyBAQAogICAgICAgICAgICAgc2lnbmF0dXJlVmFsdWVFbGVtZW50LnJlbW92ZUNoaWxkKHNpZ25hdHVyZVZhbHVlRWxlbWVudC5nZXRGaXJzdENoaWxkKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgU3RyaW5nIGJhc2U2NGNvZGVkVmFsdWUgPSBCYXNlNjQuZ2V0TWltZUVuY29kZXIoKS5lbmNvZGVUb1N0cmluZyhieXRlcyk7CisgICAgICAgIFN0cmluZyBiYXNlNjRjb2RlZFZhbHVlID0gQmFzZTY0LmVuY29kZShieXRlcyk7CiAKICAgICAgICAgaWYgKGJhc2U2NGNvZGVkVmFsdWUubGVuZ3RoKCkgPiA3NiAmJiAhWE1MVXRpbHMuaWdub3JlTGluZUJyZWFrcygpKSB7CiAgICAgICAgICAgICBiYXNlNjRjb2RlZFZhbHVlID0gIlxuIiArIGJhc2U2NGNvZGVkVmFsdWUgKyAiXG4iOwpAQCAtNjE0LDIxICs2MTgsMzUgQEAKICAgICAgICAgICAgICk7CiAgICAgICAgIH0KIAotICAgICAgICAvL0NyZWF0ZSBhIFNpZ25hdHVyZUFsZ29yaXRobSBvYmplY3QKLSAgICAgICAgU2lnbmVkSW5mbyBzaSA9IHRoaXMuZ2V0U2lnbmVkSW5mbygpOwotICAgICAgICBTaWduYXR1cmVBbGdvcml0aG0gc2EgPSBzaS5nZXRTaWduYXR1cmVBbGdvcml0aG0oKTsKLSAgICAgICAgdHJ5IChTaWduZXJPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IFNpZ25lck91dHB1dFN0cmVhbShzYSk7Ci0gICAgICAgICAgICBPdXRwdXRTdHJlYW0gc28gPSBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0ob3V0cHV0KSkgewotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBnZW5lcmF0ZSBkaWdlc3QgdmFsdWVzIGZvciBhbGwgUmVmZXJlbmNlcyBpbiB0aGlzIFNpZ25lZEluZm8KLSAgICAgICAgICAgIHNpLmdlbmVyYXRlRGlnZXN0VmFsdWVzKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvL0NyZWF0ZSBhIFNpZ25hdHVyZUFsZ29yaXRobSBvYmplY3QKKyAgICAgICAgICAgIFNpZ25lZEluZm8gc2kgPSB0aGlzLmdldFNpZ25lZEluZm8oKTsKKyAgICAgICAgICAgIFNpZ25hdHVyZUFsZ29yaXRobSBzYSA9IHNpLmdldFNpZ25hdHVyZUFsZ29yaXRobSgpOworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHNvID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgZGlnZXN0IHZhbHVlcyBmb3IgYWxsIFJlZmVyZW5jZXMgaW4gdGhpcyBTaWduZWRJbmZvCisgICAgICAgICAgICAgICAgc2kuZ2VuZXJhdGVEaWdlc3RWYWx1ZXMoKTsKIAotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBTaWduYXR1cmVBbGdvcml0aG0gZm9yIHNpZ25pbmcKLSAgICAgICAgICAgIHNhLmluaXRTaWduKHNpZ25pbmdLZXkpOworICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemUgU2lnbmF0dXJlQWxnb3JpdGhtIGZvciBzaWduaW5nCisgICAgICAgICAgICAgICAgc2EuaW5pdFNpZ24oc2lnbmluZ0tleSk7CiAKLSAgICAgICAgICAgIC8vIGdldCB0aGUgY2Fub25pY2FsaXplZCBieXRlcyBmcm9tIFNpZ25lZEluZm8KLSAgICAgICAgICAgIHNpLnNpZ25Jbk9jdGV0U3RyZWFtKHNvKTsKLSAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIHNvID0gbmV3IFVuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBTaWduZXJPdXRwdXRTdHJlYW0oc2EpKTsKKyAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNhbm9uaWNhbGl6ZWQgYnl0ZXMgZnJvbSBTaWduZWRJbmZvCisgICAgICAgICAgICAgICAgc2kuc2lnbkluT2N0ZXRTdHJlYW0oc28pOworICAgICAgICAgICAgfSBjYXRjaCAoWE1MU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgaWYgKHNvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIHNldCB0aGVtIG9uIHRoZSBTaWduYXR1cmVWYWx1ZSBlbGVtZW50CiAgICAgICAgICAgICB0aGlzLnNldFNpZ25hdHVyZVZhbHVlRWxlbWVudChzYS5zaWduKCkpOwogICAgICAgICB9IGNhdGNoIChYTUxTaWduYXR1cmVFeGNlcHRpb24gZXgpIHsKQEAgLTYzOSw4ICs2NTcsNiBAQAogICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFNpZ25hdHVyZUV4Y2VwdGlvbihleCk7CiAgICAgICAgIH0gY2F0Y2ggKFhNTFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU2lnbmF0dXJlRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBYTUxTaWduYXR1cmVFeGNlcHRpb24oZXgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MTksMTIgKzczNSwxMyBAQAogICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZygiUHVibGljS2V5ID0gIiArIHBrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJ5dGUgc2lnQnl0ZXNbXSA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKFNpZ25lck91dHB1dFN0cmVhbSBzbyA9IG5ldyBTaWduZXJPdXRwdXRTdHJlYW0oc2EpOwotICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBib3MgPSBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oc28pKSB7Ci0gICAgICAgICAgICAgICAgCisgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgIHNhLmluaXRWZXJpZnkocGspOwogCiAgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBjYW5vbmljYWxpemVkIChub3JtYWxpemVkKSBTaWduZWRJbmZvCisgICAgICAgICAgICAgICAgU2lnbmVyT3V0cHV0U3RyZWFtIHNvID0gbmV3IFNpZ25lck91dHB1dFN0cmVhbShzYSk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBVbnN5bmNCdWZmZXJlZE91dHB1dFN0cmVhbShzbyk7CisKICAgICAgICAgICAgICAgICBzaS5zaWduSW5PY3RldFN0cmVhbShib3MpOwogICAgICAgICAgICAgICAgIGJvcy5jbG9zZSgpOwogICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIHRoZSBieXRlW10gZnJvbSB0aGUgc3RvcmVkIHNpZ25hdHVyZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zaWduYXR1cmUvWE1MU2lnbmF0dXJlSW5wdXQuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2lnbmF0dXJlL1hNTFNpZ25hdHVyZUlucHV0LmphdmEKaW5kZXggMjA2NDFhOC4uZjNhMDk5ZiAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zaWduYXR1cmUvWE1MU2lnbmF0dXJlSW5wdXQuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3NpZ25hdHVyZS9YTUxTaWduYXR1cmVJbnB1dC5qYXZhCkBAIC01NzgsMjAgKzU3OCwxNiBAQAogICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UodGhpcy5nZXRPY3RldFN0cmVhbSgpKTsKICAgICAgICAgICAgIHRoaXMuc3ViTm9kZSA9IGRvYzsKICAgICAgICAgfSBjYXRjaCAoU0FYRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBieXRlW10gcmVzdWx0ID0gbnVsbDsKICAgICAgICAgICAgIC8vIGlmIGEgbm90LXdlbGxmb3JtZWQgbm9kZXNldCBleGlzdHMsIHB1dCBhIGNvbnRhaW5lciBhcm91bmQgaXQuLi4KLSAgICAgICAgICAgIHRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCi0gICAgICAgICAgICAgICAgYmFvcy53cml0ZSgiPGNvbnRhaW5lcj4iLmdldEJ5dGVzKCJVVEYtOCIpKTsKLSAgICAgICAgICAgICAgICBiYW9zLndyaXRlKHRoaXMuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgYmFvcy53cml0ZSgiPC9jb250YWluZXI+Ii5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgICAgICBiYW9zLndyaXRlKCI8Y29udGFpbmVyPiIuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICAgICAgYmFvcy53cml0ZSh0aGlzLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgYmFvcy53cml0ZSgiPC9jb250YWluZXI+Ii5nZXRCeXRlcygiVVRGLTgiKSk7CiAKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBiYW9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3VsdCkpIHsKLSAgICAgICAgICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgICAgICAgICB0aGlzLnN1Yk5vZGUgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRGaXJzdENoaWxkKCkuZ2V0Rmlyc3RDaGlsZCgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgYnl0ZSByZXN1bHRbXSA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHJlc3VsdCkpOworICAgICAgICAgICAgdGhpcy5zdWJOb2RlID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpLmdldEZpcnN0Q2hpbGQoKTsKICAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgICAgIFhNTFV0aWxzLnJlcG9vbERvY3VtZW50QnVpbGRlcihkYik7CiAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dE9jdGV0U3RyZWFtUHJveHkgIT0gbnVsbCkgewpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvcHJvY2Vzc29yL2lucHV0L0Fic3RyYWN0RGVjcnlwdElucHV0UHJvY2Vzc29yLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3IvaW5wdXQvQWJzdHJhY3REZWNyeXB0SW5wdXRQcm9jZXNzb3IuamF2YQppbmRleCA5ZWI1ZjA4Li5lYmU0NzAyIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3IvaW5wdXQvQWJzdHJhY3REZWNyeXB0SW5wdXRQcm9jZXNzb3IuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3IvaW5wdXQvQWJzdHJhY3REZWNyeXB0SW5wdXRQcm9jZXNzb3IuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguc2VjdXJpdHlUb2tlbi5JbmJvdW5kU2VjdXJpdHlUb2tlbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LnNlY3VyaXR5VG9rZW4uU2VjdXJpdHlUb2tlbkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LnNlY3VyaXR5VG9rZW4uU2VjdXJpdHlUb2tlblByb3ZpZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlVuc3luY0J5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IG9yZy5zbGY0ai5Mb2dnZXI7CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlckZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuYmluZGluZy54bWxkc2lnLktleUluZm9UeXBlOwpAQCAtMzQ4LDcgKzM0Nyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgnPicpOwotICAgICAgICByZXR1cm4gbmV3IFVuc3luY0J5dGVBcnJheUlucHV0U3RyZWFtKHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgIHJldHVybiBuZXcgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04IikpOwogICAgIH0KIAogICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gd3JpdGVXcmFwcGVyRW5kRWxlbWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CkBAIC0zNTksNyArMzU4LDcgQEAKICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoJzonKTsKICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQod3JhcHBlckVsZW1lbnROYW1lLmdldExvY2FsUGFydCgpKTsKICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoJz4nKTsKLSAgICAgICAgcmV0dXJuIG5ldyBVbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHJpbmdCdWlsZGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04IikpOworICAgICAgICByZXR1cm4gbmV3IFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0oc3RyaW5nQnVpbGRlci50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpKTsKICAgICB9CiAKICAgICBwcml2YXRlIHZvaWQgZm9yd2FyZFRvV3JhcHBlckVsZW1lbnQoWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3IvaW5wdXQvQWJzdHJhY3RTaWduYXR1cmVJbnB1dEhhbmRsZXIuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3Byb2Nlc3Nvci9pbnB1dC9BYnN0cmFjdFNpZ25hdHVyZUlucHV0SGFuZGxlci5qYXZhCmluZGV4IGZjMmRhNTIuLjE0N2YyMGIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3Byb2Nlc3Nvci9pbnB1dC9BYnN0cmFjdFNpZ25hdHVyZUlucHV0SGFuZGxlci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3Byb2Nlc3Nvci9pbnB1dC9BYnN0cmFjdFNpZ25hdHVyZUlucHV0SGFuZGxlci5qYXZhCkBAIC0yNiw5ICsyNiw2IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5leHQuKjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudHJhbnNmb3JtZXIuY2Fub25pY2FsaXplci5DYW5vbmljYWxpemVyMjAwMTAzMTVfRXhjbDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LnNlY3VyaXR5VG9rZW4uSW5ib3VuZFNlY3VyaXR5VG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuVW5zeW5jQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguZXh0LnN0YXguWE1MU2VjRXZlbnQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5leHQuc3RheC5YTUxTZWNFdmVudEZhY3Rvcnk7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLmFsZ29yaXRobXMuU2lnbmF0dXJlQWxnb3JpdGhtOwpAQCAtNDEsNyArMzgsNiBAQAogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKQEAgLTE1MCwyMiArMTQ2LDIzIEBACiAKICAgICAgICAgRGVxdWU8WE1MU2VjRXZlbnQ+IHNpZ25lZEluZm9EZXF1ZSA9IG5ldyBBcnJheURlcXVlPFhNTFNlY0V2ZW50PigpOwogCi0gICAgICAgIHRyeSAoVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7Ci0gICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFhNTFNlY3VyaXR5VXRpbHMuZ2V0VHJhbnNmb3JtZXIoCi0gICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgIHVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVUeXBlLmdldFNpZ25lZEluZm8oKS5nZXRDYW5vbmljYWxpemF0aW9uTWV0aG9kKCkuZ2V0QWxnb3JpdGhtKCksCi0gICAgICAgICAgICAgICAgICAgIFhNTFNlY3VyaXR5Q29uc3RhbnRzLkRJUkVDVElPTi5JTik7Ci0gICAgCi0gICAgICAgICAgICBJdGVyYXRvcjxYTUxTZWNFdmVudD4gaXRlcmF0b3IgPSBldmVudERlcXVlLmRlc2NlbmRpbmdJdGVyYXRvcigpOwotICAgICAgICAgICAgLy9mb3J3YXJkIHRvIDxTaWduYXR1cmU+IEVsZW1lbnQKLSAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChpIDwgaW5kZXgpIHsKLSAgICAgICAgICAgICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgfQorICAgICAgICBVbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSB1bnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFhNTFNlY3VyaXR5VXRpbHMuZ2V0VHJhbnNmb3JtZXIoCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICB1bnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIHNpZ25hdHVyZVR5cGUuZ2V0U2lnbmVkSW5mbygpLmdldENhbm9uaWNhbGl6YXRpb25NZXRob2QoKS5nZXRBbGdvcml0aG0oKSwKKyAgICAgICAgICAgICAgICBYTUxTZWN1cml0eUNvbnN0YW50cy5ESVJFQ1RJT04uSU4pOwogCisgICAgICAgIEl0ZXJhdG9yPFhNTFNlY0V2ZW50PiBpdGVyYXRvciA9IGV2ZW50RGVxdWUuZGVzY2VuZGluZ0l0ZXJhdG9yKCk7CisgICAgICAgIC8vZm9yd2FyZCB0byA8U2lnbmF0dXJlPiBFbGVtZW50CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCBpbmRleCkgeworICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIGxvb3A6CiAgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CiAgICAgICAgICAgICAgICAgWE1MU2VjRXZlbnQgeG1sU2VjRXZlbnQgPSBpdGVyYXRvci5uZXh0KCk7CkBAIC0xOTQsMjUgKzE5MSwyNCBAQAogCiAgICAgICAgICAgICB0cmFuc2Zvcm1lci5kb0ZpbmFsKCk7CiAKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgVW5zeW5jQnl0ZUFycmF5SW5wdXRTdHJlYW0odW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gaW5wdXRQcm9jZXNzb3JDaGFpbi5nZXRTZWN1cml0eUNvbnRleHQoKS4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxYTUxJbnB1dEZhY3Rvcnk+Z2V0KFhNTFNlY3VyaXR5Q29uc3RhbnRzLlhNTElOUFVURkFDVE9SWSkuCi0gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgIAotICAgICAgICAgICAgICAgIHdoaWxlICh4bWxTdHJlYW1SZWFkZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFhNTFNlY0V2ZW50IHhtbFNlY0V2ZW50ID0gWE1MU2VjRXZlbnRGYWN0b3J5LmFsbG9jYXRlKHhtbFN0cmVhbVJlYWRlciwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIHNpZ25lZEluZm9EZXF1ZS5wdXNoKHhtbFNlY0V2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgCi0gICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICAgICAgICAgICAgZmluYWwgU2lnbmVkSW5mb1R5cGUgc2lnbmVkSW5mb1R5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKChKQVhCRWxlbWVudDxTaWduZWRJbmZvVHlwZT4pIHBhcnNlU3RydWN0dXJlKHNpZ25lZEluZm9EZXF1ZSwgMCwgc2VjdXJpdHlQcm9wZXJ0aWVzKSkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBzaWduYXR1cmVUeXBlLnNldFNpZ25lZEluZm8oc2lnbmVkSW5mb1R5cGUpOwotICAgIAotICAgICAgICAgICAgICAgIHJldHVybiBzaWduZWRJbmZvRGVxdWU7CisgICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gaW5wdXRQcm9jZXNzb3JDaGFpbi5nZXRTZWN1cml0eUNvbnRleHQoKS4KKyAgICAgICAgICAgICAgICAgICAgPFhNTElucHV0RmFjdG9yeT5nZXQoWE1MU2VjdXJpdHlDb25zdGFudHMuWE1MSU5QVVRGQUNUT1JZKS4KKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtKHVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKTsKKworICAgICAgICAgICAgd2hpbGUgKHhtbFN0cmVhbVJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBYTUxTZWNFdmVudCB4bWxTZWNFdmVudCA9IFhNTFNlY0V2ZW50RmFjdG9yeS5hbGxvY2F0ZSh4bWxTdHJlYW1SZWFkZXIsIG51bGwpOworICAgICAgICAgICAgICAgIHNpZ25lZEluZm9EZXF1ZS5wdXNoKHhtbFNlY0V2ZW50KTsKKyAgICAgICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIubmV4dCgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgZmluYWwgU2lnbmVkSW5mb1R5cGUgc2lnbmVkSW5mb1R5cGUgPQorICAgICAgICAgICAgICAgICAgICAoKEpBWEJFbGVtZW50PFNpZ25lZEluZm9UeXBlPikgcGFyc2VTdHJ1Y3R1cmUoc2lnbmVkSW5mb0RlcXVlLCAwLCBzZWN1cml0eVByb3BlcnRpZXMpKS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgc2lnbmF0dXJlVHlwZS5zZXRTaWduZWRJbmZvKHNpZ25lZEluZm9UeXBlKTsKKworICAgICAgICAgICAgcmV0dXJuIHNpZ25lZEluZm9EZXF1ZTsKKworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkgewogICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFNlY3VyaXR5RXhjZXB0aW9uKGUpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzA5LDcgKzMwNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobVVSSSk7CiAgICAgICAgICAgICAgICAgc2lnbmF0dXJlQWxnb3JpdGhtLmVuZ2luZUluaXRWZXJpZnkodmVyaWZ5S2V5KTsKICAgICAgICAgICAgICAgICBzaWduZXJPdXRwdXRTdHJlYW0gPSBuZXcgU2lnbmVyT3V0cHV0U3RyZWFtKHNpZ25hdHVyZUFsZ29yaXRobSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyZWRTaWduZXJPdXRwdXRTdHJlYW0gPSBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oc2lnbmVyT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICBidWZmZXJlZFNpZ25lck91dHB1dFN0cmVhbSA9IG5ldyBVbnN5bmNocm9uaXplZEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNpZ25lck91dHB1dFN0cmVhbSk7CiAKICAgICAgICAgICAgICAgICBmaW5hbCBDYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSBjYW5vbmljYWxpemF0aW9uTWV0aG9kVHlwZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVUeXBlLmdldFNpZ25lZEluZm8oKS5nZXRDYW5vbmljYWxpemF0aW9uTWV0aG9kKCk7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3IvaW5wdXQvQWJzdHJhY3RTaWduYXR1cmVSZWZlcmVuY2VWZXJpZnlJbnB1dFByb2Nlc3Nvci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvcHJvY2Vzc29yL2lucHV0L0Fic3RyYWN0U2lnbmF0dXJlUmVmZXJlbmNlVmVyaWZ5SW5wdXRQcm9jZXNzb3IuamF2YQppbmRleCAwYjJiYWUzLi43ZWE3MWFhIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3IvaW5wdXQvQWJzdHJhY3RTaWduYXR1cmVSZWZlcmVuY2VWZXJpZnlJbnB1dFByb2Nlc3Nvci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3Byb2Nlc3Nvci9pbnB1dC9BYnN0cmFjdFNpZ25hdHVyZVJlZmVyZW5jZVZlcmlmeUlucHV0UHJvY2Vzc29yLmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29kZWMuYmluYXJ5LkJhc2U2NDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudHJhbnNmb3JtZXIuY2Fub25pY2FsaXplci5DYW5vbmljYWxpemVyMjAwMTAzMTVfRXhjbDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LnNlY3VyaXR5VG9rZW4uSW5ib3VuZFNlY3VyaXR5VG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLnNsZjRqLkxvZ2dlcjsKIGltcG9ydCBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5iaW5kaW5nLmV4Y2MxNG4uSW5jbHVzaXZlTmFtZXNwYWNlczsKQEAgLTQwLDYgKzM5LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbC5EaWdlc3RPdXRwdXRTdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnV0aWwuSURHZW5lcmF0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnV0aWwuS2V5VmFsdWU7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnV0aWwuVW5zeW5jaHJvbml6ZWRCdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LnNlY3VyaXR5RXZlbnQuQWxnb3JpdGhtU3VpdGVTZWN1cml0eUV2ZW50OwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKQEAgLTI2MCwxMSArMjYwLDEyIEBACiAgICAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5RXh0ZXJuYWxSZWZlcmVuY2UoSW5wdXRQcm9jZXNzb3JDaGFpbiBpbnB1dFByb2Nlc3NvckNoYWluLCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlVHlwZSByZWZlcmVuY2VUeXBlKSB0aHJvd3MgWE1MU2VjdXJpdHlFeGNlcHRpb24sIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CiAKLSAgICAgICAgdHJ5IChCdWZmZXJlZElucHV0U3RyZWFtIGJ1ZmZlcmVkSW5wdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7CisgICAgICAgIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYnVmZmVyZWRJbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGlucHV0U3RyZWFtKTsKKyAgICAgICAgdHJ5IHsKICAgICAgICAgICAgIERpZ2VzdE91dHB1dFN0cmVhbSBkaWdlc3RPdXRwdXRTdHJlYW0gPQogICAgICAgICAgICAgICAgICAgICBjcmVhdGVNZXNzYWdlRGlnZXN0T3V0cHV0U3RyZWFtKHJlZmVyZW5jZVR5cGUsIGlucHV0UHJvY2Vzc29yQ2hhaW4uZ2V0U2VjdXJpdHlDb250ZXh0KCkpOwotICAgICAgICAgICAgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0gYnVmZmVyZWREaWdlc3RPdXRwdXRTdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGlnZXN0T3V0cHV0U3RyZWFtKSkgeworICAgICAgICAgICAgVW5zeW5jaHJvbml6ZWRCdWZmZXJlZE91dHB1dFN0cmVhbSBidWZmZXJlZERpZ2VzdE91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBVbnN5bmNocm9uaXplZEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKGRpZ2VzdE91dHB1dFN0cmVhbSk7CiAKICAgICAgICAgICAgIGlmIChyZWZlcmVuY2VUeXBlLmdldFRyYW5zZm9ybXMoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPQpAQCAtMjc4LDYgKzI3OSwxMiBAQAogICAgICAgICAgICAgY29tcGFyZURpZ2VzdChkaWdlc3RPdXRwdXRTdHJlYW0uZ2V0RGlnZXN0VmFsdWUoKSwgcmVmZXJlbmNlVHlwZSk7CiAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTZWN1cml0eUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnVmZmVyZWRJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZy53YXJuKCJDb3VsZCBub3QgY2xvc2UgZXh0ZXJuYWwgcmVzb3VyY2UgaW5wdXQgc3RyZWFtLCBpZ25vcmVkLiIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC00MTUsNyArNDIyLDcgQEAKICAgICAgICAgICAgIHRoaXMuc2V0U3RhcnRFbGVtZW50KHN0YXJ0RWxlbWVudCk7CiAgICAgICAgICAgICB0aGlzLnNldFJlZmVyZW5jZVR5cGUocmVmZXJlbmNlVHlwZSk7CiAgICAgICAgICAgICB0aGlzLmRpZ2VzdE91dHB1dFN0cmVhbSA9IGNyZWF0ZU1lc3NhZ2VEaWdlc3RPdXRwdXRTdHJlYW0ocmVmZXJlbmNlVHlwZSwgaW5wdXRQcm9jZXNzb3JDaGFpbi5nZXRTZWN1cml0eUNvbnRleHQoKSk7Ci0gICAgICAgICAgICB0aGlzLmJ1ZmZlcmVkRGlnZXN0T3V0cHV0U3RyZWFtID0gbmV3IFVuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtKHRoaXMuZ2V0RGlnZXN0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgdGhpcy5idWZmZXJlZERpZ2VzdE91dHB1dFN0cmVhbSA9IG5ldyBVbnN5bmNocm9uaXplZEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHRoaXMuZ2V0RGlnZXN0T3V0cHV0U3RyZWFtKCkpOwogICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IGJ1aWxkVHJhbnNmb3JtZXJDaGFpbihyZWZlcmVuY2VUeXBlLCBidWZmZXJlZERpZ2VzdE91dHB1dFN0cmVhbSwgaW5wdXRQcm9jZXNzb3JDaGFpbik7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvcHJvY2Vzc29yL2lucHV0L1hNTEVuY3J5cHRlZEtleUlucHV0SGFuZGxlci5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvcHJvY2Vzc29yL2lucHV0L1hNTEVuY3J5cHRlZEtleUlucHV0SGFuZGxlci5qYXZhCmluZGV4IDgzMWUzMDAuLjVkZWY1NzQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3Byb2Nlc3Nvci9pbnB1dC9YTUxFbmNyeXB0ZWRLZXlJbnB1dEhhbmRsZXIuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3IvaW5wdXQvWE1MRW5jcnlwdGVkS2V5SW5wdXRIYW5kbGVyLmphdmEKQEAgLTM2LDYgKzM2LDcgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbC5JREdlbmVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LnNlY3VyaXR5RXZlbnQuQWxnb3JpdGhtU3VpdGVTZWN1cml0eUV2ZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguc2VjdXJpdHlFdmVudC5FbmNyeXB0ZWRLZXlUb2tlblNlY3VyaXR5RXZlbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogCiBpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKIGltcG9ydCBqYXZheC5jcnlwdG8uTm9TdWNoUGFkZGluZ0V4Y2VwdGlvbjsKQEAgLTQ2LDcgKzQ3LDYgQEAKIAogaW1wb3J0IGphdmEuc2VjdXJpdHkuKjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuTUdGMVBhcmFtZXRlclNwZWM7Ci1pbXBvcnQgamF2YS51dGlsLkJhc2U2NDsKIGltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CiAKIC8qKgpAQCAtMjM0LDcgKzIzNCw3IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBzaGExQnl0ZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlRGlnZXN0KGVuY3J5cHRlZEtleVR5cGUuZ2V0Q2lwaGVyRGF0YSgpLmdldENpcGhlclZhbHVlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNoYTFJZGVudGlmaWVyID0gQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoc2hhMUJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzaGExSWRlbnRpZmllciA9IEJhc2U2NC5lbmNvZGUoc2hhMUJ5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNldFNoYTFJZGVudGlmaWVyKHNoYTFJZGVudGlmaWVyKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3Byb2Nlc3Nvci9vdXRwdXQvQWJzdHJhY3RTaWduYXR1cmVFbmRpbmdPdXRwdXRQcm9jZXNzb3IuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3Byb2Nlc3Nvci9vdXRwdXQvQWJzdHJhY3RTaWduYXR1cmVFbmRpbmdPdXRwdXRQcm9jZXNzb3IuamF2YQppbmRleCA3NzQ4MDNkLi5hY2NjYzdlIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3Ivb3V0cHV0L0Fic3RyYWN0U2lnbmF0dXJlRW5kaW5nT3V0cHV0UHJvY2Vzc29yLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvcHJvY2Vzc29yL291dHB1dC9BYnN0cmFjdFNpZ25hdHVyZUVuZGluZ091dHB1dFByb2Nlc3Nvci5qYXZhCkBAIC00NCwxMCArNDQsMTAgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudHJhbnNmb3JtZXIuY2Fub25pY2FsaXplci5DYW5vbmljYWxpemVyMjAwMTAzMTVfRXhjbDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbC5JREdlbmVyYXRvcjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbC5TaWduZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnV0aWwuVW5zeW5jaHJvbml6ZWRCdWZmZXJlZE91dHB1dFN0cmVhbTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LnNlY3VyaXR5VG9rZW4uT3V0Ym91bmRTZWN1cml0eVRva2VuOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguc2VjdXJpdHlUb2tlbi5TZWN1cml0eVRva2VuQ29uc3RhbnRzOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguc2VjdXJpdHlUb2tlbi5TZWN1cml0eVRva2VuUHJvdmlkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW07CiAKIC8qKgogICogQGF1dGhvciAkQXV0aG9yJApAQCAtMjQyLDcgKzI0Miw3IEBACiAgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoT3V0cHV0UHJvY2Vzc29yQ2hhaW4gb3V0cHV0UHJvY2Vzc29yQ2hhaW4pIHRocm93cyBYTUxTZWN1cml0eUV4Y2VwdGlvbiB7CiAKICAgICAgICAgICAgIHRoaXMuc2lnbmVyT3V0cHV0U3RyZWFtID0gbmV3IFNpZ25lck91dHB1dFN0cmVhbSh0aGlzLnNpZ25hdHVyZUFsZ29yaXRobSk7Ci0gICAgICAgICAgICB0aGlzLmJ1ZmZlcmVkU2lnbmVyT3V0cHV0U3RyZWFtID0gbmV3IFVuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtKHRoaXMuc2lnbmVyT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyZWRTaWduZXJPdXRwdXRTdHJlYW0gPSBuZXcgVW5zeW5jaHJvbml6ZWRCdWZmZXJlZE91dHB1dFN0cmVhbSh0aGlzLnNpZ25lck91dHB1dFN0cmVhbSk7CiAKICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjYW5vbmljYWxpemF0aW9uQWxnb3JpdGhtID0gZ2V0U2VjdXJpdHlQcm9wZXJ0aWVzKCkuZ2V0U2lnbmF0dXJlQ2Fub25pY2FsaXphdGlvbkFsZ29yaXRobSgpOwogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3Ivb3V0cHV0L0Fic3RyYWN0U2lnbmF0dXJlT3V0cHV0UHJvY2Vzc29yLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9wcm9jZXNzb3Ivb3V0cHV0L0Fic3RyYWN0U2lnbmF0dXJlT3V0cHV0UHJvY2Vzc29yLmphdmEKaW5kZXggOTUxMzM5Yy4uNWFlNDUyOCAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvcHJvY2Vzc29yL291dHB1dC9BYnN0cmFjdFNpZ25hdHVyZU91dHB1dFByb2Nlc3Nvci5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3Byb2Nlc3Nvci9vdXRwdXQvQWJzdHJhY3RTaWduYXR1cmVPdXRwdXRQcm9jZXNzb3IuamF2YQpAQCAtMzEsNyArMzEsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguaW1wbC5TaWduYXR1cmVQYXJ0RGVmOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguaW1wbC50cmFuc2Zvcm1lci5UcmFuc2Zvcm1JZGVudGl0eTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbC5EaWdlc3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnV0aWwuVW5zeW5jaHJvbml6ZWRCdWZmZXJlZE91dHB1dFN0cmVhbTsKIAogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwpAQCAtMjY2LDcgKzI2Niw3IEBACiAgICAgICAgIEBPdmVycmlkZQogICAgICAgICBwdWJsaWMgdm9pZCBpbml0KE91dHB1dFByb2Nlc3NvckNoYWluIG91dHB1dFByb2Nlc3NvckNoYWluKSB0aHJvd3MgWE1MU2VjdXJpdHlFeGNlcHRpb24gewogICAgICAgICAgICAgdGhpcy5kaWdlc3RPdXRwdXRTdHJlYW0gPSBjcmVhdGVNZXNzYWdlRGlnZXN0T3V0cHV0U3RyZWFtKHNpZ25hdHVyZVBhcnREZWYuZ2V0RGlnZXN0QWxnbygpKTsKLSAgICAgICAgICAgIHRoaXMuYnVmZmVyZWREaWdlc3RPdXRwdXRTdHJlYW0gPSBuZXcgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oZGlnZXN0T3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyZWREaWdlc3RPdXRwdXRTdHJlYW0gPSBuZXcgVW5zeW5jaHJvbml6ZWRCdWZmZXJlZE91dHB1dFN0cmVhbShkaWdlc3RPdXRwdXRTdHJlYW0pOwogICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lciA9IGJ1aWxkVHJhbnNmb3JtZXJDaGFpbih0aGlzLmJ1ZmZlcmVkRGlnZXN0T3V0cHV0U3RyZWFtLCBzaWduYXR1cmVQYXJ0RGVmLCB4bWxTZWNTdGFydEVsZW1lbnQpOwogICAgICAgICAgICAgc3VwZXIuaW5pdChvdXRwdXRQcm9jZXNzb3JDaGFpbik7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3NlY3VyaXR5VG9rZW4vU2VjdXJpdHlUb2tlbkZhY3RvcnlJbXBsLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC9zZWN1cml0eVRva2VuL1NlY3VyaXR5VG9rZW5GYWN0b3J5SW1wbC5qYXZhCmluZGV4IDMxNmZhYmIuLmI0M2U4YzAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3NlY3VyaXR5VG9rZW4vU2VjdXJpdHlUb2tlbkZhY3RvcnlJbXBsLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvc2VjdXJpdHlUb2tlbi9TZWN1cml0eVRva2VuRmFjdG9yeUltcGwuamF2YQpAQCAtMjcsMTAgKzI3LDkgQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LnNlY3VyaXR5VG9rZW4uSW5ib3VuZFNlY3VyaXR5VG9rZW47CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5zZWN1cml0eVRva2VuLlNlY3VyaXR5VG9rZW5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5zZWN1cml0eVRva2VuLlNlY3VyaXR5VG9rZW5GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguaW1wbC51dGlsLlVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuUkZDMjI1M1BhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5VbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbTsKIAotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LlB1YmxpY0tleTsKQEAgLTI4OCwxMCArMjg3LDExIEBACiAgICAgICovCiAgICAgcHJpdmF0ZSBzdGF0aWMgWDUwOUNlcnRpZmljYXRlIGdldENlcnRpZmljYXRlRnJvbUJ5dGVzKGJ5dGVbXSBkYXRhKQogICAgICAgICAgICAgdGhyb3dzIFhNTFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpbiA9IG5ldyBVbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSkgeworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpOworICAgICAgICB0cnkgewogICAgICAgICAgICAgQ2VydGlmaWNhdGVGYWN0b3J5IGZhY3RvcnkgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5Iik7CiAgICAgICAgICAgICByZXR1cm4gKFg1MDlDZXJ0aWZpY2F0ZSkgZmFjdG9yeS5nZW5lcmF0ZUNlcnRpZmljYXRlKGluKTsKLSAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gfCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0gY2F0Y2ggKENlcnRpZmljYXRlRXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTZWN1cml0eUV4Y2VwdGlvbihlKTsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3RyYW5zZm9ybWVyL1RyYW5zZm9ybUJhc2U2NERlY29kZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdHJhbnNmb3JtZXIvVHJhbnNmb3JtQmFzZTY0RGVjb2RlLmphdmEKaW5kZXggMzdiNWMwNS4uZDc3M2Y4YSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdHJhbnNmb3JtZXIvVHJhbnNmb3JtQmFzZTY0RGVjb2RlLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdHJhbnNmb3JtZXIvVHJhbnNmb3JtQmFzZTY0RGVjb2RlLmphdmEKQEAgLTI0LDggKzI0LDggQEAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmV4dC5YTUxTZWN1cml0eUNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmV4dC5zdGF4LlhNTFNlY0V2ZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguaW1wbC5wcm9jZXNzb3IuaW5wdXQuWE1MRXZlbnRSZWFkZXJJbnB1dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5VbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5VbnN5bmNCeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnV0aWwuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIAogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtQ29uc3RhbnRzOwogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwpAQCAtODksMTMgKzg5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBYTUxTZWNFdmVudDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE91dHB1dE1ldGhvZCA9IG5ldyBDaGlsZE91dHB1dE1ldGhvZCgpIHsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBVbnN5bmNCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBVbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlPdXRwdXRTdHJlYW07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcml2YXRlIEJhc2U2NE91dHB1dFN0cmVhbSBiYXNlNjRPdXRwdXRTdHJlYW07CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdHJhbnNmb3JtKE9iamVjdCBvYmplY3QpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlNjRPdXRwdXRTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVBcnJheU91dHB1dFN0cmVhbSA9IG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRPdXRwdXRTdHJlYW0gPSBuZXcgQmFzZTY0T3V0cHV0U3RyZWFtKGJ5dGVBcnJheU91dHB1dFN0cmVhbSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewpAQCAtMTEyLDE4ICsxMTIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhNTEV2ZW50UmVhZGVySW5wdXRQcm9jZXNzb3IgeG1sRXZlbnRSZWFkZXJJbnB1dFByb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBuZXcgWE1MRXZlbnRSZWFkZXJJbnB1dFByb2Nlc3NvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRYbWxJbnB1dEZhY3RvcnkoKS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IFVuc3luY0J5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxFdmVudFJlYWRlcklucHV0UHJvY2Vzc29yIHhtbEV2ZW50UmVhZGVySW5wdXRQcm9jZXNzb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gbmV3IFhNTEV2ZW50UmVhZGVySW5wdXRQcm9jZXNzb3IobnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0WG1sSW5wdXRGYWN0b3J5KCkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUxTZWNFdmVudCB4bWxTZWNFdmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sU2VjRXZlbnQgPSB4bWxFdmVudFJlYWRlcklucHV0UHJvY2Vzc29yLnByb2Nlc3NOZXh0RXZlbnQobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybSh4bWxTZWNFdmVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKHhtbFNlY0V2ZW50LmdldEV2ZW50VHlwZSgpICE9IFhNTFN0cmVhbUNvbnN0YW50cy5FTkRfRE9DVU1FTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFNlY3VyaXR5RXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFhNTFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNmb3JtZXIoKS5kb0ZpbmFsKCk7CkBAIC0xMzQsMTMgKzEzNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgSW5wdXRTdHJlYW06IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRPdXRwdXRNZXRob2QgPSBuZXcgQ2hpbGRPdXRwdXRNZXRob2QoKSB7CiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheU91dHB1dFN0cmVhbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBCYXNlNjRPdXRwdXRTdHJlYW0gYmFzZTY0T3V0cHV0U3RyZWFtOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShPYmplY3Qgb2JqZWN0KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZTY0T3V0cHV0U3RyZWFtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlQXJyYXlPdXRwdXRTdHJlYW0gPSBuZXcgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0T3V0cHV0U3RyZWFtID0gbmV3IEJhc2U2NE91dHB1dFN0cmVhbShieXRlQXJyYXlPdXRwdXRTdHJlYW0sIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKQEAgLTE1NywxMiArMTU4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgVW5zeW5jQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZUFycmF5T3V0cHV0U3RyZWFtLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtKGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNmb3JtZXIoKS5kb0ZpbmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtKG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhbnNmb3JtZXIoKS5kb0ZpbmFsKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdHJhbnNmb3JtZXIvVHJhbnNmb3JtSWRlbnRpdHkuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3RyYW5zZm9ybWVyL1RyYW5zZm9ybUlkZW50aXR5LmphdmEKaW5kZXggYzMwZGVhNC4uOTc5YWY3MSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdHJhbnNmb3JtZXIvVHJhbnNmb3JtSWRlbnRpdHkuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC90cmFuc2Zvcm1lci9UcmFuc2Zvcm1JZGVudGl0eS5qYXZhCkBAIC0yNCw4ICsyNCw4IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5leHQuWE1MU2VjdXJpdHlVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmV4dC5zdGF4LlhNTFNlY0V2ZW50OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguaW1wbC5wcm9jZXNzb3IuaW5wdXQuWE1MRXZlbnRSZWFkZXJJbnB1dFByb2Nlc3NvcjsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5VbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5VbnN5bmNCeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnV0aWwuVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbTsKIAogaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uKjsKIGltcG9ydCBqYXZhLmlvLio7CkBAIC0xNDQsMTMgKzE0NCwxMyBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlIElucHV0U3RyZWFtOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZE91dHB1dE1ldGhvZCA9IG5ldyBDaGlsZE91dHB1dE1ldGhvZCgpIHsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBVbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgWE1MRXZlbnRXcml0ZXIgeG1sRXZlbnRXcml0ZXI7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmFuc2Zvcm0oT2JqZWN0IG9iamVjdCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4bWxFdmVudFdyaXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYW9zID0gbmV3IFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFvcyA9IG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sRXZlbnRXcml0ZXIgPSBnZXRYbWxPdXRwdXRGYWN0b3J5KCkuY3JlYXRlWE1MRXZlbnRXcml0ZXIoYmFvcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIApAQCAtMTYwLDEyICsxNjAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGRvRmluYWwoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeG1sRXZlbnRXcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBVbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShpcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2Zvcm1lcigpLmRvRmluYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRyYW5zZm9ybWVyKCkudHJhbnNmb3JtKG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUcmFuc2Zvcm1lcigpLmRvRmluYWwoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC90cmFuc2Zvcm1lci9jYW5vbmljYWxpemVyL0Nhbm9uaWNhbGl6ZXJCYXNlLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC90cmFuc2Zvcm1lci9jYW5vbmljYWxpemVyL0Nhbm9uaWNhbGl6ZXJCYXNlLmphdmEKaW5kZXggOGUzYmEwNy4uNGJiZTgwYiAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdHJhbnNmb3JtZXIvY2Fub25pY2FsaXplci9DYW5vbmljYWxpemVyQmFzZS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3RyYW5zZm9ybWVyL2Nhbm9uaWNhbGl6ZXIvQ2Fub25pY2FsaXplckJhc2UuamF2YQpAQCAtMjYsOCArMjYsOCBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguZXh0LnN0YXguKjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwucHJvY2Vzc29yLmlucHV0LlhNTEV2ZW50UmVhZGVySW5wdXRQcm9jZXNzb3I7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnRyYW5zZm9ybWVyLlRyYW5zZm9ybUlkZW50aXR5OwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlVuc3luY0J5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbC5VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnN0YXguaW1wbC51dGlsLlVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogCiBpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKIGltcG9ydCBqYXZheC54bWwuc3RyZWFtLio7CkBAIC04NCw3ICs4NCw3IEBACiAgICAgQE92ZXJyaWRlCiAgICAgcHVibGljIHZvaWQgc2V0VHJhbnNmb3JtZXIoVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIpIHRocm93cyBYTUxTZWN1cml0eUV4Y2VwdGlvbiB7CiAgICAgICAgIC8vd2Ugc3VwcG9ydCBvbmx5IHRyYW5zZm9ybWVycyB3aGljaCB0YWtlcyBhbiBJbnB1dFN0cmVhbSBvdGhlcndpc2Ugd2Ugd2lsbCBicmVhayB0aGUgQzE0TgotICAgICAgICBzZXRPdXRwdXRTdHJlYW0obmV3IFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKKyAgICAgICAgc2V0T3V0cHV0U3RyZWFtKG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKTsKICAgICAgICAgc3VwZXIuc2V0VHJhbnNmb3JtZXIodHJhbnNmb3JtZXIpOwogICAgIH0KIApAQCAtMzkwLDEzICszOTAsOSBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyB2b2lkIGRvRmluYWwoKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKICAgICAgICAgaWYgKGdldFRyYW5zZm9ybWVyKCkgIT0gbnVsbCkgewotICAgICAgICAgICAgVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSAoVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtKWdldE91dHB1dFN0cmVhbSgpOwotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBVbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICAgICAgZ2V0VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0oaXMpOwotICAgICAgICAgICAgICAgIGdldFRyYW5zZm9ybWVyKCkuZG9GaW5hbCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGV4KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSAoVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlPdXRwdXRTdHJlYW0pZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBnZXRUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShuZXcgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgICAgIGdldFRyYW5zZm9ybWVyKCkuZG9GaW5hbCgpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC91dGlsL0Z1bGx5QnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3V0aWwvRnVsbHlCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCmluZGV4IGYxOGZjN2IuLjJjMmJjZmQgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3V0aWwvRnVsbHlCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc3RheC9pbXBsL3V0aWwvRnVsbHlCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCkBAIC0yMiwxMSArMjIsOSBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CiAKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5VbnN5bmNCeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci0KIHB1YmxpYyBjbGFzcyBGdWxseUJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKIAotICAgIHByaXZhdGUgVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBVbnN5bmNCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICBwcml2YXRlIFVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZiA9IG5ldyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCiAgICAgcHVibGljIEZ1bGx5QnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCkgewogICAgICAgICBzdXBlcihvdXQpOwpAQCAtNTEsNyArNDksNiBAQAogICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgYnVmLndyaXRlVG8ob3V0KTsKICAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIGJ1Zi5jbG9zZSgpOwogICAgIH0KIAogICAgIEBPdmVycmlkZQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdXRpbC9VbnN5bmNocm9uaXplZEJ1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC91dGlsL1Vuc3luY2hyb25pemVkQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2YxMjNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdXRpbC9VbnN5bmNocm9uaXplZEJ1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKKyAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKKyAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCisgKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKKyAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAorICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbDsKKworaW1wb3J0IGphdmEuaW8uRmlsdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKK3B1YmxpYyBjbGFzcyBVbnN5bmNocm9uaXplZEJ1ZmZlcmVkT3V0cHV0U3RyZWFtIGV4dGVuZHMgRmlsdGVyT3V0cHV0U3RyZWFtIHsKKworICAgIHByb3RlY3RlZCBieXRlW10gYnVmZmVyOworICAgIHByb3RlY3RlZCBpbnQgY291bnQ7CisKKyAgICBwdWJsaWMgVW5zeW5jaHJvbml6ZWRCdWZmZXJlZE91dHB1dFN0cmVhbShPdXRwdXRTdHJlYW0gb3V0KSB7CisgICAgICAgIHN1cGVyKG91dCk7CisgICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlWzgxOTJdOworICAgIH0KKworICAgIHB1YmxpYyBVbnN5bmNocm9uaXplZEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQsIGludCBzaXplKSB7CisgICAgICAgIHN1cGVyKG91dCk7CisgICAgICAgIGlmIChzaXplIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNpemUgbXVzdCBiZSA+IDAiKTsKKyAgICAgICAgfQorICAgICAgICBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZsdXNoSW50ZXJuYWwoKTsKKyAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobGVuZ3RoID49IGJ1ZmZlci5sZW5ndGgpIHsKKyAgICAgICAgICAgIGZsdXNoSW50ZXJuYWwoKTsKKyAgICAgICAgICAgIG91dC53cml0ZShieXRlcywgb2Zmc2V0LCBsZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZmx1c2ggdGhlIGludGVybmFsIGJ1ZmZlciBmaXJzdCBpZiB3ZSBoYXZlIG5vdCBlbm91Z2ggc3BhY2UgbGVmdAorICAgICAgICBpZiAobGVuZ3RoID49IChidWZmZXIubGVuZ3RoIC0gY291bnQpKSB7CisgICAgICAgICAgICBmbHVzaEludGVybmFsKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB0aGUgbGVuZ3RoIGlzIGFsd2F5cyBsZXNzIHRoYW4gKGludGVybmFsQnVmZmVyLmxlbmd0aCAtIGNvdW50KSBoZXJlIHNvIGFycmF5Y29weSBpcyBzYWZlCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIG9mZnNldCwgYnVmZmVyLCBjb3VudCwgbGVuZ3RoKTsKKyAgICAgICAgY291bnQgKz0gbGVuZ3RoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBvbmVCeXRlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY291bnQgPT0gYnVmZmVyLmxlbmd0aCkgeworICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcltjb3VudCsrXSA9IChieXRlKSBvbmVCeXRlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmbHVzaEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNvdW50ID4gMCkgeworICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9VbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdXRpbC9VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtLmphdmEKc2ltaWxhcml0eSBpbmRleCA5NSUKcmVuYW1lIGZyb20gc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9VbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbS5qYXZhCnJlbmFtZSB0byBzcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC91dGlsL1Vuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0uamF2YQppbmRleCA0NzgyZTkxLi5iNDIyMDhkIDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL1Vuc3luY0J5dGVBcnJheUlucHV0U3RyZWFtLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdXRpbC9VbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtLmphdmEKQEAgLTE1LDcgKzE1LDcgQEAKICAqICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzOworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmltcGwudXRpbDsKIAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKQEAgLTIzLDkgKzIzLDkgQEAKIC8qKgogICogQSBzcGVjaWFsaXplZCB7QGxpbmsgSW5wdXRTdHJlYW0gfSBmb3IgcmVhZGluZyB0aGUgY29udGVudHMgb2YgYSBieXRlIGFycmF5LgogICoKLSAqIEBzZWUgVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtCisgKiBAc2VlIFVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtCiAgKi8KLXB1YmxpYyBjbGFzcyBVbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKK3B1YmxpYyBjbGFzcyBVbnN5bmNocm9uaXplZEJ5dGVBcnJheUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewogICAgIC8qKgogICAgICAqIFRoZSB7QGNvZGUgYnl0ZX0gYXJyYXkgY29udGFpbmluZyB0aGUgYnl0ZXMgdG8gc3RyZWFtIG92ZXIuCiAgICAgICovCkBAIC01NSw3ICs1NSw3IEBACiAgICAgICogQHBhcmFtIGJ1ZgogICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgYXJyYXkgdG8gc3RyZWFtIG92ZXIuCiAgICAgICovCi0gICAgcHVibGljIFVuc3luY0J5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGUgYnVmW10pIHsKKyAgICBwdWJsaWMgVW5zeW5jaHJvbml6ZWRCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlIGJ1ZltdKSB7CiAgICAgICAgIHRoaXMubWFyayA9IDA7CiAgICAgICAgIHRoaXMuYnVmID0gYnVmOwogICAgICAgICB0aGlzLmNvdW50ID0gYnVmLmxlbmd0aDsKQEAgLTczLDcgKzczLDcgQEAKICAgICAgKiBAcGFyYW0gbGVuZ3RoCiAgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZSBmb3Igc3RyZWFtaW5nLgogICAgICAqLwotICAgIHB1YmxpYyBVbnN5bmNCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlIGJ1ZltdLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7CisgICAgcHVibGljIFVuc3luY2hyb25pemVkQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnl0ZSBidWZbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewogICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjsKICAgICAgICAgcG9zID0gb2Zmc2V0OwogICAgICAgICBtYXJrID0gb2Zmc2V0OwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdXRpbC9VbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS9zdGF4L2ltcGwvdXRpbC9VbnN5bmNocm9uaXplZEJ5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZGJjMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3N0YXgvaW1wbC91dGlsL1Vuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCisgKiAgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCisgKiAgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgorICogIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCisgKiAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKKyAqICB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuc3RheC5pbXBsLnV0aWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworcHVibGljIGNsYXNzIFVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKyAgICAvKioKKyAgICAgKiBUaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBieXRlcyB3cml0dGVuLgorICAgICAqLworICAgIHByb3RlY3RlZCBieXRlW10gYnVmOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgY291bnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSB3aXRoIGEgZGVmYXVsdCBzaXplIG9mIDMyIGJ5dGVzLgorICAgICAqIElmIG1vcmUgdGhhbiAzMiBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGlzIGluc3RhbmNlLCB0aGUgdW5kZXJseWluZyBieXRlCisgICAgICogYXJyYXkgd2lsbCBleHBhbmQuCisgICAgICovCisgICAgcHVibGljIFVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkgeworICAgICAgICBzdXBlcigpOworICAgICAgICBidWYgPSBuZXcgYnl0ZVszMl07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQnl0ZUFycmF5T3V0cHV0U3RyZWFtfSB3aXRoIGEgZGVmYXVsdCBzaXplIG9mCisgICAgICoge0Bjb2RlIHNpemV9IGJ5dGVzLiBJZiBtb3JlIHRoYW4ge0Bjb2RlIHNpemV9IGJ5dGVzIGFyZSB3cml0dGVuIHRvIHRoaXMKKyAgICAgKiBpbnN0YW5jZSwgdGhlIHVuZGVybHlpbmcgYnl0ZSBhcnJheSB3aWxsIGV4cGFuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplCisgICAgICogICAgICAgICAgICBpbml0aWFsIHNpemUgZm9yIHRoZSB1bmRlcmx5aW5nIGJ5dGUgYXJyYXksIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIG5vbi1uZWdhdGl2ZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHtAY29kZSBzaXplfSA8IDAuCisgICAgICovCisgICAgcHVibGljIFVuc3luY2hyb25pemVkQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGludCBzaXplKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2l6ZSBtdXN0IGJlID49IDAiKTsKKyAgICAgICAgfQorICAgICAgICBidWYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhwYW5kKGludCBpKSB7CisgICAgICAgIC8qIENhbiB0aGUgYnVmZmVyIGhhbmRsZSBAaSBtb3JlIGJ5dGVzLCBpZiBub3QgZXhwYW5kIGl0ICovCisgICAgICAgIGlmIChjb3VudCArIGkgPD0gYnVmLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIG5ld2J1ZiA9IG5ldyBieXRlWyhjb3VudCArIGkpIDw8IDFdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZiwgMCwgbmV3YnVmLCAwLCBjb3VudCk7CisgICAgICAgIGJ1ZiA9IG5ld2J1ZjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhpcyBzdHJlYW0gdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5kZXJseWluZyBieXRlIGFycmF5LiBBbGwKKyAgICAgKiBzdWJzZXF1ZW50IHdyaXRlcyB3aWxsIG92ZXJ3cml0ZSBhbnkgYnl0ZXMgcHJldmlvdXNseSBzdG9yZWQgaW4gdGhpcworICAgICAqIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgY291bnQgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoaXMgc3RyZWFtIHNvIGZhci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvIHRoaXMgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGFzIGEgYnl0ZSBhcnJheS4gQW55CisgICAgICogY2hhbmdlcyBtYWRlIHRvIHRoZSByZWNlaXZlciBhZnRlciByZXR1cm5pbmcgd2lsbCBub3QgYmUgcmVmbGVjdGVkIGluIHRoZQorICAgICAqIGJ5dGUgYXJyYXkgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW0ncyBjdXJyZW50IGNvbnRlbnRzIGFzIGEgYnl0ZSBhcnJheS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgeworICAgICAgICBieXRlW10gbmV3QXJyYXkgPSBuZXcgYnl0ZVtjb3VudF07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmLCAwLCBuZXdBcnJheSwgMCwgY291bnQpOworICAgICAgICByZXR1cm4gbmV3QXJyYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXMgYSBzdHJpbmcuIEFueQorICAgICAqIGNoYW5nZXMgbWFkZSB0byB0aGUgcmVjZWl2ZXIgYWZ0ZXIgcmV0dXJuaW5nIHdpbGwgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGUKKyAgICAgKiBzdHJpbmcgcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW0ncyBjdXJyZW50IGNvbnRlbnRzIGFzIGEgc3RyaW5nLgorICAgICAqLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCAwLCBjb3VudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29udGVudHMgb2YgdGhpcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYXMgYSBzdHJpbmcgY29udmVydGVkCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBkZWNsYXJlZCBpbiB7QGNvZGUgZW5jfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmMKKyAgICAgKiAgICAgICAgICAgIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gdHJhbnNsYXRpbmcKKyAgICAgKiAgICAgICAgICAgIHRoaXMgc3RyZWFtIHRvIGEgc3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhpcyBzdHJlYW0ncyBjdXJyZW50IGNvbnRlbnRzIGFzIGFuIGVuY29kZWQgc3RyaW5nLgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoZSBwcm92aWRlZCBlbmNvZGluZyBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoU3RyaW5nIGVuYykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhidWYsIDAsIGNvdW50LCBlbmMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB7QGNvZGUgY291bnR9IGJ5dGVzIGZyb20gdGhlIGJ5dGUgYXJyYXkge0Bjb2RlIGJ1ZmZlcn0gc3RhcnRpbmcgYXQKKyAgICAgKiBvZmZzZXQge0Bjb2RlIGluZGV4fSB0byB0aGlzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWZmZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBidWZmZXIgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0CisgICAgICogICAgICAgICAgICB0aGUgaW5pdGlhbCBwb3NpdGlvbiBpbiB7QGNvZGUgYnVmZmVyfSB0byByZXRyaWV2ZSBieXRlcy4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIHtAY29kZSBidWZmZXJ9IHRvIHdyaXRlLgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB7QGNvZGUgYnVmZmVyfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYge0Bjb2RlIG9mZnNldCA8IDB9IG9yIHtAY29kZSBsZW4gPCAwfSwgb3IgaWYKKyAgICAgKiAgICAgICAgICAgICB7QGNvZGUgb2Zmc2V0ICsgbGVufSBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZgorICAgICAqICAgICAgICAgICAgIHtAY29kZSBidWZmZXJ9LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW4pIHsKKyAgICAgICAgLy8gYXZvaWQgaW50IG92ZXJmbG93CisgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IG9mZnNldCA+IGJ1ZmZlci5sZW5ndGggfHwgbGVuIDwgMAorICAgICAgICAgICAgICAgIHx8IGxlbiA+IGJ1ZmZlci5sZW5ndGggLSBvZmZzZXQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBFeHBhbmQgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIGV4cGFuZChsZW4pOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgb2Zmc2V0LCBidWYsIHRoaXMuY291bnQsIGxlbik7CisgICAgICAgIHRoaXMuY291bnQgKz0gbGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgc3BlY2lmaWVkIGJ5dGUge0Bjb2RlIG9uZUJ5dGV9IHRvIHRoZSBPdXRwdXRTdHJlYW0uIE9ubHkgdGhlCisgICAgICogbG93IG9yZGVyIGJ5dGUgb2Yge0Bjb2RlIG9uZUJ5dGV9IGlzIHdyaXR0ZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb25lQnl0ZQorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdG8gYmUgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgb25lQnl0ZSkgeworICAgICAgICBpZiAoY291bnQgPT0gYnVmLmxlbmd0aCkgeworICAgICAgICAgICAgZXhwYW5kKDEpOworICAgICAgICB9CisgICAgICAgIGJ1Zltjb3VudCsrXSA9IChieXRlKSBvbmVCeXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cmVhbSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICoge0Bjb2RlIG91dH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICBhbiBPdXRwdXRTdHJlYW0gb24gd2hpY2ggdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB7QGNvZGUgb3V0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZShidWYsIDAsIGNvdW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RyYW5zZm9ybXMvaW1wbGVtZW50YXRpb25zL1RyYW5zZm9ybUJhc2U2NERlY29kZS5qYXZhIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90cmFuc2Zvcm1zL2ltcGxlbWVudGF0aW9ucy9UcmFuc2Zvcm1CYXNlNjREZWNvZGUuamF2YQppbmRleCAyMjk3MzFlLi5mMTdjMzg2IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RyYW5zZm9ybXMvaW1wbGVtZW50YXRpb25zL1RyYW5zZm9ybUJhc2U2NERlY29kZS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdHJhbnNmb3Jtcy9pbXBsZW1lbnRhdGlvbnMvVHJhbnNmb3JtQmFzZTY0RGVjb2RlLmphdmEKQEAgLTE4LDE4ICsxOCwyMCBAQAogICovCiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMuaW1wbGVtZW50YXRpb25zOwogCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkJhc2U2NDsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5jMTRuLkNhbm9uaWNhbGl6YXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuZXhjZXB0aW9ucy5CYXNlNjREZWNvZGluZ0V4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlSW5wdXQ7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm07CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1TcGk7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudHJhbnNmb3Jtcy5UcmFuc2Zvcm1hdGlvbkV4Y2VwdGlvbjsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50cmFuc2Zvcm1zLlRyYW5zZm9ybXM7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOwogaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwogaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CkBAIC0zNyw4ICszOSw2IEBACiBpbXBvcnQgb3JnLnczYy5kb20uVGV4dDsKIGltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CiAKLWltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5KYXZhVXRpbHM7Ci0KIC8qKgogICogSW1wbGVtZW50cyB0aGUgPENPREU+aHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnI2Jhc2U2NDwvQ09ERT4gZGVjb2RpbmcKICAqIHRyYW5zZm9ybS4KQEAgLTYzLDYgKzYzLDcgQEAKICAqIFRoZSBvdXRwdXQgb2YgdGhpcyB0cmFuc2Zvcm0gaXMgYW4gb2N0ZXQgc3RyZWFtLjwvcD4KICAqCiAgKiBAYXV0aG9yIENocmlzdGlhbiBHZXVlci1Qb2xsbWFubgorICogQHNlZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5CYXNlNjQKICAqLwogcHVibGljIGNsYXNzIFRyYW5zZm9ybUJhc2U2NERlY29kZSBleHRlbmRzIFRyYW5zZm9ybVNwaSB7CiAKQEAgLTk4LDY2ICs5OSw2NiBAQAogICAgIHByb3RlY3RlZCBYTUxTaWduYXR1cmVJbnB1dCBlbmdpbmVQZXJmb3JtVHJhbnNmb3JtKAogICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBpbnB1dCwgT3V0cHV0U3RyZWFtIG9zLCBUcmFuc2Zvcm0gdHJhbnNmb3JtT2JqZWN0CiAgICAgKSB0aHJvd3MgSU9FeGNlcHRpb24sIENhbm9uaWNhbGl6YXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGlucHV0LmlzRWxlbWVudCgpKSB7Ci0gICAgICAgICAgICBOb2RlIGVsID0gaW5wdXQuZ2V0U3ViTm9kZSgpOwotICAgICAgICAgICAgaWYgKGlucHV0LmdldFN1Yk5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7ICAgICAgICAgCQotICAgICAgICAgICAgICAgIGVsID0gZWwuZ2V0UGFyZW50Tm9kZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICB0cmF2ZXJzZUVsZW1lbnQoKEVsZW1lbnQpZWwsIHNiKTsKLSAgICAgICAgICAgIGlmIChvcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGRlY29kZWRCeXRlcyA9IEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZShzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBvdXRwdXQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoZGVjb2RlZEJ5dGVzKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQuc2V0U2VjdXJlVmFsaWRhdGlvbihzZWN1cmVWYWxpZGF0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgb3Mud3JpdGUoYnl0ZXMpOwotICAgICAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgb3V0cHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KChieXRlW10pbnVsbCk7Ci0gICAgICAgICAgICBvdXRwdXQuc2V0U2VjdXJlVmFsaWRhdGlvbihzZWN1cmVWYWxpZGF0aW9uKTsKLSAgICAgICAgICAgIG91dHB1dC5zZXRPdXRwdXRTdHJlYW0ob3MpOwotICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnB1dC5pc09jdGV0U3RyZWFtKCkgfHwgaW5wdXQuaXNOb2RlU2V0KCkpIHsKLSAgICAgICAgICAgIGlmIChvcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJhc2U2NEJ5dGVzID0gaW5wdXQuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGJhc2U2NEJ5dGVzKTsKLSAgICAgICAgICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBvdXRwdXQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoZGVjb2RlZEJ5dGVzKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQuc2V0U2VjdXJlVmFsaWRhdGlvbihzZWN1cmVWYWxpZGF0aW9uKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlucHV0LmlzQnl0ZUFycmF5KCkgfHwgaW5wdXQuaXNOb2RlU2V0KCkpIHsKLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBCYXNlNjQuZ2V0TWltZURlY29kZXIoKS5kZWNvZGUoaW5wdXQuZ2V0Qnl0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgb3Mud3JpdGUoYnl0ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBieXRlW10gaW5wdXRCeXRlcyA9IEphdmFVdGlscy5nZXRCeXRlc0Zyb21TdHJlYW0oaW5wdXQuZ2V0T2N0ZXRTdHJlYW1SZWFsKCkpOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZShpbnB1dEJ5dGVzKTsKLSAgICAgICAgICAgICAgICBvcy53cml0ZShieXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBvdXRwdXQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoKGJ5dGVbXSludWxsKTsKLSAgICAgICAgICAgIG91dHB1dC5zZXRTZWN1cmVWYWxpZGF0aW9uKHNlY3VyZVZhbGlkYXRpb24pOwotICAgICAgICAgICAgb3V0cHV0LnNldE91dHB1dFN0cmVhbShvcyk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgICAgICB9Ci0KICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIC8vRXhjZXB0aW9uYWwgY2FzZSB0aGVyZSBpcyBjdXJyZW50IG5vdCB0ZXh0IGNhc2UgdGVzdGluZyB0aGlzKEJlZm9yZSBpdCB3YXMgYQotICAgICAgICAgICAgLy9hIGNvbW1vbiBjYXNlKS4KLSAgICAgICAgICAgIERvY3VtZW50IGRvYyA9Ci0gICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlLCBzZWN1cmVWYWxpZGF0aW9uKS5wYXJzZShpbnB1dC5nZXRPY3RldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGlmIChpbnB1dC5pc0VsZW1lbnQoKSkgeworICAgICAgICAgICAgICAgIE5vZGUgZWwgPSBpbnB1dC5nZXRTdWJOb2RlKCk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0LmdldFN1Yk5vZGUoKS5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7ICAgICAgICAgCQorICAgICAgICAgICAgICAgICAgICBlbCA9IGVsLmdldFBhcmVudE5vZGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgdHJhdmVyc2VFbGVtZW50KChFbGVtZW50KWVsLCBzYik7CisgICAgICAgICAgICAgICAgaWYgKG9zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGRlY29kZWRCeXRlcyA9IEJhc2U2NC5kZWNvZGUoc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IG91dHB1dCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChkZWNvZGVkQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc2V0U2VjdXJlVmFsaWRhdGlvbihzZWN1cmVWYWxpZGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQmFzZTY0LmRlY29kZShzYi50b1N0cmluZygpLCBvcyk7CisgICAgICAgICAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgb3V0cHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KChieXRlW10pbnVsbCk7CisgICAgICAgICAgICAgICAgb3V0cHV0LnNldFNlY3VyZVZhbGlkYXRpb24oc2VjdXJlVmFsaWRhdGlvbik7CisgICAgICAgICAgICAgICAgb3V0cHV0LnNldE91dHB1dFN0cmVhbShvcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgRWxlbWVudCByb290Tm9kZSA9IGRvYy5nZXREb2N1bWVudEVsZW1lbnQoKTsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgdHJhdmVyc2VFbGVtZW50KHJvb3ROb2RlLCBzYik7Ci0gICAgICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgb3V0cHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KGRlY29kZWRCeXRlcyk7Ci0gICAgICAgICAgICBvdXRwdXQuc2V0U2VjdXJlVmFsaWRhdGlvbihzZWN1cmVWYWxpZGF0aW9uKTsKLSAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7Ci0gICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uKGUsICJjMTRuLkNhbm9uaWNhbGl6ZXIuRXhjZXB0aW9uIik7Ci0gICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtYXRpb25FeGNlcHRpb24oZSwgIlNBWCBleGNlcHRpb24iKTsKKyAgICAgICAgICAgIGlmIChpbnB1dC5pc09jdGV0U3RyZWFtKCkgfHwgaW5wdXQuaXNOb2RlU2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAob3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBieXRlW10gYmFzZTY0Qnl0ZXMgPSBpbnB1dC5nZXRCeXRlcygpOworICAgICAgICAgICAgICAgICAgICBieXRlW10gZGVjb2RlZEJ5dGVzID0gQmFzZTY0LmRlY29kZShiYXNlNjRCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IG91dHB1dCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChkZWNvZGVkQnl0ZXMpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc2V0U2VjdXJlVmFsaWRhdGlvbihzZWN1cmVWYWxpZGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlucHV0LmlzQnl0ZUFycmF5KCkgfHwgaW5wdXQuaXNOb2RlU2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQmFzZTY0LmRlY29kZShpbnB1dC5nZXRCeXRlcygpLCBvcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQmFzZTY0LmRlY29kZShuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShpbnB1dC5nZXRPY3RldFN0cmVhbVJlYWwoKSksIG9zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgb3V0cHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KChieXRlW10pbnVsbCk7CisgICAgICAgICAgICAgICAgb3V0cHV0LnNldFNlY3VyZVZhbGlkYXRpb24oc2VjdXJlVmFsaWRhdGlvbik7CisgICAgICAgICAgICAgICAgb3V0cHV0LnNldE91dHB1dFN0cmVhbShvcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvL0V4Y2VwdGlvbmFsIGNhc2UgdGhlcmUgaXMgY3VycmVudCBub3QgdGV4dCBjYXNlIHRlc3RpbmcgdGhpcyhCZWZvcmUgaXQgd2FzIGEKKyAgICAgICAgICAgICAgICAvL2EgY29tbW9uIGNhc2UpLgorICAgICAgICAgICAgICAgIERvY3VtZW50IGRvYyA9CisgICAgICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSwgc2VjdXJlVmFsaWRhdGlvbikucGFyc2UoaW5wdXQuZ2V0T2N0ZXRTdHJlYW0oKSk7CisKKyAgICAgICAgICAgICAgICBFbGVtZW50IHJvb3ROb2RlID0gZG9jLmdldERvY3VtZW50RWxlbWVudCgpOworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIHRyYXZlcnNlRWxlbWVudChyb290Tm9kZSwgc2IpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBkZWNvZGVkQnl0ZXMgPSBCYXNlNjQuZGVjb2RlKHNiLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IG91dHB1dCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChkZWNvZGVkQnl0ZXMpOworICAgICAgICAgICAgICAgIG91dHB1dC5zZXRTZWN1cmVWYWxpZGF0aW9uKHNlY3VyZVZhbGlkYXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtYXRpb25FeGNlcHRpb24oZSwgImMxNG4uQ2Fub25pY2FsaXplci5FeGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWF0aW9uRXhjZXB0aW9uKGUsICJTQVggZXhjZXB0aW9uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEJhc2U2NERlY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1hdGlvbkV4Y2VwdGlvbihlLCAiQmFzZTY0RGVjb2RpbmciKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90cmFuc2Zvcm1zL2ltcGxlbWVudGF0aW9ucy9UcmFuc2Zvcm1YU0xULmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RyYW5zZm9ybXMvaW1wbGVtZW50YXRpb25zL1RyYW5zZm9ybVhTTFQuamF2YQppbmRleCBkNTNkMDEwLi43MTcwNzM0IDEwMDY0NAotLS0gYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RyYW5zZm9ybXMvaW1wbGVtZW50YXRpb25zL1RyYW5zZm9ybVhTTFQuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3RyYW5zZm9ybXMvaW1wbGVtZW50YXRpb25zL1RyYW5zZm9ybVhTTFQuamF2YQpAQCAtMjEsNyArMjEsNiBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiBpbXBvcnQgamF2YXgueG1sLlhNTENvbnN0YW50czsKQEAgLTk4LDYgKzk3LDggQEAKICAgICAgICAgICAgICAqIGF0dGVtcHQgdG8gY29udmVydCBpdCB0byBvY3RldHMgKGFwcGx5IENhbm9uaWNhbCBYTUxdKSBhcyBkZXNjcmliZWQKICAgICAgICAgICAgICAqIGluIHRoZSBSZWZlcmVuY2UgUHJvY2Vzc2luZyBNb2RlbCAoc2VjdGlvbiA0LjMuMy4yKS4KICAgICAgICAgICAgICAqLworICAgICAgICAgICAgU291cmNlIHhtbFNvdXJjZSA9CisgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQuZ2V0Qnl0ZXMoKSkpOwogICAgICAgICAgICAgU291cmNlIHN0eWxlc2hlZXQ7CiAKICAgICAgICAgICAgIC8qCkBAIC0xMDksMTYgKzExMCwxNSBAQAogICAgICAgICAgICAgICogc28gd2UgY29udmVydCB0aGUgc3R5bGVzaGVldCB0byBieXRlW10gYW5kIHVzZSB0aGlzIGFzIGlucHV0IHN0cmVhbQogICAgICAgICAgICAgICovCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0RmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgICAgICAgICAgICBET01Tb3VyY2Ugc291cmNlID0gbmV3IERPTVNvdXJjZSh4c2x0RWxlbWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKLSAgICAKLSAgICAgICAgICAgICAgICAgICAgc3R5bGVzaGVldCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3RyZWFtU291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvcy50b0J5dGVBcnJheSgpKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgICAgICAgRE9NU291cmNlIHNvdXJjZSA9IG5ldyBET01Tb3VyY2UoeHNsdEVsZW1lbnQpOworICAgICAgICAgICAgICAgIFN0cmVhbVJlc3VsdCByZXN1bHQgPSBuZXcgU3RyZWFtUmVzdWx0KG9zKTsKKworICAgICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShzb3VyY2UsIHJlc3VsdCk7CisKKyAgICAgICAgICAgICAgICBzdHlsZXNoZWV0ID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmVhbVNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3MudG9CeXRlQXJyYXkoKSkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHN0eWxlc2hlZXQpOwpAQCAtMTM0LDIxICsxMzQsMTcgQEAKICAgICAgICAgICAgICAgICBsb2cud2FybigiVW5hYmxlIHRvIHNldCBYYWxhbiBsaW5lLXNlcGFyYXRvciBwcm9wZXJ0eTogIiArIGUuZ2V0TWVzc2FnZSgpKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygpKSkgewotICAgICAgICAgICAgICAgIFNvdXJjZSB4bWxTb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKGlzKTsKLSAgICAgICAgICAgICAgICBpZiAoYmFvcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSAoQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1SZXN1bHQgb3V0cHV0VGFyZ2V0ID0gbmV3IFN0cmVhbVJlc3VsdChiYW9zMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCBvdXRwdXRUYXJnZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgb3V0cHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KGJhb3MxLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNldFNlY3VyZVZhbGlkYXRpb24oc2VjdXJlVmFsaWRhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN0cmVhbVJlc3VsdCBvdXRwdXRUYXJnZXQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpOwotCisgICAgICAgICAgICBpZiAoYmFvcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIFN0cmVhbVJlc3VsdCBvdXRwdXRUYXJnZXQgPSBuZXcgU3RyZWFtUmVzdWx0KGJhb3MxKTsKICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oeG1sU291cmNlLCBvdXRwdXRUYXJnZXQpOworICAgICAgICAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IG91dHB1dCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChiYW9zMS50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgICAgICBvdXRwdXQuc2V0U2VjdXJlVmFsaWRhdGlvbihzZWN1cmVWYWxpZGF0aW9uKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyZWFtUmVzdWx0IG91dHB1dFRhcmdldCA9IG5ldyBTdHJlYW1SZXN1bHQoYmFvcyk7CisKKyAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybSh4bWxTb3VyY2UsIG91dHB1dFRhcmdldCk7CiAgICAgICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBvdXRwdXQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoKGJ5dGVbXSludWxsKTsKICAgICAgICAgICAgIG91dHB1dC5zZXRTZWN1cmVWYWxpZGF0aW9uKHNlY3VyZVZhbGlkYXRpb24pOwogICAgICAgICAgICAgb3V0cHV0LnNldE91dHB1dFN0cmVhbShiYW9zKTsKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvQmFzZTY0LmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL0Jhc2U2NC5qYXZhCmluZGV4IGU0M2I0YTMuLmNiY2RkYTIgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvQmFzZTY0LmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9CYXNlNjQuamF2YQpAQCAtNDEsNyArNDEsNiBAQAogICogQHNlZSA8QSBIUkVGPSJmdHA6Ly9mdHAuaXNpLmVkdS9pbi1ub3Rlcy9yZmMyMDQ1LnR4dCI+UkZDIDIwNDU8L0E+CiAgKiBAc2VlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRyYW5zZm9ybXMuaW1wbGVtZW50YXRpb25zLlRyYW5zZm9ybUJhc2U2NERlY29kZQogICovCi1ARGVwcmVjYXRlZAogcHVibGljIGNsYXNzIEJhc2U2NCB7CiAKICAgICAvKiogRmllbGQgQkFTRTY0REVGQVVMVExFTkdUSCAqLwpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9FbGVtZW50UHJveHkuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvRWxlbWVudFByb3h5LmphdmEKaW5kZXggODE1YWM3My4uMzM0OTU5MyAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9FbGVtZW50UHJveHkuamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL0VsZW1lbnRQcm94eS5qYXZhCkBAIC0yMCw5ICsyMCw5IEBACiAKIGltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwogaW1wb3J0IGphdmEudXRpbC5NYXA7CiAKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5leGNlcHRpb25zLkJhc2U2NERlY29kaW5nRXhjZXB0aW9uOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmV4Y2VwdGlvbnMuWE1MU2VjdXJpdHlFeGNlcHRpb247CiBpbXBvcnQgb3JnLnczYy5kb20uQXR0cjsKIGltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKQEAgLTI2NiwxNCArMjY2LDcgQEAKICAgICAgICAgaWYgKGJpICE9IG51bGwpIHsKICAgICAgICAgICAgIEVsZW1lbnQgZSA9IFhNTFV0aWxzLmNyZWF0ZUVsZW1lbnRJblNpZ25hdHVyZVNwYWNlKGdldERvY3VtZW50KCksIGxvY2FsbmFtZSk7CiAKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IFhNTFV0aWxzLmdldEJ5dGVzKGJpLCBiaS5iaXRMZW5ndGgoKSk7Ci0gICAgICAgICAgICBTdHJpbmcgZW5jb2RlZEludCA9IEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGJ5dGVzKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gZS5nZXRPd25lckRvY3VtZW50KCk7Ci0gICAgICAgICAgICBUZXh0IHRleHQgPSBkb2MuY3JlYXRlVGV4dE5vZGUoZW5jb2RlZEludCk7Ci0KLSAgICAgICAgICAgIGUuYXBwZW5kQ2hpbGQodGV4dCk7Ci0gICAgICAgICAgICAKKyAgICAgICAgICAgIEJhc2U2NC5maWxsRWxlbWVudFdpdGhCaWdJbnRlZ2VyKGUsIGJpKTsKICAgICAgICAgICAgIGFwcGVuZFNlbGYoZSk7CiAgICAgICAgICAgICBhZGRSZXR1cm5Ub1NlbGYoKTsKICAgICAgICAgfQpAQCAtMjkxLDEyICsyODQsOSBAQAogICAgICAqLwogICAgIHB1YmxpYyB2b2lkIGFkZEJhc2U2NEVsZW1lbnQoYnl0ZVtdIGJ5dGVzLCBTdHJpbmcgbG9jYWxuYW1lKSB7CiAgICAgICAgIGlmIChieXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBFbGVtZW50IGVsID0gWE1MVXRpbHMuY3JlYXRlRWxlbWVudEluU2lnbmF0dXJlU3BhY2UoZ2V0RG9jdW1lbnQoKSwgbG9jYWxuYW1lKTsKLSAgICAgICAgICAgIFRleHQgdGV4dCA9IGdldERvY3VtZW50KCkuY3JlYXRlVGV4dE5vZGUoQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcoYnl0ZXMpKTsKKyAgICAgICAgICAgIEVsZW1lbnQgZSA9IEJhc2U2NC5lbmNvZGVUb0VsZW1lbnQoZ2V0RG9jdW1lbnQoKSwgbG9jYWxuYW1lLCBieXRlcyk7CiAKLSAgICAgICAgICAgIGVsLmFwcGVuZENoaWxkKHRleHQpOwotCi0gICAgICAgICAgICBhcHBlbmRTZWxmKGVsKTsKKyAgICAgICAgICAgIGFwcGVuZFNlbGYoZSk7CiAgICAgICAgICAgICBpZiAoIVhNTFV0aWxzLmlnbm9yZUxpbmVCcmVha3MoKSkgewogICAgICAgICAgICAgICAgIGFwcGVuZFNlbGYoY3JlYXRlVGV4dCgiXG4iKSk7CiAgICAgICAgICAgICB9CkBAIC0zMjYsOCArMzE2LDggQEAKICAgICBwdWJsaWMgdm9pZCBhZGRCYXNlNjRUZXh0KGJ5dGVbXSBieXRlcykgewogICAgICAgICBpZiAoYnl0ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgVGV4dCB0ID0gWE1MVXRpbHMuaWdub3JlTGluZUJyZWFrcygpCi0gICAgICAgICAgICAgICAgPyBjcmVhdGVUZXh0KEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGJ5dGVzKSkKLSAgICAgICAgICAgICAgICA6IGNyZWF0ZVRleHQoIlxuIiArIEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKGJ5dGVzKSArICJcbiIpOworICAgICAgICAgICAgICAgID8gY3JlYXRlVGV4dChCYXNlNjQuZW5jb2RlKGJ5dGVzKSkKKyAgICAgICAgICAgICAgICA6IGNyZWF0ZVRleHQoIlxuIiArIEJhc2U2NC5lbmNvZGUoYnl0ZXMpICsgIlxuIik7CiAgICAgICAgICAgICBhcHBlbmRTZWxmKHQpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzY3LDEyICszNTcsMTIgQEAKICAgICAgKi8KICAgICBwdWJsaWMgQmlnSW50ZWdlciBnZXRCaWdJbnRlZ2VyRnJvbUNoaWxkRWxlbWVudCgKICAgICAgICAgU3RyaW5nIGxvY2FsbmFtZSwgU3RyaW5nIG5hbWVzcGFjZQotICAgICkgewotICAgICAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoMSwgQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKAorICAgICkgdGhyb3dzIEJhc2U2NERlY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEJhc2U2NC5kZWNvZGVCaWdJbnRlZ2VyRnJvbVN0cmluZygKICAgICAgICAgICAgIFhNTFV0aWxzLnNlbGVjdE5vZGVUZXh0KAogICAgICAgICAgICAgICAgIGdldEZpcnN0Q2hpbGQoKSwgbmFtZXNwYWNlLCBsb2NhbG5hbWUsIDAKICAgICAgICAgICAgICkuZ2V0Tm9kZVZhbHVlKCkKLSAgICAgICAgKSk7CisgICAgICAgICk7CiAgICAgfQogCiAgICAgLyoqCkBAIC0zOTcsNyArMzg3LDcgQEAKICAgICAgKiBAdGhyb3dzIFhNTFNlY3VyaXR5RXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIGJ5dGVbXSBnZXRCeXRlc0Zyb21UZXh0Q2hpbGQoKSB0aHJvd3MgWE1MU2VjdXJpdHlFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGdldFRleHRGcm9tVGV4dENoaWxkKCkpOworICAgICAgICByZXR1cm4gQmFzZTY0LmRlY29kZShnZXRUZXh0RnJvbVRleHRDaGlsZCgpKTsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvSmF2YVV0aWxzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL0phdmFVdGlscy5qYXZhCmluZGV4IDExODViMjkuLjUyOWQyZTAgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvSmF2YVV0aWxzLmphdmEKKysrIGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9KYXZhVXRpbHMuamF2YQpAQCAtNTYsOCArNTYsMTEgQEAKIAogICAgICAgICBieXRlIHJlZkJ5dGVzW10gPSBudWxsOwogCi0gICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtIGZpc1JlZiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOwotICAgICAgICAgICAgVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpIHsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpc1JlZiA9IG51bGw7CisgICAgICAgIFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpc1JlZiA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZU5hbWUpOworICAgICAgICAgICAgYmFvcyA9IG5ldyBVbnN5bmNCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgIGJ5dGUgYnVmW10gPSBuZXcgYnl0ZVsxMDI0XTsKICAgICAgICAgICAgIGludCBsZW47CiAKQEAgLTY2LDYgKzY5LDEzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJlZkJ5dGVzID0gYmFvcy50b0J5dGVBcnJheSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGJhb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGJhb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaXNSZWYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpc1JlZi5jbG9zZSgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIHJlZkJ5dGVzOwpAQCAtNzgsMTggKzg4LDI5IEBACiAgICAgICogQHBhcmFtIGJ5dGVzCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlQnl0ZXNUb0ZpbGVuYW1lKFN0cmluZyBmaWxlbmFtZSwgYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgICAgIGlmIChmaWxlbmFtZSAhPSBudWxsICYmIGJ5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgIEZpbGUgZiA9IG5ldyBGaWxlKGZpbGVuYW1lKTsKLSAgICAgICAgICAgIHRyeSAoRmlsZU91dHB1dFN0cmVhbSBmb3MgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmKSkgeworICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZvcyA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZmlsZW5hbWUgIT0gbnVsbCAmJiBieXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZmlsZW5hbWUpOworCisgICAgICAgICAgICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZik7CisKICAgICAgICAgICAgICAgICBmb3Mud3JpdGUoYnl0ZXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBmb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaWYgKGxvZy5pc0RlYnVnRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1ZyhleC5nZXRNZXNzYWdlKCksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKCJ3cml0ZUJ5dGVzVG9GaWxlbmFtZSBnb3QgbnVsbCBieXRlW10gcG9pbnRlZCIpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zygid3JpdGVCeXRlc1RvRmlsZW5hbWUgZ290IG51bGwgYnl0ZVtdIHBvaW50ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmIChmb3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZy5kZWJ1Zyhpb2UuZ2V0TWVzc2FnZSgpLCBpb2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTA1LDEzICsxMjYsMTYgQEAKICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCiAgICAgICovCiAgICAgcHVibGljIHN0YXRpYyBieXRlW10gZ2V0Qnl0ZXNGcm9tU3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgKFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSgpKSB7CisgICAgICAgIFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IFVuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB0cnkgewogICAgICAgICAgICAgYnl0ZSBidWZbXSA9IG5ldyBieXRlWzQgKiAxMDI0XTsKICAgICAgICAgICAgIGludCBsZW47CiAgICAgICAgICAgICB3aGlsZSAoKGxlbiA9IGlucHV0U3RyZWFtLnJlYWQoYnVmKSkgPiAwKSB7CiAgICAgICAgICAgICAgICAgYmFvcy53cml0ZShidWYsIDAsIGxlbik7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgYmFvcy5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL1Vuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL1Vuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNjYzOTg4NC4uZTQxY2FhNCAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9VbnN5bmNCdWZmZXJlZE91dHB1dFN0cmVhbS5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0uamF2YQpAQCAtMSw4MSArMSw5NCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqICBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqICB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0gKiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvKioKKyAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKKyAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiBTZWUgdGhlIE5PVElDRSBmaWxlCisgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgorICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCisgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCisgKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCisgKiB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICAqCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAorICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KKyAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQorICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKKyAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKKyAqIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCi0KIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHM7CiAKLWltcG9ydCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCi1wdWJsaWMgY2xhc3MgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0geworLyoqCisgKiBBIGNsYXNzIHRoYXQgYnVmZmVycyB3aXRob3V0IHN5bmNocm9uaXppbmcgaXRzIG1ldGhvZHMKKyAqIEBhdXRob3IgcmF1bAorICovCitwdWJsaWMgY2xhc3MgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworICAgIHN0YXRpYyBmaW5hbCBpbnQgc2l6ZSA9IDgqMTAyNDsKIAotICAgIHByb3RlY3RlZCBieXRlW10gYnVmZmVyOwotICAgIHByb3RlY3RlZCBpbnQgY291bnQ7CisgICAgcHJpdmF0ZSBpbnQgcG9pbnRlciA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0OwogCisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlcmVkIG91dHB1dCBzdHJlYW0gd2l0aG91dCBzeW5jaHJvbml6YXRpb24KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXRzdHJlYW0gdG8gYnVmZmVyCisgICAgICovCiAgICAgcHVibGljIFVuc3luY0J1ZmZlcmVkT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSBvdXQpIHsKLSAgICAgICAgc3VwZXIob3V0KTsKLSAgICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbODE5Ml07CisgICAgICAgIGJ1ZiA9IG5ldyBieXRlW3NpemVdOworICAgICAgICB0aGlzLm91dCA9IG91dDsKICAgICB9CiAKLSAgICBwdWJsaWMgVW5zeW5jQnVmZmVyZWRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dCwgaW50IHNpemUpIHsKLSAgICAgICAgc3VwZXIob3V0KTsKLSAgICAgICAgaWYgKHNpemUgPD0gMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2l6ZSBtdXN0IGJlID4gMCIpOworICAgIC8qKiBAaW5oZXJpdERvYyAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBhcmcwKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShhcmcwLCAwLCBhcmcwLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqIEBpbmhlcml0RG9jICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGFyZzAsIGludCBhcmcxLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgbmV3TGVuID0gcG9pbnRlcitsZW47CisgICAgICAgIGlmIChuZXdMZW4gPiBzaXplKSB7CisgICAgICAgICAgICBmbHVzaEJ1ZmZlcigpOwkJCisgICAgICAgICAgICBpZiAobGVuID4gc2l6ZSkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShhcmcwLCBhcmcxLGxlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3TGVuID0gbGVuOwogICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBieXRlW3NpemVdOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFyZzAsIGFyZzEsIGJ1ZiwgcG9pbnRlciwgbGVuKTsKKyAgICAgICAgcG9pbnRlciA9IG5ld0xlbjsKICAgICB9CiAKLSAgICBAT3ZlcnJpZGUKKyAgICBwcml2YXRlIHZvaWQgZmx1c2hCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocG9pbnRlciA+IDApIHsKKyAgICAgICAgICAgIG91dC53cml0ZShidWYsIDAsIHBvaW50ZXIpOworICAgICAgICB9CisgICAgICAgIHBvaW50ZXIgPSAwOworCisgICAgfQorCisgICAgLyoqIEBpbmhlcml0RG9jICovCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGFyZzApIHRocm93cyBJT0V4Y2VwdGlvbiB7CQkKKyAgICAgICAgaWYgKHBvaW50ZXIgPj0gc2l6ZSkgeworICAgICAgICAgICAgZmx1c2hCdWZmZXIoKTsKKyAgICAgICAgfQorICAgICAgICBidWZbcG9pbnRlcisrXSA9IChieXRlKWFyZzA7CisKKyAgICB9CisKKyAgICAvKiogQGluaGVyaXREb2MgKi8JCiAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmbHVzaEludGVybmFsKCk7CisgICAgICAgIGZsdXNoQnVmZmVyKCk7CiAgICAgICAgIG91dC5mbHVzaCgpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxlbmd0aCA+PSBidWZmZXIubGVuZ3RoKSB7Ci0gICAgICAgICAgICBmbHVzaEludGVybmFsKCk7Ci0gICAgICAgICAgICBvdXQud3JpdGUoYnl0ZXMsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGZsdXNoIHRoZSBpbnRlcm5hbCBidWZmZXIgZmlyc3QgaWYgd2UgaGF2ZSBub3QgZW5vdWdoIHNwYWNlIGxlZnQKLSAgICAgICAgaWYgKGxlbmd0aCA+PSAoYnVmZmVyLmxlbmd0aCAtIGNvdW50KSkgewotICAgICAgICAgICAgZmx1c2hJbnRlcm5hbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlIGxlbmd0aCBpcyBhbHdheXMgbGVzcyB0aGFuIChpbnRlcm5hbEJ1ZmZlci5sZW5ndGggLSBjb3VudCkgaGVyZSBzbyBhcnJheWNvcHkgaXMgc2FmZQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCBvZmZzZXQsIGJ1ZmZlciwgY291bnQsIGxlbmd0aCk7Ci0gICAgICAgIGNvdW50ICs9IGxlbmd0aDsKKyAgICAvKiogQGluaGVyaXREb2MgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZsdXNoKCk7CisgICAgICAgIG91dC5jbG9zZSgpOwogICAgIH0KIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBvbmVCeXRlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoY291bnQgPT0gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlcltjb3VudCsrXSA9IChieXRlKSBvbmVCeXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmbHVzaEludGVybmFsKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgY291bnQpOwotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9VbnN5bmNCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvVW5zeW5jQnl0ZUFycmF5T3V0cHV0U3RyZWFtLmphdmEKaW5kZXggNzY0YmQ4MS4uNzNhOWUzNSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9VbnN5bmNCeXRlQXJyYXlPdXRwdXRTdHJlYW0uamF2YQorKysgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL1Vuc3luY0J5dGVBcnJheU91dHB1dFN0cmVhbS5qYXZhCkBAIC0xOCw3ICsxOCw2IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHM7CiAKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwogaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwogCiAvKioKQEAgLTg2LDE5ICs4NSw2IEBACiAgICAgICAgIHBvcyA9IDA7CiAgICAgfQogICAgIAotICAgIC8qKgotICAgICAqIFRha2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIHN0cmVhbSBhbmQgd3JpdGVzIGl0IHRvIHRoZSBvdXRwdXQgc3RyZWFtCi0gICAgICoge0Bjb2RlIG91dH0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0Ci0gICAgICogICAgICAgICAgICBhbiBPdXRwdXRTdHJlYW0gb24gd2hpY2ggdG8gd3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RyZWFtLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgKiAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZyB0byB7QGNvZGUgb3V0fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIG91dC53cml0ZShidWYsIDAsIHBvcyk7Ci0gICAgfQotCiAgICAgcHJpdmF0ZSB2b2lkIGV4cGFuZFNpemUoaW50IG5ld1BvcykgewogICAgICAgICBpbnQgbmV3U2l6ZSA9IHNpemU7CiAgICAgICAgIHdoaWxlIChuZXdQb3MgPiBuZXdTaXplKSB7CmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL1hNTFV0aWxzLmphdmEgYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL1hNTFV0aWxzLmphdmEKaW5kZXggNGVkZGFkYi4uMDJlY2NmZSAxMDA2NDQKLS0tIGEvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS91dGlscy9YTUxVdGlscy5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvWE1MVXRpbHMuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CiBpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIGltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CkBAIC0xMDkxLDUwICsxMDkwLDYgQEAKICAgICAgICAgcmV0dXJuIHBvb2xzW2lkeF0ucmVwb29sKGRiKTsKICAgICB9CiAKLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgYnl0ZS1hcnJheSByZXByZXNlbnRhdGlvbiBvZiBhIDxjb2RlPntAbGluayBCaWdJbnRlZ2VyfTxjb2RlPi4KLSAgICAgKiBObyBzaWduLWJpdCBpcyBvdXRwdXQuCi0gICAgICoKLSAgICAgKiA8Yj5OLkIuOjwvQj4gPGNvZGU+e0BsaW5rIEJpZ0ludGVnZXJ9PGNvZGU+J3MgdG9CeXRlQXJyYXkKLSAgICAgKiByZXR1cm5zIGV2ZW50dWFsbHkgbG9uZ2VyIGFycmF5cyBiZWNhdXNlIG9mIHRoZSBsZWFkaW5nIHNpZ24tYml0LgotICAgICAqCi0gICAgICogQHBhcmFtIGJpZyA8Y29kZT5CaWdJbnRlZ2VyPGNvZGU+IHRvIGJlIGNvbnZlcnRlZAotICAgICAqIEBwYXJhbSBiaXRsZW4gPGNvZGU+aW50PGNvZGU+IHRoZSBkZXNpcmVkIGxlbmd0aCBpbiBiaXRzIG9mIHRoZSByZXByZXNlbnRhdGlvbgotICAgICAqIEByZXR1cm4gYSBieXRlIGFycmF5IHdpdGggPGNvZGU+Yml0bGVuPC9jb2RlPiBiaXRzIG9mIDxjb2RlPmJpZzwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBnZXRCeXRlcyhCaWdJbnRlZ2VyIGJpZywgaW50IGJpdGxlbikgewotCi0gICAgICAgIC8vcm91bmQgYml0bGVuCi0gICAgICAgIGJpdGxlbiA9ICgoYml0bGVuICsgNykgPj4gMykgPDwgMzsKLQotICAgICAgICBpZiAoYml0bGVuIDwgYmlnLmJpdExlbmd0aCgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKEkxOG4udHJhbnNsYXRlKCJ1dGlscy5CYXNlNjQuSWxsZWdhbEJpdGxlbmd0aCIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGVbXSBiaWdCeXRlcyA9IGJpZy50b0J5dGVBcnJheSgpOwotCi0gICAgICAgIGlmIChiaWcuYml0TGVuZ3RoKCkgJSA4ICE9IDAKLSAgICAgICAgICAgICYmIGJpZy5iaXRMZW5ndGgoKSAvIDggKyAxID09IGJpdGxlbiAvIDgpIHsKLSAgICAgICAgICAgIHJldHVybiBiaWdCeXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNvbWUgY29weWluZyBuZWVkZWQKLSAgICAgICAgaW50IHN0YXJ0U3JjID0gMDsgICAgLy8gbm8gbmVlZCB0byBza2lwIGFueXRoaW5nCi0gICAgICAgIGludCBiaWdMZW4gPSBiaWdCeXRlcy5sZW5ndGg7ICAgIC8vdmFsaWQgbGVuZ3RoIG9mIHRoZSBzdHJpbmcKLQotICAgICAgICBpZiAoYmlnLmJpdExlbmd0aCgpICUgOCA9PSAwKSB7ICAgIC8vIGNvcnJlY3QgdmFsdWVzCi0gICAgICAgICAgICBzdGFydFNyYyA9IDE7ICAgIC8vIHNraXAgc2lnbiBiaXQKLQotICAgICAgICAgICAgYmlnTGVuLS07ICAgIC8vIHZhbGlkIGxlbmd0aCBvZiB0aGUgc3RyaW5nCi0gICAgICAgIH0KLQotICAgICAgICBpbnQgc3RhcnREc3QgPSBiaXRsZW4gLyA4IC0gYmlnTGVuOyAgICAvL3BhZCB3aXRoIGxlYWRpbmcgbnVsbHMKLSAgICAgICAgYnl0ZVtdIHJlc2l6ZWRCeXRlcyA9IG5ldyBieXRlW2JpdGxlbiAvIDhdOwotCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYmlnQnl0ZXMsIHN0YXJ0U3JjLCByZXNpemVkQnl0ZXMsIHN0YXJ0RHN0LCBiaWdMZW4pOwotCi0gICAgICAgIHJldHVybiByZXNpemVkQnl0ZXM7Ci0gICAgfQogCiAgICAgLyoqCiAgICAgICogV2UgbmVlZCB0aGlzIHByb3h5IHdyYXBwaW5nIERvY3VtZW50QnVpbGRlciB0byByZWNvcmQgdGhlIHZhbHVlCmRpZmYgLS1naXQgYS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3V0aWxzL3Jlc29sdmVyL2ltcGxlbWVudGF0aW9ucy9SZXNvbHZlckRpcmVjdEhUVFAuamF2YSBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvcmVzb2x2ZXIvaW1wbGVtZW50YXRpb25zL1Jlc29sdmVyRGlyZWN0SFRUUC5qYXZhCmluZGV4IDk3YWQwOTYuLjIzYzlkY2EgMTAwNjQ0Ci0tLSBhL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvcmVzb2x2ZXIvaW1wbGVtZW50YXRpb25zL1Jlc29sdmVyRGlyZWN0SFRUUC5qYXZhCisrKyBiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdXRpbHMvcmVzb2x2ZXIvaW1wbGVtZW50YXRpb25zL1Jlc29sdmVyRGlyZWN0SFRUUC5qYXZhCkBAIC0yOCw5ICsyOCw5IEBACiBpbXBvcnQgamF2YS5uZXQuVVJJOwogaW1wb3J0IGphdmEubmV0LlVSTDsKIGltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zaWduYXR1cmUuWE1MU2lnbmF0dXJlSW5wdXQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLnJlc29sdmVyLlJlc291cmNlUmVzb2x2ZXJDb250ZXh0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLnJlc29sdmVyLlJlc291cmNlUmVzb2x2ZXJFeGNlcHRpb247CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMucmVzb2x2ZXIuUmVzb3VyY2VSZXNvbHZlclNwaTsKQEAgLTk2LDEyICs5NiwxNCBAQAogICAgIEBPdmVycmlkZQogICAgIHB1YmxpYyBYTUxTaWduYXR1cmVJbnB1dCBlbmdpbmVSZXNvbHZlVVJJKFJlc291cmNlUmVzb2x2ZXJDb250ZXh0IGNvbnRleHQpCiAgICAgICAgIHRocm93cyBSZXNvdXJjZVJlc29sdmVyRXhjZXB0aW9uIHsKLSAgICAgICAgCisgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbnVsbDsKICAgICAgICAgdHJ5IHsKKwogICAgICAgICAgICAgLy8gY2FsY3VsYXRlIG5ldyBVUkkKICAgICAgICAgICAgIFVSSSB1cmlOZXcgPSBnZXROZXdVUkkoY29udGV4dC51cmlUb1Jlc29sdmUsIGNvbnRleHQuYmFzZVVyaSk7CiAgICAgICAgICAgICBVUkwgdXJsID0gdXJpTmV3LnRvVVJMKCk7Ci0gICAgICAgICAgICBVUkxDb25uZWN0aW9uIHVybENvbm5lY3Rpb24gPSBvcGVuQ29ubmVjdGlvbih1cmwpOworICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiB1cmxDb25uZWN0aW9uOworICAgICAgICAgICAgdXJsQ29ubmVjdGlvbiA9IG9wZW5Db25uZWN0aW9uKHVybCk7CiAKICAgICAgICAgICAgIC8vIGNoZWNrIGlmIEJhc2ljIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkCiAgICAgICAgICAgICBTdHJpbmcgYXV0aCA9IHVybENvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGQoIldXVy1BdXRoZW50aWNhdGUiKTsKQEAgLTExNyw3ICsxMTksNyBAQAogICAgICAgICAgICAgICAgICAgICB1cmxDb25uZWN0aW9uID0gb3BlbkNvbm5lY3Rpb24odXJsKTsKIAogICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSB1c2VyICsgIjoiICsgcGFzczsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVuY29kZWRQYXNzd29yZCA9IEJhc2U2NC5nZXRNaW1lRW5jb2RlcigpLmVuY29kZVRvU3RyaW5nKHBhc3N3b3JkLmdldEJ5dGVzKCJJU08tODg1OS0xIikpOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZW5jb2RlZFBhc3N3b3JkID0gQmFzZTY0LmVuY29kZShwYXNzd29yZC5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYXV0aGVudGljYXRpb24gcHJvcGVydHkgaW4gdGhlIGh0dHAgaGVhZGVyCiAgICAgICAgICAgICAgICAgICAgIHVybENvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBdXRob3JpemF0aW9uIiwKQEAgLTEyNiwzMCArMTI4LDI4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IHVybENvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGQoIkNvbnRlbnQtVHlwZSIpOwotICAgICAgICAgICAgdHJ5IChCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9ICB1cmxDb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCkpIHsKLSAgICAgICAgICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbNDA5Nl07Ci0gICAgICAgICAgICAgICAgaW50IHJlYWQgPSAwOwotICAgICAgICAgICAgICAgIGludCBzdW1tYXJpemVkID0gMDsKLSAgICAKLSAgICAgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZikpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYmFvcy53cml0ZShidWYsIDAsIHJlYWQpOwotICAgICAgICAgICAgICAgICAgICBzdW1tYXJpemVkICs9IHJlYWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgIAotICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZldGNoZWQgIiArIHN1bW1hcml6ZWQgKyAiIGJ5dGVzIGZyb20gVVJJICIgKyB1cmlOZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IHJlc3VsdCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgICAgIHJlc3VsdC5zZXRTZWN1cmVWYWxpZGF0aW9uKGNvbnRleHQuc2VjdXJlVmFsaWRhdGlvbik7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IHVybENvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgYnl0ZSBidWZbXSA9IG5ldyBieXRlWzQwOTZdOworICAgICAgICAgICAgaW50IHJlYWQgPSAwOworICAgICAgICAgICAgaW50IHN1bW1hcml6ZWQgPSAwOwogCi0gICAgICAgICAgICAgICAgcmVzdWx0LnNldFNvdXJjZVVSSSh1cmlOZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LnNldE1JTUVUeXBlKG1pbWVUeXBlKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZikpID49IDApIHsKKyAgICAgICAgICAgICAgICBiYW9zLndyaXRlKGJ1ZiwgMCwgcmVhZCk7CisgICAgICAgICAgICAgICAgc3VtbWFyaXplZCArPSByZWFkOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobG9nLmlzRGVidWdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICBsb2cuZGVidWcoIkZldGNoZWQgIiArIHN1bW1hcml6ZWQgKyAiIGJ5dGVzIGZyb20gVVJJICIgKyB1cmlOZXcudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IHJlc3VsdCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChiYW9zLnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgcmVzdWx0LnNldFNlY3VyZVZhbGlkYXRpb24oY29udGV4dC5zZWN1cmVWYWxpZGF0aW9uKTsKKworICAgICAgICAgICAgcmVzdWx0LnNldFNvdXJjZVVSSSh1cmlOZXcudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXN1bHQuc2V0TUlNRVR5cGUobWltZVR5cGUpOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKICAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZVJlc29sdmVyRXhjZXB0aW9uKGV4LCBjb250ZXh0LnVyaVRvUmVzb2x2ZSwgY29udGV4dC5iYXNlVXJpLCAiZ2VuZXJpYy5FbXB0eU1lc3NhZ2UiKTsKICAgICAgICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGV4KSB7CkBAIC0xNTgsNiArMTU4LDE2IEBACiAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VSZXNvbHZlckV4Y2VwdGlvbihleCwgY29udGV4dC51cmlUb1Jlc29sdmUsIGNvbnRleHQuYmFzZVVyaSwgImdlbmVyaWMuRW1wdHlNZXNzYWdlIik7CiAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VSZXNvbHZlckV4Y2VwdGlvbihlLCBjb250ZXh0LnVyaVRvUmVzb2x2ZSwgY29udGV4dC5iYXNlVXJpLCAiZ2VuZXJpYy5FbXB0eU1lc3NhZ2UiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2cuaXNEZWJ1Z0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nLmRlYnVnKGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMTg0LDcgKzE5NCw3IEBACiAKICAgICAgICAgICAgIGlmIChwcm94eVVzZXIgIT0gbnVsbCAmJiBwcm94eVBhc3MgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgIFN0cmluZyBwYXNzd29yZCA9IHByb3h5VXNlciArICI6IiArIHByb3h5UGFzczsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aFN0cmluZyA9ICJCYXNpYyAiICsgQmFzZTY0LmdldE1pbWVFbmNvZGVyKCkuZW5jb2RlVG9TdHJpbmcocGFzc3dvcmQuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGF1dGhTdHJpbmcgPSAiQmFzaWMgIiArIEJhc2U2NC5lbmNvZGUocGFzc3dvcmQuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7CiAKICAgICAgICAgICAgICAgICB1cmxDb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiUHJveHktQXV0aG9yaXphdGlvbiIsIGF1dGhTdHJpbmcpOwogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9qYXZheC94bWwvY3J5cHRvL3Rlc3QvT2N0ZXRTdHJlYW1EYXRhVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9qYXZheC94bWwvY3J5cHRvL3Rlc3QvT2N0ZXRTdHJlYW1EYXRhVGVzdC5qYXZhCmluZGV4IGQ1N2ZjNjguLjkwZGQwNjQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvamF2YXgveG1sL2NyeXB0by90ZXN0L09jdGV0U3RyZWFtRGF0YVRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL2phdmF4L3htbC9jcnlwdG8vdGVzdC9PY3RldFN0cmVhbURhdGFUZXN0LmphdmEKQEAgLTMzLDcgKzMzLDcgQEAKIHB1YmxpYyBjbGFzcyBPY3RldFN0cmVhbURhdGFUZXN0IGV4dGVuZHMgb3JnLmp1bml0LkFzc2VydCB7CiAKICAgICBAb3JnLmp1bml0LlRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CiAgICAgICAgIC8vIHRlc3QgT2N0ZXRTdHJlYW1EYXRhKElucHV0U3RyZWFtKSBhbmQKICAgICAgICAgLy8gT2N0ZXRTdHJlYW1EYXRhKElucHV0U3RyZWFtLCBTdHJpbmcsIFN0cmluZykKICAgICAgICAgT2N0ZXRTdHJlYW1EYXRhIG9zZGF0YTsKQEAgLTQ5LDggKzQ5LDggQEAKICAgICAgICAgaW50IGxlbiA9IDMwMDsKICAgICAgICAgYnl0ZVtdIGluID0gbmV3IGJ5dGVbbGVuXTsKICAgICAgICAgbmV3IFJhbmRvbSgpLm5leHRCeXRlcyhpbik7Ci0gICAgICAgIAotICAgICAgICB0cnkgKEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW4pKSB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW4pOworICAgICAgICB0cnkgewogICAgICAgICAgICAgb3NkYXRhID0gbmV3IE9jdGV0U3RyZWFtRGF0YShiYWlzKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwob3NkYXRhKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhvc2RhdGEuZ2V0T2N0ZXRTdHJlYW0oKSwgYmFpcyk7CkBAIC02MiwxNCArNjIsMjAgQEAKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhvc2RhdGEuZ2V0T2N0ZXRTdHJlYW0oKSwgYmFpcyk7CiAgICAgICAgICAgICBhc3NlcnROdWxsKG9zZGF0YS5nZXRVUkkoKSk7CiAgICAgICAgICAgICBhc3NlcnROdWxsKG9zZGF0YS5nZXRNaW1lVHlwZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmYWlsKCJVbmV4cGVjdGVkIEV4Y2VwdGlvbjogIiArIGV4KTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmcgdXJpPSJ0ZXN0VXJpIjsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZT0idGVzdCI7CisgICAgICAgIFN0cmluZyB1cmk9InRlc3RVcmkiOworICAgICAgICBTdHJpbmcgbWltZVR5cGU9InRlc3QiOworICAgICAgICB0cnkgewogICAgICAgICAgICAgb3NkYXRhID0gbmV3IE9jdGV0U3RyZWFtRGF0YShiYWlzLCB1cmksIG1pbWVUeXBlKTsKICAgICAgICAgICAgIGFzc2VydE5vdE51bGwob3NkYXRhKTsKICAgICAgICAgICAgIGFzc2VydEVxdWFscyhvc2RhdGEuZ2V0T2N0ZXRTdHJlYW0oKSwgYmFpcyk7CiAgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3NkYXRhLmdldFVSSSgpLCB1cmkpOwogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9zZGF0YS5nZXRNaW1lVHlwZSgpLCBtaW1lVHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmFpbCgiVW5leHBlY3RlZCBFeGNlcHRpb246ICIgKyBleCk7CiAgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL2phdmF4L3htbC9jcnlwdG8vdGVzdC9kc2lnL0NyZWF0ZUJhbHRpbW9yZTIzVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9qYXZheC94bWwvY3J5cHRvL3Rlc3QvZHNpZy9DcmVhdGVCYWx0aW1vcmUyM1Rlc3QuamF2YQppbmRleCBiZGU0MzNjLi5hY2NmNmEzIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL2phdmF4L3htbC9jcnlwdG8vdGVzdC9kc2lnL0NyZWF0ZUJhbHRpbW9yZTIzVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvamF2YXgveG1sL2NyeXB0by90ZXN0L2RzaWcvQ3JlYXRlQmFsdGltb3JlMjNUZXN0LmphdmEKQEAgLTQ5MywxMCArNDkzLDcgQEAKICAgICAgICAgICArICIgICAgPC9odG1sPlxuIgogICAgICAgICAgICsgIiAgPC94c2w6dGVtcGxhdGU+XG4iCiAgICAgICAgICAgKyAiPC94c2w6c3R5bGVzaGVldD5cbiI7Ci0gICAgICAgIERvY3VtZW50IGRvY3hzbHQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhzbHQuZ2V0Qnl0ZXMoKSkpIHsKLSAgICAgICAgICAgIGRvY3hzbHQgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jeHNsdCA9IGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4c2x0LmdldEJ5dGVzKCkpKTsKICAgICAgICAgTm9kZSB4c2xFbGVtID0gZG9jeHNsdC5nZXREb2N1bWVudEVsZW1lbnQoKTsKIAogICAgICAgICBtYW5UcmFucy5hZGQoZmFjLm5ld1RyYW5zZm9ybShUcmFuc2Zvcm0uWFNMVCwKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vQ3JlYXRlRXhjbEMxNG5JbnRlcm9wVmFsdWVzLmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL0NyZWF0ZUV4Y2xDMTRuSW50ZXJvcFZhbHVlcy5qYXZhCmluZGV4IDMzMjg1MTYuLmE1MWIxOTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vQ3JlYXRlRXhjbEMxNG5JbnRlcm9wVmFsdWVzLmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9DcmVhdGVFeGNsQzE0bkludGVyb3BWYWx1ZXMuamF2YQpAQCAtMjIsNyArMjIsNiBAQAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5GaWxlOwogaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCkBAIC0xOTcsMTAgKzE5Niw4IEBACiAgICAgICAgICAgICArICI8aW5jbHVkZWQgICAgICAgICAgICAgICAgID4iICsgIlxuIiArICI8L2luY2x1ZGVkPiIKICAgICAgICAgICAgICsgIlxuIiArICI8L25vdEluY2x1ZGVkPiIgKyAiXG4iICsgIjwvbm90SW5jbHVkZWQ+IgogICAgICAgICAgICAgKyAiXG4iICsgIjwvaW5jbHVkZWQ+IjsKLSAgICAgICAgICAgIERvY3VtZW50IGltcG9ydERvYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0ci5nZXRCeXRlcygiVVRGOCIpKSkgewotICAgICAgICAgICAgICAgIGltcG9ydERvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERvY3VtZW50IGltcG9ydERvYyA9CisgICAgICAgICAgICAgICAgZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0ci5nZXRCeXRlcygpKSk7CiAKICAgICAgICAgICAgIG9iai5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKICAgICAgICAgICAgIG9iai5nZXRFbGVtZW50KCkKQEAgLTIzMiwxMCArMjI5LDggQEAKICAgICAgICAgICAgICsgIjxpbmNsdWRlZCAgICAgICAgICAgICAgICAgPiIgKyAiXG4iICsgIjwvaW5jbHVkZWQ+IgogICAgICAgICAgICAgKyAiXG4iICsgIjwvbm90SW5jbHVkZWQ+IiArICJcbiIgKyAiPC9ub3RJbmNsdWRlZD4iCiAgICAgICAgICAgICArICJcbiIgKyAiPC9pbmNsdWRlZD4iOwotICAgICAgICAgICAgRG9jdW1lbnQgaW1wb3J0RG9jID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyLmdldEJ5dGVzKCJVVEY4IikpKSB7Ci0gICAgICAgICAgICAgICAgaW1wb3J0RG9jID0gZGIucGFyc2UoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgRG9jdW1lbnQgaW1wb3J0RG9jID0KKyAgICAgICAgICAgICAgICBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyLmdldEJ5dGVzKCkpKTsKIAogICAgICAgICAgICAgb2JqLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOwogICAgICAgICAgICAgb2JqLmdldEVsZW1lbnQoKQpAQCAtMjY3LDEwICsyNjIsOCBAQAogICAgICAgICAgICAgKyAiPGluY2x1ZGVkICAgIHhtbDpsYW5nPSdkZSc+IiArICJcbiIgKyAiPC9pbmNsdWRlZD4iCiAgICAgICAgICAgICArICJcbiIgKyAiPC9ub3RJbmNsdWRlZD4iICsgIlxuIiArICI8L25vdEluY2x1ZGVkPiIKICAgICAgICAgICAgICsgIlxuIiArICI8L2luY2x1ZGVkPiI7Ci0gICAgICAgICAgICBEb2N1bWVudCBpbXBvcnREb2MgPSBudWxsOwotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHIuZ2V0Qnl0ZXMoIlVURjgiKSkpIHsKLSAgICAgICAgICAgICAgICBpbXBvcnREb2MgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBEb2N1bWVudCBpbXBvcnREb2MgPQorICAgICAgICAgICAgICAgIGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh4bWxTdHIuZ2V0Qnl0ZXMoKSkpOwogCiAgICAgICAgICAgICBvYmouZ2V0RWxlbWVudCgpLmFwcGVuZENoaWxkKGRvYy5jcmVhdGVUZXh0Tm9kZSgiXG4iKSk7CiAgICAgICAgICAgICBvYmouZ2V0RWxlbWVudCgpCkBAIC0zMDMsMTAgKzI5Niw4IEBACiAgICAgICAgICAgICArICI8aW5jbHVkZWQgICAgICAgICAgICAgICAgID4iICsgIlxuIiArICI8L2luY2x1ZGVkPiIKICAgICAgICAgICAgICsgIlxuIiArICI8L25vdEluY2x1ZGVkPiIgKyAiXG4iICsgIjwvaW5jbHVkZWQ+IgogICAgICAgICAgICAgKyAiXG4iICsgIjwvaW5jbHVkZWQ+IjsKLSAgICAgICAgICAgIERvY3VtZW50IGltcG9ydERvYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0ci5nZXRCeXRlcygiVVRGOCIpKSkgewotICAgICAgICAgICAgICAgIGltcG9ydERvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERvY3VtZW50IGltcG9ydERvYyA9CisgICAgICAgICAgICAgICAgZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0ci5nZXRCeXRlcygpKSk7CiAKICAgICAgICAgICAgIG9iai5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKICAgICAgICAgICAgIG9iai5nZXRFbGVtZW50KCkKQEAgLTM0MCwxMSArMzMxLDkgQEAKICAgICAgICAgICAgICsgIlxuIiArICI8aW5jbHVkZWQgICAgICAgICAgICAgICAgID4iICsgIlxuIgogICAgICAgICAgICAgKyAiPC9pbmNsdWRlZD4iICsgIlxuIiArICI8L25vdEluY2x1ZGVkPiIgKyAiXG4iCiAgICAgICAgICAgICArICI8L2luY2x1ZGVkPiIgKyAiXG4iICsgIjwvaW5jbHVkZWQ+IjsKLSAgICAgICAgICAgIERvY3VtZW50IGltcG9ydERvYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0ci5nZXRCeXRlcygiVVRGOCIpKSkgewotICAgICAgICAgICAgICAgIGltcG9ydERvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAorICAgICAgICAgICAgRG9jdW1lbnQgaW1wb3J0RG9jID0KKyAgICAgICAgICAgICAgICBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oeG1sU3RyLmdldEJ5dGVzKCkpKTsKKwogICAgICAgICAgICAgb2JqLmdldEVsZW1lbnQoKS5hcHBlbmRDaGlsZChkb2MuY3JlYXRlVGV4dE5vZGUoIlxuIikpOwogICAgICAgICAgICAgb2JqLmdldEVsZW1lbnQoKQogICAgICAgICAgICAgLmFwcGVuZENoaWxkKGRvYy5pbXBvcnROb2RlKGltcG9ydERvYy5nZXREb2N1bWVudEVsZW1lbnQoKSwgdHJ1ZSkpOwpAQCAtMzc3LDEwICszNjYsOCBAQAogICAgICAgICAgICAgKyAiXG4iICsgIjxpbmNsdWRlZD4iICsgIlxuIiArICI8L2luY2x1ZGVkPiIgKyAiXG4iCiAgICAgICAgICAgICArICI8L25vdEluY2x1ZGVkPiIgKyAiXG4iICsgIjwvaW5jbHVkZWQ+IiArICJcbiIKICAgICAgICAgICAgICsgIjwvaW5jbHVkZWQ+IjsKLSAgICAgICAgICAgIERvY3VtZW50IGltcG9ydERvYyA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0ci5nZXRCeXRlcygiVVRGOCIpKSkgewotICAgICAgICAgICAgICAgIGltcG9ydERvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERvY3VtZW50IGltcG9ydERvYyA9CisgICAgICAgICAgICAgICAgZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHhtbFN0ci5nZXRCeXRlcygpKSk7CiAKICAgICAgICAgICAgIG9iai5nZXRFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZG9jLmNyZWF0ZVRleHROb2RlKCJcbiIpKTsKICAgICAgICAgICAgIG9iai5nZXRFbGVtZW50KCkKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vYzE0bi9pbXBsZW1lbnRhdGlvbnMvQ2Fub25pY2FsaXplcjIwMDEwMzE1VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9jMTRuL2ltcGxlbWVudGF0aW9ucy9DYW5vbmljYWxpemVyMjAwMTAzMTVUZXN0LmphdmEKaW5kZXggZmY3YTM4MC4uZDBhNTQ4YiAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9jMTRuL2ltcGxlbWVudGF0aW9ucy9DYW5vbmljYWxpemVyMjAwMTAzMTVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9jMTRuL2ltcGxlbWVudGF0aW9ucy9DYW5vbmljYWxpemVyMjAwMTAzMTVUZXN0LmphdmEKQEAgLTY3NiwxMCArNjc2LDcgQEAKICAgICAgICAgLy9KKwogCiAgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSk7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXRTdHIuZ2V0Qnl0ZXMoKSkpIHsKLSAgICAgICAgICAgIGRvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXRTdHIuZ2V0Qnl0ZXMoKSkpOwogICAgICAgICBib29sZWFuIHdlQ2F0Y2hlZFRoZVJlbGF0aXZlTlMgPSBmYWxzZTsKIAogICAgICAgICB0cnkgewpAQCAtOTkxLDEwICs5ODgsNyBAQAogCiAgICAgICAgIGRiLnNldEVycm9ySGFuZGxlcihuZXcgSWdub3JlQWxsRXJyb3JIYW5kbGVyKCkpOwogCi0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQuZ2V0Qnl0ZXMoKSkpIHsKLSAgICAgICAgICAgIGRvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQuZ2V0Qnl0ZXMoKSkpOwogICAgICAgICBDYW5vbmljYWxpemVyIGMxNG5pemVyID0KICAgICAgICAgICAgIENhbm9uaWNhbGl6ZXIuZ2V0SW5zdGFuY2UoQ2Fub25pY2FsaXplci5BTEdPX0lEX0MxNE5fT01JVF9DT01NRU5UUyk7CiAKQEAgLTExMTcsMTAgKzExMTEsNyBAQAogICAgICAgICAvL1N0cmluZyBFTkNPRElOR19VVEY4ID0gIlVURi04IjsKICAgICAgICAgU3RyaW5nIEVOQ09ESU5HX1VURjE2ID0gIlVURi0xNiI7CiAgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSk7Ci0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQpKSB7Ci0gICAgICAgICAgICBkb2MgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0KSk7CiAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0RmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vYzE0bi9pbXBsZW1lbnRhdGlvbnMvU2FudHVhcmlvMTkxVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9jMTRuL2ltcGxlbWVudGF0aW9ucy9TYW50dWFyaW8xOTFUZXN0LmphdmEKaW5kZXggOGMyNmIyMi4uNDU5MDNiZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9jMTRuL2ltcGxlbWVudGF0aW9ucy9TYW50dWFyaW8xOTFUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9jMTRuL2ltcGxlbWVudGF0aW9ucy9TYW50dWFyaW8xOTFUZXN0LmphdmEKQEAgLTIwLDcgKzIwLDYgQEAKIAogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKIAogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKIApAQCAtNjUsMTAgKzY0LDcgQEAKICAgICAgICAgLy8gUGFyc2UgdGhlIERhdGEKICAgICAgICAgLy8KICAgICAgICAgZGIgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKElOUFVUX0RBVEEuZ2V0Qnl0ZXMoIlVURjgiKSkpIHsKLSAgICAgICAgICAgIGRvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oSU5QVVRfREFUQS5nZXRCeXRlcygiVVRGOCIpKSk7CiAKICAgICAgICAgLy8KICAgICAgICAgLy8gQ2Fub25pY2FsaXplIHRoZSBkYXRhCmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2MxNG4vaW1wbGVtZW50YXRpb25zL1NhbnR1YXJpbzI3M1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vYzE0bi9pbXBsZW1lbnRhdGlvbnMvU2FudHVhcmlvMjczVGVzdC5qYXZhCmluZGV4IDhiODE5MGIuLjIxZTYwZmYgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vYzE0bi9pbXBsZW1lbnRhdGlvbnMvU2FudHVhcmlvMjczVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vYzE0bi9pbXBsZW1lbnRhdGlvbnMvU2FudHVhcmlvMjczVGVzdC5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRlc3QuZG9tLmMxNG4uaW1wbGVtZW50YXRpb25zOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aDsKQEAgLTgwLDEwICs3OSw5IEBACiAgICAgICAgIERvY3VtZW50QnVpbGRlciBkb2N1bWVudEJ1aWxkZXIgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIodHJ1ZSk7CiAKICAgICAgICAgZG9jdW1lbnRCdWlsZGVyLnNldEVycm9ySGFuZGxlcihuZXcgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSWdub3JlQWxsRXJyb3JIYW5kbGVyKCkpOwotICAgICAgICBEb2N1bWVudCBkb2MgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpKSB7Ci0gICAgICAgICAgICBkb2MgPSBkb2N1bWVudEJ1aWxkZXIucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIGJ5dGUgaW5wdXRCeXRlc1tdID0gaW5wdXQuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jID0KKyAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXRCeXRlcykpOwogCiAgICAgICAgIENhbm9uaWNhbGl6ZXIgYzE0biA9CiAgICAgICAgICAgICBDYW5vbmljYWxpemVyLmdldEluc3RhbmNlKENhbm9uaWNhbGl6ZXIuQUxHT19JRF9DMTROMTFfT01JVF9DT01NRU5UUyk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2VuY3J5cHRpb24vRW5jcnlwdENvbnRlbnRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2VuY3J5cHRpb24vRW5jcnlwdENvbnRlbnRUZXN0LmphdmEKaW5kZXggOGQ4N2YzNy4uMTc4OTE5MyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9lbmNyeXB0aW9uL0VuY3J5cHRDb250ZW50VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vZW5jcnlwdGlvbi9FbmNyeXB0Q29udGVudFRlc3QuamF2YQpAQCAtMTksNyArMTksNiBAQAogcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50ZXN0LmRvbS5lbmNyeXB0aW9uOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOwogCiBpbXBvcnQgamF2YXguY3J5cHRvLkNpcGhlcjsKQEAgLTExMywxMCArMTEyLDcgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCi0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oREFUQS5nZXRCeXRlcygiVVRGOCIpKSkgewotICAgICAgICAgICAgZG9jID0gZGIucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvYyA9IGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShEQVRBLmdldEJ5dGVzKCJVVEY4IikpKTsKICAgICAgICAgTm9kZUxpc3QgZGF0YVRvRW5jcnlwdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlciIpOwogCiAgICAgICAgIFhNTENpcGhlciBkYXRhQ2lwaGVyID0gWE1MQ2lwaGVyLmdldEluc3RhbmNlKFhNTENpcGhlci5UUklQTEVERVMpOwpAQCAtMTY1LDEwICsxNjEsNyBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShNVUxUSVBMRV9VU0VSX0RBVEEuZ2V0Qnl0ZXMoIlVURjgiKSkpIHsKLSAgICAgICAgICAgIGRvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oTVVMVElQTEVfVVNFUl9EQVRBLmdldEJ5dGVzKCJVVEY4IikpKTsKICAgICAgICAgTm9kZUxpc3QgZGF0YVRvRW5jcnlwdCA9IGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZSgidXNlciIpOwogCiAgICAgICAgIFhNTENpcGhlciBkYXRhQ2lwaGVyID0gWE1MQ2lwaGVyLmdldEluc3RhbmNlKFhNTENpcGhlci5UUklQTEVERVMpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9lbmNyeXB0aW9uL1NpZ25lZEVuY3J5cHRlZFRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vZW5jcnlwdGlvbi9TaWduZWRFbmNyeXB0ZWRUZXN0LmphdmEKaW5kZXggNDAwNDkxOC4uMWJjMTYxOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9lbmNyeXB0aW9uL1NpZ25lZEVuY3J5cHRlZFRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2VuY3J5cHRpb24vU2lnbmVkRW5jcnlwdGVkVGVzdC5qYXZhCkBAIC00MCw3ICs0MCw2IEBACiBpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOwogaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVBhaXJHZW5lcmF0b3I7CkBAIC0xMDIsMTAgKzEwMSw3IEBACiAKICAgICBwdWJsaWMgdm9pZCBzZWN1cmVBbmRWZXJpZnkoVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zZm9ybWVyRmFjdG9yeSwgYm9vbGVhbiB1c2VEb2N1bWVudFNlcmlhbGl6ZXIpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYnVpbGRlciA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShTQU1QTEVfTVNHLmdldEJ5dGVzKCJVVEY4IikpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGJ1aWxkZXIucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYnVpbGRlci5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oU0FNUExFX01TRy5nZXRCeXRlcygiVVRGLTgiKSkpOwogCiAgICAgICAgIC8vIFNldCB1cCB0aGUgS2V5CiAgICAgICAgIEtleVBhaXJHZW5lcmF0b3IgcnNhS2V5Z2VuID0gS2V5UGFpckdlbmVyYXRvci5nZXRJbnN0YW5jZSgiUlNBIik7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2VuY3J5cHRpb24vWE1MQ2lwaGVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9lbmNyeXB0aW9uL1hNTENpcGhlclRlc3QuamF2YQppbmRleCAxYWMyMDIwLi42ZDhjZmY3IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2VuY3J5cHRpb24vWE1MQ2lwaGVyVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vZW5jcnlwdGlvbi9YTUxDaXBoZXJUZXN0LmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKQEAgLTczNSwxMCArNzM0LDcgQEAKICAgICAgICAgICAgIC8vIFRlc3QgaW5oZXJpdGVkIG5hbWVzcGFjZXMgZG9uJ3QgYWRkIGV4dHJhIGF0dHJpYnV0ZXMKICAgICAgICAgICAgIC8vIFRlc3QgdW51c2VkIG5hbWVzcGFjZXMgYXJlIHByZXNlcnZlZAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIERBVEExID0gIjxuczpyb290IHhtbG5zOm5zPVwibnMuY29tXCI+PG5zOmVsZW0geG1sbnM6bnMyPVwibnMyLmNvbVwiPjExPC9uczplbGVtPjwvbnM6cm9vdD4iOwotICAgICAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oREFUQTEuZ2V0Qnl0ZXMoIlVURjgiKSkpIHsKLSAgICAgICAgICAgICAgICBkb2MgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oREFUQTEuZ2V0Qnl0ZXMoIlVURjgiKSkpOwogICAgICAgICAgICAgRWxlbWVudCBlbGVtID0gKEVsZW1lbnQpZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEZpcnN0Q2hpbGQoKTsKIAogICAgICAgICAgICAgWE1MQ2lwaGVyIGRhdGFDaXBoZXIgPSBYTUxDaXBoZXIuZ2V0SW5zdGFuY2UoWE1MQ2lwaGVyLlRSSVBMRURFUyk7CkBAIC03NjIsOSArNzU4LDcgQEAKIAogICAgICAgICAgICAgLy8gVGVzdCBkZWZhdWx0IG5hbWVzcGFjZSB1bmRlY2xhcmF0aW9uIGlzIHByZXNlcnZlZAogICAgICAgICAgICAgZmluYWwgU3RyaW5nIERBVEEyID0gIjxuczpyb290IHhtbG5zPVwiZGVmbnMuY29tXCIgeG1sbnM6bnM9XCJucy5jb21cIj48ZWxlbSB4bWxucz1cIlwiPjExPC9lbGVtPjwvbnM6cm9vdD4iOwotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShEQVRBMi5nZXRCeXRlcygiVVRGOCIpKSkgewotICAgICAgICAgICAgICAgIGRvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvYyA9IGRiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShEQVRBMi5nZXRCeXRlcygiVVRGOCIpKSk7CiAgICAgICAgICAgICBlbGVtID0gKEVsZW1lbnQpZG9jLmdldERvY3VtZW50RWxlbWVudCgpLmdldEZpcnN0Q2hpbGQoKTsKIAogICAgICAgICAgICAgZGF0YUNpcGhlciA9IFhNTENpcGhlci5nZXRJbnN0YW5jZShYTUxDaXBoZXIuVFJJUExFREVTKTsKQEAgLTc4OSw5ICs3ODMsNyBAQAogICAgICAgICAgICAgLy8gVGVzdCBjb21tZW50cyBhbmQgUElzIGFyZSBub3QgdHJlYXRlZCBzcGVjaWFsbHkgd2hlbiBzZXJpYWxpemluZyBlbGVtZW50IGNvbnRlbnQuCiAgICAgICAgICAgICAvLyBPdGhlciBjMTRuIGFsZ29yaXRobXMgYWRkIGEgbmV3bGluZSBhZnRlciBjb21tZW50cyBhbmQgUElzLCB3aGVuIHRoZXkgYXJlIGJlZm9yZSBvciBhZnRlciB0aGUgZG9jdW1lbnQgZWxlbWVudC4KICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBEQVRBMyA9ICI8cm9vdD48IS0tY29tbWVudDEtLT48P3BpMSB0YXJnZXQxPz48ZWxlbS8+PCEtLWNvbW1lbnQyLS0+PD9waTIgdGFyZ2V0Mj8+PC9yb290PiI7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKERBVEEzLmdldEJ5dGVzKCJVVEY4IikpKSB7Ci0gICAgICAgICAgICAgICAgZG9jID0gZGIucGFyc2UoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZG9jID0gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKERBVEEzLmdldEJ5dGVzKCJVVEY4IikpKTsKICAgICAgICAgICAgIGVsZW0gPSAoRWxlbWVudClkb2MuZ2V0RG9jdW1lbnRFbGVtZW50KCk7CiAKICAgICAgICAgICAgIGRhdGFDaXBoZXIgPSBYTUxDaXBoZXIuZ2V0SW5zdGFuY2UoWE1MQ2lwaGVyLlRSSVBMRURFUyk7CkBAIC04NTgsMTAgKzg1MCwxMCBAQAogICAgICAgICBTdHJpbmcgYmVmb3JlID0gYmFvcy50b1N0cmluZygiVVRGLTgiKTsKIAogICAgICAgICBieXRlW10gc2VyaWFsaXplZCA9IGJhb3MudG9CeXRlQXJyYXkoKTsKLSAgICAgICAgRW5jcnlwdGVkRGF0YSBlbmNyeXB0ZWREYXRhID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZXJpYWxpemVkKSkgewotICAgICAgICAgICAgZW5jcnlwdGVkRGF0YSA9IGNpcGhlci5lbmNyeXB0RGF0YShkLCBFbmNyeXB0aW9uQ29uc3RhbnRzLlRZUEVfRUxFTUVOVCwgaXMpOwotICAgICAgICB9CisgICAgICAgIEVuY3J5cHRlZERhdGEgZW5jcnlwdGVkRGF0YSA9CisgICAgICAgICAgICBjaXBoZXIuZW5jcnlwdERhdGEoCisgICAgICAgICAgICAgICAgZCwgRW5jcnlwdGlvbkNvbnN0YW50cy5UWVBFX0VMRU1FTlQsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzZXJpYWxpemVkKQorICAgICAgICAgICAgKTsKIAogICAgICAgICAvL2RlY3J5cHQKICAgICAgICAgWE1MQ2lwaGVyIGRjaXBoZXIgPSBYTUxDaXBoZXIuZ2V0SW5zdGFuY2UoWE1MQ2lwaGVyLkFFU18xMjgpOwpAQCAtODczLDkgKzg2NSw3IEBACiAgICAgICAgIGFzc2VydEVxdWFscyhiZWZvcmUsIGFmdGVyKTsKIAogICAgICAgICAvLyB0ZXN0IHdpdGggbnVsbCB0eXBlCi0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2VyaWFsaXplZCkpIHsKLSAgICAgICAgICAgIGVuY3J5cHRlZERhdGEgPSBjaXBoZXIuZW5jcnlwdERhdGEoZCwgbnVsbCwgaXMpOwotICAgICAgICB9CisgICAgICAgIGVuY3J5cHRlZERhdGEgPSBjaXBoZXIuZW5jcnlwdERhdGEoZCwgbnVsbCwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcmlhbGl6ZWQpKTsKICAgICB9CiAKICAgICBAb3JnLmp1bml0LlRlc3QKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vZW5jcnlwdGlvbi9YTUxFbmNyeXB0aW9uMTFUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2VuY3J5cHRpb24vWE1MRW5jcnlwdGlvbjExVGVzdC5qYXZhCmluZGV4IGVjYmI4M2MuLjUxMGFkYWIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vZW5jcnlwdGlvbi9YTUxFbmNyeXB0aW9uMTFUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9lbmNyeXB0aW9uL1hNTEVuY3J5cHRpb24xMVRlc3QuamF2YQpAQCAtMjgsNyArMjgsNiBAQAogaW1wb3J0IGphdmEuc2VjdXJpdHkuU2VjdXJpdHk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0LkNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkJhc2U2NDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogCkBAIC00OSw2ICs0OCw3IEBACiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkua2V5cy5jb250ZW50Llg1MDlEYXRhOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LmtleXMuY29udGVudC54NTA5LlhNTFg1MDlDZXJ0aWZpY2F0ZTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50ZXN0LmRvbS5EU05hbWVzcGFjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkVuY3J5cHRpb25Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CiAvLyBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CkBAIC01MjUsNyArNTI1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjcnNhLW9hZXAiLAogICAgICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhNTEyIiwKICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjbWdmMXNoYTEiLAotICAgICAgICAgICAgICAgICAgICBCYXNlNjQuZ2V0TWltZURlY29kZXIoKS5kZWNvZGUoIlpIVnRiWGt4TWpNPSIuZ2V0Qnl0ZXMoIlVURi04IikpCisgICAgICAgICAgICAgICAgICAgIEJhc2U2NC5kZWNvZGUoIlpIVnRiWGt4TWpNPSIuZ2V0Qnl0ZXMoIlVURi04IikpCiAgICAgICAgICAgICAgICAgKTsKIAogICAgICAgICAgICAgZG9jID0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20va2V5cy9ERVJFbmNvZGVkS2V5VmFsdWVUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2tleXMvREVSRW5jb2RlZEtleVZhbHVlVGVzdC5qYXZhCmluZGV4IGEyNTBhNzEuLmExOWRkZGQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20va2V5cy9ERVJFbmNvZGVkS2V5VmFsdWVUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9rZXlzL0RFUkVuY29kZWRLZXlWYWx1ZVRlc3QuamF2YQpAQCAtMjUsMTEgKzI1LDExIEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5QdWJsaWNLZXk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuWDUwOUVuY29kZWRLZXlTcGVjOwotaW1wb3J0IGphdmEudXRpbC5CYXNlNjQ7CiAKIGltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXI7CiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLmNvbnRlbnQuREVSRW5jb2RlZEtleVZhbHVlOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkJhc2U2NDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuSmF2YVV0aWxzOwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOwpAQCAtMTg2LDcgKzE4Niw3IEBACiAKICAgICBwcml2YXRlIFB1YmxpY0tleSBsb2FkUHVibGljS2V5KFN0cmluZyBmaWxlUGF0aCwgU3RyaW5nIGFsZ29yaXRobSkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFN0cmluZyBmaWxlRGF0YSA9IG5ldyBTdHJpbmcoSmF2YVV0aWxzLmdldEJ5dGVzRnJvbUZpbGUoZ2V0Q29udHJvbEZpbGVQYXRoKGZpbGVQYXRoKSkpOwotICAgICAgICBieXRlW10ga2V5Qnl0ZXMgPSBCYXNlNjQuZ2V0TWltZURlY29kZXIoKS5kZWNvZGUoZmlsZURhdGEpOworICAgICAgICBieXRlW10ga2V5Qnl0ZXMgPSBCYXNlNjQuZGVjb2RlKGZpbGVEYXRhKTsKICAgICAgICAgS2V5RmFjdG9yeSBrZiA9IEtleUZhY3RvcnkuZ2V0SW5zdGFuY2UoYWxnb3JpdGhtKTsKICAgICAgICAgWDUwOUVuY29kZWRLZXlTcGVjIGtleVNwZWMgPSBuZXcgWDUwOUVuY29kZWRLZXlTcGVjKGtleUJ5dGVzKTsKICAgICAgICAgcmV0dXJuIGtmLmdlbmVyYXRlUHVibGljKGtleVNwZWMpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9rZXlzL2NvbnRlbnQveDUwOS9YTUxYNTA5RGlnZXN0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9rZXlzL2NvbnRlbnQveDUwOS9YTUxYNTA5RGlnZXN0VGVzdC5qYXZhCmluZGV4IDQzZmRhZDkuLjgyYjQwYjkgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20va2V5cy9jb250ZW50L3g1MDkvWE1MWDUwOURpZ2VzdFRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2tleXMvY29udGVudC94NTA5L1hNTFg1MDlEaWdlc3RUZXN0LmphdmEKQEAgLTIxLDEyICsyMSwxMiBAQAogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUZhY3Rvcnk7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5jZXJ0Llg1MDlDZXJ0aWZpY2F0ZTsKLWltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLmNvbnRlbnQueDUwOS5YTUxYNTA5RGlnZXN0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkJhc2U2NDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5Db25zdGFudHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CiBpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKQEAgLTUzLDcgKzUzLDcgQEAKIAogICAgICAgICBjZXJ0Q29udHJvbCA9IGxvYWRDZXJ0aWZpY2F0ZSgiY2VydC1YNTA5RGlnZXN0LmNydCIpOwogCi0gICAgICAgIGRpZ2VzdENvbnRyb2wgPSBCYXNlNjQuZ2V0TWltZURlY29kZXIoKS5kZWNvZGUoZGlnZXN0QmFzZTY0Q29udHJvbCk7CisgICAgICAgIGRpZ2VzdENvbnRyb2wgPSBCYXNlNjQuZGVjb2RlKGRpZ2VzdEJhc2U2NENvbnRyb2wpOwogCiAgICAgICAgIGlmICghSW5pdC5pc0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIEluaXQuaW5pdCgpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9rZXlzL2tleXJlc29sdmVyL0tleUluZm9SZWZlcmVuY2VSZXNvbHZlclRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20va2V5cy9rZXlyZXNvbHZlci9LZXlJbmZvUmVmZXJlbmNlUmVzb2x2ZXJUZXN0LmphdmEKaW5kZXggY2IyMTc2Yy4uZWIzZmU1ZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9rZXlzL2tleXJlc29sdmVyL0tleUluZm9SZWZlcmVuY2VSZXNvbHZlclRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL2tleXMva2V5cmVzb2x2ZXIvS2V5SW5mb1JlZmVyZW5jZVJlc29sdmVyVGVzdC5qYXZhCkBAIC0yNCwxMiArMjQsMTIgQEAKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OwogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7CiBpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLlg1MDlFbmNvZGVkS2V5U3BlYzsKLWltcG9ydCBqYXZhLnV0aWwuQmFzZTY0OwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogCiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkuSW5pdDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5rZXlzLktleUluZm87CitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OwogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkNvbnN0YW50czsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5KYXZhVXRpbHM7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuWE1MVXRpbHM7CkBAIC0xNDMsNyArMTQzLDcgQEAKIAogICAgIHByaXZhdGUgUHVibGljS2V5IGxvYWRQdWJsaWNLZXkoU3RyaW5nIGZpbGVQYXRoLCBTdHJpbmcgYWxnb3JpdGhtKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIGZpbGVEYXRhID0gbmV3IFN0cmluZyhKYXZhVXRpbHMuZ2V0Qnl0ZXNGcm9tRmlsZShnZXRDb250cm9sRmlsZVBhdGgoZmlsZVBhdGgpKSk7Ci0gICAgICAgIGJ5dGVbXSBrZXlCeXRlcyA9IEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZShmaWxlRGF0YSk7CisgICAgICAgIGJ5dGVbXSBrZXlCeXRlcyA9IEJhc2U2NC5kZWNvZGUoZmlsZURhdGEpOwogICAgICAgICBLZXlGYWN0b3J5IGtmID0gS2V5RmFjdG9yeS5nZXRJbnN0YW5jZShhbGdvcml0aG0pOwogICAgICAgICBYNTA5RW5jb2RlZEtleVNwZWMga2V5U3BlYyA9IG5ldyBYNTA5RW5jb2RlZEtleVNwZWMoa2V5Qnl0ZXMpOwogICAgICAgICByZXR1cm4ga2YuZ2VuZXJhdGVQdWJsaWMoa2V5U3BlYyk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3NlY3VyZV92YWwvRm9yYmlkZGVuQWxnb3JpdGhtVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9zZWN1cmVfdmFsL0ZvcmJpZGRlbkFsZ29yaXRobVRlc3QuamF2YQppbmRleCA5MmIwODJiLi4xMjA4ZDRkIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3NlY3VyZV92YWwvRm9yYmlkZGVuQWxnb3JpdGhtVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2VjdXJlX3ZhbC9Gb3JiaWRkZW5BbGdvcml0aG1UZXN0LmphdmEKQEAgLTU1LDkgKzU1LDcgQEAKICAgICAgICAgICAgIHJlYWRBbmRWZXJpZnlTaWduYXR1cmUoInNyYy90ZXN0L3Jlc291cmNlcy9pbnRlcm9wL2MxNG4vWTIiLCAic2lnbmF0dXJlLWpvc2VwaC1leGMueG1sIiwgdHJ1ZSk7CiAgICAgICAgICAgICBmYWlsKCJGYWlsdXJlIGV4cGVjdGVkIHdoZW4gc2VjdXJlIHZhbGlkYXRpb24gaXMgZW5hYmxlZCIpOwogICAgICAgICB9IGNhdGNoIChYTUxTaWduYXR1cmVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIFN0cmluZyBlcnJvciA9ICJJdCBpcyBmb3JiaWRkZW4gdG8gdXNlIGFsZ29yaXRobSBodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGRzaWctbW9yZSNtZDUgIgotICAgICAgICAgICAgICAgICsgIndoZW4gc2VjdXJlIHZhbGlkYXRpb24gaXMgZW5hYmxlZCI7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4LmdldE1lc3NhZ2UoKS5lcXVhbHMoZXJyb3IpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZXguZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJubyBYTUxTaWduYXR1cmVJbnB1dCIpKTsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9zaWduYXR1cmUvQ3JlYXRlU2lnbmF0dXJlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9zaWduYXR1cmUvQ3JlYXRlU2lnbmF0dXJlVGVzdC5qYXZhCmluZGV4IGEwZWIzNzcuLmE5ZWM1YzEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2lnbmF0dXJlL0NyZWF0ZVNpZ25hdHVyZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3NpZ25hdHVyZS9DcmVhdGVTaWduYXR1cmVUZXN0LmphdmEKQEAgLTIxLDcgKzIxLDYgQEAKIGltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CiBpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlQYWlyOwogaW1wb3J0IGphdmEuc2VjdXJpdHkuS2V5UGFpckdlbmVyYXRvcjsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOwpAQCAtMTk0LDkgKzE5Myw3IEBACiAgICAgICAgIFN0cmluZyBzaWduZWREb2MgPSBuZXcgU3RyaW5nKGJvcy50b0J5dGVBcnJheSgpKTsKIAogICAgICAgICAvLyBOb3cgVmVyaWZ5Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2lnbmVkRG9jLmdldEJ5dGVzKCkpKSB7Ci0gICAgICAgICAgICBkb2MgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZG9jID0gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNpZ25lZERvYy5nZXRCeXRlcygpKSk7CiAKICAgICAgICAgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgICAgICBYUGF0aCB4cGF0aCA9IHhwZi5uZXdYUGF0aCgpOwpAQCAtMjE0LDEwICsyMTEsNyBAQAogICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5vbmljYWxpemVkT2N0ZXRTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgU3RyaW5nIHNpZ25lZFhNTCA9IGRvU2lnbigpOwogCi0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2lnbmVkWE1MLmdldEJ5dGVzKCkpKSB7Ci0gICAgICAgICAgICBkb2MgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNpZ25lZFhNTC5nZXRCeXRlcygpKSk7CiAKICAgICAgICAgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwogICAgICAgICBYUGF0aCB4cGF0aCA9IHhwZi5uZXdYUGF0aCgpOwpAQCAtMzM3LDEwICszMzEsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkb1ZlcmlmeShTdHJpbmcgc2lnbmVkWE1MKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRG9jdW1lbnQgZG9jID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzaWduZWRYTUwuZ2V0Qnl0ZXMoKSkpIHsKLSAgICAgICAgICAgIGRvYyA9IGRiLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2MgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2lnbmVkWE1MLmdldEJ5dGVzKCkpKTsKIAogICAgICAgICBYUGF0aEZhY3RvcnkgeHBmID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CiAgICAgICAgIFhQYXRoIHhwYXRoID0geHBmLm5ld1hQYXRoKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3NpZ25hdHVyZS9FQ0RTQVNpZ25hdHVyZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2lnbmF0dXJlL0VDRFNBU2lnbmF0dXJlVGVzdC5qYXZhCmluZGV4IGQ3YzA1YzcuLmM5NzY2MDIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2lnbmF0dXJlL0VDRFNBU2lnbmF0dXJlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2lnbmF0dXJlL0VDRFNBU2lnbmF0dXJlVGVzdC5qYXZhCkBAIC0xMjYsOSArMTI2LDkgQEAKIAogICAgICAgICBGaWxlIGZpbGUgPQogICAgICAgICAgICAgbWFrZURhdGFGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvc2FtcGxlcy9pbnB1dC9lY2RzYVNpZ25hdHVyZS54bWwiKTsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSkpIHsKLSAgICAgICAgICAgIGRvVmVyaWZ5KGlzKTsKLSAgICAgICAgfQorICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmlsZSk7CisKKyAgICAgICAgZG9WZXJpZnkoaXMpOwogICAgIH0KIAogICAgIEBvcmcuanVuaXQuVGVzdApAQCAtMTM5LDkgKzEzOSw5IEBACiAgICAgICAgIH0KIAogICAgICAgICBGaWxlIGZpbGUgPSBtYWtlRGF0YUZpbGUoInNyYy90ZXN0L3Jlc291cmNlcy9hdC9idWVyZ2Vya2FydGUvdGVzdHJlc3AueG1sIik7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpKSB7Ci0gICAgICAgICAgICBkb1ZlcmlmeShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGZpbGUpOworCisgICAgICAgIGRvVmVyaWZ5KGlzKTsKICAgICB9CiAKICAgICBwcml2YXRlIGJ5dGVbXSBkb1NpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKQEAgLTE4Myw5ICsxODMsNyBAQAogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkb1ZlcmlmeShieXRlW10gc2lnbmVkWG1sKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzaWduZWRYbWwpKSB7Ci0gICAgICAgICAgICBkb1ZlcmlmeShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZG9WZXJpZnkobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNpZ25lZFhtbCkpOwogICAgIH0KIAogICAgIHByaXZhdGUgdm9pZCBkb1ZlcmlmeShJbnB1dFN0cmVhbSBpcykgdGhyb3dzIEV4Y2VwdGlvbiB7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3NpZ25hdHVyZS9YNTA5RGF0YVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2lnbmF0dXJlL1g1MDlEYXRhVGVzdC5qYXZhCmluZGV4IDJhZTMzYzkuLjBmMjg0ODUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2lnbmF0dXJlL1g1MDlEYXRhVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2lnbmF0dXJlL1g1MDlEYXRhVGVzdC5qYXZhCkBAIC0yMSw3ICsyMSw2IEBACiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsNCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07DQogaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOw0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOw0KIGltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOw0KIGltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZhdGVLZXk7DQogaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5YNTA5Q2VydGlmaWNhdGU7DQpAQCAtNzQsMTAgKzczLDcgQEAKICAgICBwcml2YXRlIFhNTFNpZ25hdHVyZSBnZXRTaWduYXR1cmUoYnl0ZVtdIHMpIHRocm93cyBFeGNlcHRpb24gew0KIA0KICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKTsNCi0gICAgICAgIERvY3VtZW50IGRvYyA9IG51bGw7DQotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMpKSB7DQotICAgICAgICAgICAgZG9jID0gZGIucGFyc2UoaXMpOw0KLSAgICAgICAgfQ0KKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMpKTsNCiAgICAgICAgIEVsZW1lbnQgZWwgPSAoRWxlbWVudClkb2MuZ2V0Rmlyc3RDaGlsZCgpOw0KICAgICAgICAgcmV0dXJuIG5ldyBYTUxTaWduYXR1cmUoZWwsICIiKTsNCiAgICAgfQ0KZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vc2lnbmF0dXJlL1hNTFNpZ25hdHVyZUlucHV0VGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9zaWduYXR1cmUvWE1MU2lnbmF0dXJlSW5wdXRUZXN0LmphdmEKaW5kZXggYmU1Yjk3Zi4uYWE4NjJiOSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9zaWduYXR1cmUvWE1MU2lnbmF0dXJlSW5wdXRUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS9zaWduYXR1cmUvWE1MU2lnbmF0dXJlSW5wdXRUZXN0LmphdmEKQEAgLTEwOSwzMiArMTA5LDI5IEBACiAKICAgICBAb3JnLmp1bml0LlRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0SXNJbml0aWFsaXplZFdpdGhPY3RldFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPQotICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKF9vY3RldFN0cmVhbVRleHRJbnB1dC5nZXRCeXRlcygpKSkgewotICAgICAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgaW5wdXQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoaW5wdXRTdHJlYW0pOworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9CisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oX29jdGV0U3RyZWFtVGV4dElucHV0LmdldEJ5dGVzKCkpOworICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBpbnB1dCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChpbnB1dFN0cmVhbSk7CiAKLSAgICAgICAgICAgIGFzc2VydFRydWUoIklucHV0IGlzIGluaXRpYWxpemVkIiwgaW5wdXQuaXNJbml0aWFsaXplZCgpKTsKLSAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJJbnB1dCBpcyBpbml0aWFsaXplZCIsIGlucHV0LmlzSW5pdGlhbGl6ZWQoKSk7CiAgICAgfQogCiAgICAgQG9yZy5qdW5pdC5UZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdE9jdGV0U3RyZWFtSXNPY3RldFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPQotICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKF9vY3RldFN0cmVhbVRleHRJbnB1dC5nZXRCeXRlcygpKSkgewotICAgICAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgaW5wdXQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoaW5wdXRTdHJlYW0pOworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9CisgICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oX29jdGV0U3RyZWFtVGV4dElucHV0LmdldEJ5dGVzKCkpOworICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBpbnB1dCA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChpbnB1dFN0cmVhbSk7CiAKLSAgICAgICAgICAgIGFzc2VydFRydWUoIklucHV0IGlzIG9jdGV0IHN0cmVhbSIsIGlucHV0LmlzT2N0ZXRTdHJlYW0oKSk7Ci0gICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZSgiSW5wdXQgaXMgb2N0ZXQgc3RyZWFtIiwgaW5wdXQuaXNPY3RldFN0cmVhbSgpKTsKICAgICB9CiAKICAgICBAb3JnLmp1bml0LlRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0T2N0ZXRTdHJlYW1Jc05vdE5vZGVTZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0KLSAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShfb2N0ZXRTdHJlYW1UZXh0SW5wdXQuZ2V0Qnl0ZXMoKSkpIHsKLSAgICAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IGlucHV0ID0gbmV3IFhNTFNpZ25hdHVyZUlucHV0KGlucHV0U3RyZWFtKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPQorICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKF9vY3RldFN0cmVhbVRleHRJbnB1dC5nZXRCeXRlcygpKTsKKyAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgaW5wdXQgPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoaW5wdXRTdHJlYW0pOwogCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCJJbnB1dCBpcyBub3Qgbm9kZSBzZXQiLCAhaW5wdXQuaXNOb2RlU2V0KCkpOwotICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIklucHV0IGlzIG5vdCBub2RlIHNldCIsICFpbnB1dC5pc05vZGVTZXQoKSk7CiAgICAgfQogCiB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3RyYW5zZm9ybXMvRW1wdHlOYW1lc3BhY2VUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3RyYW5zZm9ybXMvRW1wdHlOYW1lc3BhY2VUZXN0LmphdmEKaW5kZXggZjMzNDU2MS4uNjYyMWEyZCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS90cmFuc2Zvcm1zL0VtcHR5TmFtZXNwYWNlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vdHJhbnNmb3Jtcy9FbXB0eU5hbWVzcGFjZVRlc3QuamF2YQpAQCAtNzcsMTYgKzc3LDE2IEBACiAKICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKIAotICAgICAgICB0cnkgKEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obWVzc2FnZS5nZXRCeXRlcygiVVRGLTgiKSkpIHsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFN0cmVhbShvdXRwdXRTdHJlYW0pOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogCi0gICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0oc3RyZWFtKTsKLSAgICAgICAgICAgIHRyYW5zZm9ybWVyLmRvRmluYWwoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG91dHB1dFN0cmVhbS50b1N0cmluZygpOwotICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtZXNzYWdlLCByZXN1bHQpOwotICAgICAgICB9CisgICAgICAgIHRyYW5zZm9ybWVyLnNldE91dHB1dFN0cmVhbShvdXRwdXRTdHJlYW0pOworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obWVzc2FnZS5nZXRCeXRlcygiVVRGLTgiKSk7CisKKyAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHN0cmVhbSk7CisgICAgICAgIHRyYW5zZm9ybWVyLmRvRmluYWwoKTsKKyAgICAgICAgCisgICAgICAgIFN0cmluZyByZXN1bHQgPSBvdXRwdXRTdHJlYW0udG9TdHJpbmcoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhtZXNzYWdlLCByZXN1bHQpOwogICAgIH0KIAogICAgIEBvcmcuanVuaXQuVGVzdApAQCAtMTAwLDEwICsxMDAsNyBAQAogICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwogICAgICAgICBkb2N1bWVudEJ1aWxkZXJGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwogICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgZG9jdW1lbnRCdWlsZGVyID0gZG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1lc3NhZ2UuZ2V0Qnl0ZXMoIlVURi04IikpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IGRvY3VtZW50QnVpbGRlci5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2N1bWVudEJ1aWxkZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG1lc3NhZ2UuZ2V0Qnl0ZXMoIlVURi04IikpKTsKIAogICAgICAgICBTdHJpbmcgaW5jbHVzaXZlTmFtZXNwYWNlcyA9ICJTT0FQLUVOViBlYyBlYzEgbnMwIG5zMSBuczExIG5zMiBuczQgbnM5IjsKICAgICAgICAgYnl0ZVtdIG91dHB1dCA9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3RyYW5zZm9ybXMvaW1wbGVtZW50YXRpb25zL1RyYW5zZm9ybUJhc2U2NERlY29kZVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vdHJhbnNmb3Jtcy9pbXBsZW1lbnRhdGlvbnMvVHJhbnNmb3JtQmFzZTY0RGVjb2RlVGVzdC5qYXZhCmluZGV4IGUwYjQyMmIuLjJkNjVhYTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vdHJhbnNmb3Jtcy9pbXBsZW1lbnRhdGlvbnMvVHJhbnNmb3JtQmFzZTY0RGVjb2RlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vdHJhbnNmb3Jtcy9pbXBsZW1lbnRhdGlvbnMvVHJhbnNmb3JtQmFzZTY0RGVjb2RlVGVzdC5qYXZhCkBAIC0xOSw3ICsxOSw2IEBACiBwYWNrYWdlIG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRlc3QuZG9tLnRyYW5zZm9ybXMuaW1wbGVtZW50YXRpb25zOwogCiBpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwogCiBpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOwogaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CkBAIC02MSwxMCArNjAsOCBAQAogICAgICAgICBkb2MuYXBwZW5kQ2hpbGQodC5nZXRFbGVtZW50KCkpOwogICAgICAgICB0LmFkZFRyYW5zZm9ybShUcmFuc2Zvcm1CYXNlNjREZWNvZGUuaW1wbGVtZW50ZWRUcmFuc2Zvcm1VUkkpOwogCi0gICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IGluID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzMS5nZXRCeXRlcygpKSkgewotICAgICAgICAgICAgaW4gPSBuZXcgWE1MU2lnbmF0dXJlSW5wdXQoaXMpOwotICAgICAgICB9CisgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IGluID0KKyAgICAgICAgICAgIG5ldyBYTUxTaWduYXR1cmVJbnB1dChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oczEuZ2V0Qnl0ZXMoKSkpOwogICAgICAgICBYTUxTaWduYXR1cmVJbnB1dCBvdXQgPSB0LnBlcmZvcm1UcmFuc2Zvcm1zKGluKTsKICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcob3V0LmdldEJ5dGVzKCkpOwogCkBAIC04NSwxMCArODIsOCBAQAogCiAgICAgICAgIHQuYWRkVHJhbnNmb3JtKFRyYW5zZm9ybUJhc2U2NERlY29kZS5pbXBsZW1lbnRlZFRyYW5zZm9ybVVSSSk7CiAKLSAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgaW4gPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHMyLmdldEJ5dGVzKCkpKSB7Ci0gICAgICAgICAgICBpbiA9IG5ldyBYTUxTaWduYXR1cmVJbnB1dChpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgWE1MU2lnbmF0dXJlSW5wdXQgaW4gPQorICAgICAgICAgICAgbmV3IFhNTFNpZ25hdHVyZUlucHV0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzMi5nZXRCeXRlcygpKSk7CiAgICAgICAgIFhNTFNpZ25hdHVyZUlucHV0IG91dCA9IHQucGVyZm9ybVRyYW5zZm9ybXModC5wZXJmb3JtVHJhbnNmb3JtcyhpbikpOwogICAgICAgICBTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZyhvdXQuZ2V0Qnl0ZXMoKSk7CiAKQEAgLTExMywxMCArMTA4LDcgQEAKIAogICAgICAgICBkYi5zZXRFcnJvckhhbmRsZXIobmV3IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLklnbm9yZUFsbEVycm9ySGFuZGxlcigpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2MgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpKSB7Ci0gICAgICAgICAgICBkb2MgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jID0gZGIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpKTsKICAgICAgICAgLy9YTUxVdGlscy5jaXJjdW12ZW50QnVnMjY1MChkb2MpOwogCiAgICAgICAgIFhQYXRoRmFjdG9yeSB4cGYgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vdHJhbnNmb3Jtcy9pbXBsZW1lbnRhdGlvbnMvWHBhdGgyVHJhbnNmb3JtYXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3RyYW5zZm9ybXMvaW1wbGVtZW50YXRpb25zL1hwYXRoMlRyYW5zZm9ybWF0aW9uVGVzdC5qYXZhCmluZGV4IDM4YTQ0OWYuLjYzNmVhNWQgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9kb20vdHJhbnNmb3Jtcy9pbXBsZW1lbnRhdGlvbnMvWHBhdGgyVHJhbnNmb3JtYXRpb25UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS90cmFuc2Zvcm1zL2ltcGxlbWVudGF0aW9ucy9YcGF0aDJUcmFuc2Zvcm1hdGlvblRlc3QuamF2YQpAQCAtMTI3LDExICsxMjcsMTAgQEAKICAgICAgICAgIiAgICAgIDwvZWRvYzpPYmplY3RDb250ZW50PlxuIiArIA0KICAgICAgICAgIiAgIDwvZWRvYzpPYmplY3Q+IjsNCiAgICAgICAgIA0KKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oc2lnLmdldEJ5dGVzKCkpOw0KKw0KICAgICAgICAgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyIGRiID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKTsNCi0gICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IG51bGw7DQotICAgICAgICB0cnkgKEJ5dGVBcnJheUlucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNpZy5nZXRCeXRlcygpKSkgew0KLSAgICAgICAgICAgIGRvYyA9IGRiLnBhcnNlKGlzKTsNCi0gICAgICAgIH0NCisgICAgICAgIG9yZy53M2MuZG9tLkRvY3VtZW50IGRvYyA9IGRiLnBhcnNlKGlzKTsNCiAgICAgICAgIEVsZW1lbnQgc2lnRWxlbWVudCA9DQogICAgICAgICAgICAgKEVsZW1lbnQpIGRvYy5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKA0KICAgICAgICAgICAgICAgICBDb25zdGFudHMuU2lnbmF0dXJlU3BlY05TLCBDb25zdGFudHMuX1RBR19TSUdOQVRVUkUpLml0ZW0oMCk7DQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS91dGlscy9CYXNlNjRUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3QvZG9tL3V0aWxzL0Jhc2U2NFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2E3ZTUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L2RvbS91dGlscy9CYXNlNjRUZXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qKgorICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQorICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuIFNlZSB0aGUgTk9USUNFIGZpbGUKKyAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKKyAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKKyAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKKyAqIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKKyAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCisgKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKKyAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCisgKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCisgKiB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50ZXN0LmRvbS51dGlsczsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLlhNTFV0aWxzOworCisKKy8qKgorICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudXRpbHMuQmFzZTY0fQorICoKKyAqIEBhdXRob3IgQ2hyaXN0aWFuIEdldWVyLVBvbGxtYW5uCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlNjRUZXN0IGV4dGVuZHMgb3JnLmp1bml0LkFzc2VydCB7CisKKyAgICBzdGF0aWMgb3JnLnNsZjRqLkxvZ2dlciBsb2cgPQorICAgICAgICBvcmcuc2xmNGouTG9nZ2VyRmFjdG9yeS5nZXRMb2dnZXIoQmFzZTY0VGVzdC5jbGFzcyk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5Jbml0LmluaXQoKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QTEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRleHREYXRhID0gIkhhbGxvIjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdDAgPSBCYXNlNjQuZW5jb2RlKHRleHREYXRhLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVzdWx0IG9mIGVuY29kaW5nIHJlc3VsdDAiLCByZXN1bHQwKTsKKworICAgICAgICBieXRlIHJlc3VsdEJ5dGVzW10gPSBCYXNlNjQuZGVjb2RlKHJlc3VsdDApOworICAgICAgICBTdHJpbmcgcmVzdWx0U3RyID0gbmV3IFN0cmluZyhyZXN1bHRCeXRlcywgIlVURi04Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHQgb2YgZGVjb2RpbmciLCAwLCB0ZXh0RGF0YS5jb21wYXJlVG8ocmVzdWx0U3RyKSk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgQmFzZTY0LmRlY29kZShyZXN1bHQwLmdldEJ5dGVzKCksb3MpOworICAgICAgICByZXN1bHRTdHIgPSBuZXcgU3RyaW5nKG9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3VsdCBvZiBkZWNvZGluZyIsIDAsIHRleHREYXRhLmNvbXBhcmVUbyhyZXN1bHRTdHIpKTsKKyAgICB9CisKKyAgICBAb3JnLmp1bml0LlRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcDEoKSB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBpbnB1dERhdGEgPSAiVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyBhbmQgc29tZSBleHRyIjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0KKyAgICAgICAgICAgICJWR2hsSUhGMWFXTnJJR0p5YjNkdUlHWnZlQ0JxZFcxd2N5QnZkbVZ5SUhSb1pTQnNZWHA1SUdSdlp5QmhibVFnYzI5dFpTQmxlSFJ5IjsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IEJhc2U2NC5lbmNvZGUoaW5wdXREYXRhLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHQgb2YgZW5jb2RpbmciLCByZXN1bHQsIGV4cGVjdGVkUmVzdWx0KTsKKworICAgICAgICBTdHJpbmcgcmVzdWx0MiA9IG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZShyZXN1bHQpLCAiVVRGLTgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHQgb2YgZW5jb2RpbmciLCByZXN1bHQyLCBpbnB1dERhdGEpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIEJhc2U2NC5kZWNvZGUoZXhwZWN0ZWRSZXN1bHQuZ2V0Qnl0ZXMoKSxvcyk7CisgICAgICAgIHJlc3VsdDIgPSBuZXcgU3RyaW5nKG9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3VsdCBvZiBlbmNvZGluZyIsIHJlc3VsdDIsIGlucHV0RGF0YSk7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyYXAyKCkgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiwgRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgaW5wdXREYXRhID0KKyAgICAgICAgICAgICJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nIGFuZCBzb21lIGV4dHJhIHRleHQgdGhhdCB3aWxsIGNhdXNlIGEgbGluZSB3cmFwIjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gbnVsbDsKKyAgICAgICAgaWYgKFhNTFV0aWxzLmlnbm9yZUxpbmVCcmVha3MoKSkgeworICAgICAgICAgICAgZXhwZWN0ZWRSZXN1bHQgPQorICAgICAgICAgICAgICAgICJWR2hsSUhGMWFXTnJJR0p5YjNkdUlHWnZlQ0JxZFcxd2N5QnZkbVZ5SUhSb1pTQnNZWHA1SUdSdlp5QmhibVFnYzI5dFpTQmxlSFJ5WVNCMFpYaDBJSFJvWVhRZ2QybHNiQ0JqWVhWelpTQmhJR3hwYm1VZ2QzSmhjQT09IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4cGVjdGVkUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAiVkdobElIRjFhV05ySUdKeWIzZHVJR1p2ZUNCcWRXMXdjeUJ2ZG1WeUlIUm9aU0JzWVhwNUlHUnZaeUJoYm1RZ2MyOXRaU0JsZUhSeVxyXG5ZU0IwWlhoMElIUm9ZWFFnZDJsc2JDQmpZWFZ6WlNCaElHeHBibVVnZDNKaGNBPT0iOworICAgICAgICB9CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBCYXNlNjQuZW5jb2RlKGlucHV0RGF0YS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0IG9mIGVuY29kaW5nIiwgcmVzdWx0LCBleHBlY3RlZFJlc3VsdCk7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdDIgPSBuZXcgU3RyaW5nKEJhc2U2NC5kZWNvZGUocmVzdWx0KSwgIlVURi04Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVzdWx0IG9mIGVuY29kaW5nIiwgcmVzdWx0MiwgaW5wdXREYXRhKTsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBCYXNlNjQuZGVjb2RlKGV4cGVjdGVkUmVzdWx0LmdldEJ5dGVzKCksb3MpOworICAgICAgICByZXN1bHQyID0gbmV3IFN0cmluZyhvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXN1bHQgb2YgZW5jb2RpbmciLCByZXN1bHQyLCBpbnB1dERhdGEpOworICAgIH0KKworICAgIEBvcmcuanVuaXQuVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5lV3JhcCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBrZXkgPSAiYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmYXNmIjsKKworICAgICAgICBTdHJpbmcgbWFzdGVyS2V5MSA9IEJhc2U2NC5lbmNvZGUoa2V5LmdldEJ5dGVzKCkpOworICAgICAgICBTdHJpbmcgbWFzdGVyS2V5MiA9IAorICAgICAgICAgICAgbmV3IFN0cmluZyggb3JnLmFwYWNoZS5jb21tb25zLmNvZGVjLmJpbmFyeS5CYXNlNjQuZW5jb2RlQmFzZTY0Q2h1bmtlZChrZXkuZ2V0Qnl0ZXMoKSkpLnRyaW0oKTsKKyAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJLMTogIiArIG1hc3RlcktleTEgKyAiQEAiICsgbWFzdGVyS2V5MS5sZW5ndGgoKSk7CisgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiSzI6ICIgKyBtYXN0ZXJLZXkyICsgIkBAIiArIG1hc3RlcktleTIubGVuZ3RoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWFzdGVyS2V5MSwgbWFzdGVyS2V5Mik7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9jMTRuL0V4Y2x1c2l2ZUMxNE5JbnRlcm9wVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvYzE0bi9FeGNsdXNpdmVDMTROSW50ZXJvcFRlc3QuamF2YQppbmRleCBhZWE5YTg0Li43NDBiNzQ4IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9jMTRuL0V4Y2x1c2l2ZUMxNE5JbnRlcm9wVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2MxNG4vRXhjbHVzaXZlQzE0TkludGVyb3BUZXN0LmphdmEKQEAgLTk0LDExICs5NCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9lbmNyeXB0aW9uL0JhbHRpbW9yZUVuY1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vQmFsdGltb3JlRW5jVGVzdC5qYXZhCmluZGV4IDlmYjQzYWMuLjJmM2RhMWUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vQmFsdGltb3JlRW5jVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vQmFsdGltb3JlRW5jVGVzdC5qYXZhCkBAIC0xMjYsMTEgKzEyNiw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xNjQsMTEgKzE2MSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0yMDIsMTEgKzE5Niw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0yNDAsMTEgKzIzMSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0yNzQsMTEgKzI2Miw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0zMTIsMTEgKzI5Nyw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0zNDgsMTEgKzMzMCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0zODQsMTEgKzM2Myw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC00MTYsMTEgKzM5Miw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9lbmNyeXB0aW9uL0RlY3J5cHRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9lbmNyeXB0aW9uL0RlY3J5cHRpb25UZXN0LmphdmEKaW5kZXggYzcyOGIyZS4uMTgyMjAwNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9EZWNyeXB0aW9uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vRGVjcnlwdGlvblRlc3QuamF2YQpAQCAtMTgwLDExICsxODAsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMjQwLDEyICsyMzcsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldERlY3J5cHRpb25LZXkoc2VjcmV0S2V5KTsKQEAgLTI5OSwxMiArMjkzLDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXREZWNyeXB0aW9uS2V5KHNlY3JldEtleSk7CkBAIC0zNzEsMTIgKzM2Miw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0RGVjcnlwdGlvbktleShrZWspOwpAQCAtNDQzLDEyICs0MzEsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldERlY3J5cHRpb25LZXkocHJpdik7CkBAIC01MTEsMTIgKzQ5Niw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0RGVjcnlwdGlvbktleShwcml2KTsKQEAgLTU4MywxMiArNTY1LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXREZWNyeXB0aW9uS2V5KGtlayk7CkBAIC02NDYsMTIgKzYyNSw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0RGVjcnlwdGlvbktleShzZWNyZXRLZXkpOwpAQCAtNzA5LDEyICs2ODUsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldERlY3J5cHRpb25LZXkoc2VjcmV0S2V5KTsKQEAgLTc3NCwxMiArNzQ3LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXREZWNyeXB0aW9uS2V5KHNlY3JldEtleSk7CkBAIC04NDEsMTIgKzgxMSw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0RGVjcnlwdGlvbktleShzZWNyZXRLZXkpOwpAQCAtOTA0LDEyICs4NzEsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldERlY3J5cHRpb25LZXkoc2VjcmV0S2V5KTsKQEAgLTkzNiwxMCArOTAwLDcgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIERBVEExID0KICAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+PG5zOnJvb3QgeG1sbnM6bnM9XCJucy5jb21cIj48bnM6ZWxlbSB4bWxuczpuczI9XCJuczIuY29tXCI+MTE8L25zOmVsZW0+PC9uczpyb290PiI7CiAgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShEQVRBMS5nZXRCeXRlcygiVVRGOCIpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oREFUQTEuZ2V0Qnl0ZXMoIlVURjgiKSkpOwogCiAgICAgICAgIC8vIFNldCB1cCB0aGUgS2V5CiAgICAgICAgIGJ5dGVbXSBiaXRzMTkyID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eCIuZ2V0Qnl0ZXMoKTsKQEAgLTk2NSwxMCArOTI2LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTAwNCwxMCArOTYzLDcgQEAKICAgICAgICAgZmluYWwgU3RyaW5nIERBVEExID0KICAgICAgICAgICAgICAgICAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIj8+PG5zOnJvb3QgeG1sbnM9XCJkZWZucy5jb21cIiB4bWxuczpucz1cIm5zLmNvbVwiPjxlbGVtIHhtbG5zPVwiXCI+MTE8L2VsZW0+PC9uczpyb290PiI7CiAgICAgICAgIERvY3VtZW50QnVpbGRlciBkYiA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShEQVRBMS5nZXRCeXRlcygiVVRGOCIpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBkYi5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oREFUQTEuZ2V0Qnl0ZXMoIlVURjgiKSkpOwogCiAgICAgICAgIC8vIFNldCB1cCB0aGUgS2V5CiAgICAgICAgIGJ5dGVbXSBiaXRzMTkyID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eCIuZ2V0Qnl0ZXMoKTsKQEAgLTEwMzMsMTAgKzk4OSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTEyOTcsMTAgKzEyNTEsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xMzc5LDEwICsxMzMxLDggQEAKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTQ0MSwxMCArMTM5MSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE1MTMsMTAgKzE0NjEsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xNTg0LDExICsxNTMwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE2NTYsMTEgKzE1OTksOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTczNiwxMSArMTY3Niw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xNzk5LDEyICsxNzM2LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOworCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0RGVjcnlwdGlvbktleShwcml2KTsKQEAgLTE4NTAsMTEgKzE3ODQsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTkxMiwxMSArMTg0Myw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xOTcxLDExICsxODk5LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vRW5jcnlwdGlvbkNyZWF0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9FbmNyeXB0aW9uQ3JlYXRpb25UZXN0LmphdmEKaW5kZXggZjNmZjFkMC4uZDAzYTQxMSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9FbmNyeXB0aW9uQ3JlYXRpb25UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9FbmNyeXB0aW9uQ3JlYXRpb25UZXN0LmphdmEKQEAgLTExMCwxMCArMTEwLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMSk7CkBAIC0xNjksMTAgKzE2Nyw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBDaGVjayB0aGUgQ3JlZGl0Q2FyZCBlbmNyeXB0ZWQgb2sKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJDcmVkaXRDYXJkIik7CkBAIC0yNjAsMTAgKzI1Niw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMzE5LDEwICszMTMsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAxKTsKQEAgLTM4MCwxMCArMzcyLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMSk7CkBAIC00MzgsMTAgKzQyOCw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtNTA3LDEwICs0OTUsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTU3NiwxMCArNTYyLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC02NDYsMTAgKzYzMCw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTcxOCwxMCArNzAwLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIENoZWNrIHRoZSBDcmVkaXRDYXJkIGVuY3J5cHRlZCBvawogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIkNyZWRpdENhcmQiKTsKQEAgLTc4MSwxMCArNzYxLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC04NTIsMTAgKzgzMCw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtOTMxLDEwICs5MDcsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTEwMDIsMTAgKzk3Niw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTA3MywxMCArMTA0NSw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTEzOCwxMCArMTEwOCw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTE5OSwxMCArMTE2Nyw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTI2MiwxMCArMTIyOCw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTMyNywxMCArMTI5MSw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTQ1NSwxMCArMTQxNyw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTUwOSwxOSArMTQ2OSwxNiBAQAogCiAgICAgICAgIGZpbmFsIFN0cmluZyBEQVRBMSA9CiAgICAgICAgICAgICAgICAgIjxuczpyb290IHhtbG5zOm5zPVwibnMuY29tXCI+PG5zOmVsZW0geG1sbnM6bnMyPVwibnMyLmNvbVwiPjExPC9uczplbGVtPjwvbnM6cm9vdD4iOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIHNvdXJjZURvY3VtZW50ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKERBVEExLmdldEJ5dGVzKCJVVEY4IikpKSB7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzb3VyY2VEb2N1bWVudCk7CisgICAgICAgIElucHV0U3RyZWFtIHNvdXJjZURvY3VtZW50ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKERBVEExLmdldEJ5dGVzKCJVVEY4IikpOworICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzb3VyY2VEb2N1bWVudCk7CiAKLSAgICAgICAgICAgIFhtbFJlYWRlclRvV3JpdGVyLndyaXRlQWxsKHhtbFN0cmVhbVJlYWRlciwgeG1sU3RyZWFtV3JpdGVyKTsKLSAgICAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwotICAgICAgICB9CisgICAgICAgIFhtbFJlYWRlclRvV3JpdGVyLndyaXRlQWxsKHhtbFN0cmVhbVJlYWRlciwgeG1sU3RyZWFtV3JpdGVyKTsKKyAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIm5zLmNvbSIsICJlbGVtIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTU3MiwxOSArMTUyOSwxNiBAQAogCiAgICAgICAgIGZpbmFsIFN0cmluZyBEQVRBMiA9CiAgICAgICAgICAgICAgICAgIjxuczpyb290IHhtbG5zPVwiZGVmbnMuY29tXCIgeG1sbnM6bnM9XCJucy5jb21cIj48ZWxlbSB4bWxucz1cIlwiPjExPC9lbGVtPjwvbnM6cm9vdD4iOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIHNvdXJjZURvY3VtZW50ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKERBVEEyLmdldEJ5dGVzKCJVVEY4IikpKSB7Ci0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihzb3VyY2VEb2N1bWVudCk7Ci0gICAgCi0gICAgICAgICAgICBYbWxSZWFkZXJUb1dyaXRlci53cml0ZUFsbCh4bWxTdHJlYW1SZWFkZXIsIHhtbFN0cmVhbVdyaXRlcik7Ci0gICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKLSAgICAgICAgfQorICAgICAgICBJbnB1dFN0cmVhbSBzb3VyY2VEb2N1bWVudCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShEQVRBMi5nZXRCeXRlcygiVVRGOCIpKTsKKyAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoc291cmNlRG9jdW1lbnQpOworCisgICAgICAgIFhtbFJlYWRlclRvV3JpdGVyLndyaXRlQWxsKHhtbFN0cmVhbVJlYWRlciwgeG1sU3RyZWFtV3JpdGVyKTsKKyAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoIiIsICJlbGVtIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTY0MSwxMCArMTU5NSw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9LZXlXcmFwRW5jcnlwdGlvbkNyZWF0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9LZXlXcmFwRW5jcnlwdGlvbkNyZWF0aW9uVGVzdC5qYXZhCmluZGV4IDFiOWQ0NzIuLjJiYTVlY2UgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vS2V5V3JhcEVuY3J5cHRpb25DcmVhdGlvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9lbmNyeXB0aW9uL0tleVdyYXBFbmNyeXB0aW9uQ3JlYXRpb25UZXN0LmphdmEKQEAgLTE0MSwxMCArMTQxLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC0yMDksMTAgKzIwNyw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMjc3LDEwICsyNzMsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTM0MywxMCArMzM3LDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC00MDgsMTAgKzQwMCw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtNDczLDEwICs0NjMsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTUzOCwxMCArNTI2LDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC02MDksMTEgKzU5NSw5IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CisKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKIApAQCAtNjgwLDEwICs2NjQsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTc1MSwxMCArNzMzLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC04MjIsMTAgKzgwMiw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9LZXlXcmFwRW5jcnlwdGlvblZlcmlmaWNhdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vS2V5V3JhcEVuY3J5cHRpb25WZXJpZmljYXRpb25UZXN0LmphdmEKaW5kZXggOTU0MGQ1MS4uYzhiMmFlNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9LZXlXcmFwRW5jcnlwdGlvblZlcmlmaWNhdGlvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9lbmNyeXB0aW9uL0tleVdyYXBFbmNyeXB0aW9uVmVyaWZpY2F0aW9uVGVzdC5qYXZhCkBAIC0zMTQsMTEgKzMxNCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0zNzEsMTEgKzM2OCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC00MjgsMTEgKzQyMiw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC00ODUsMTEgKzQ3Niw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC01NDgsMTEgKzUzNiw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC02MTEsMTEgKzU5Niw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC02NzQsMTEgKzY1Niw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC03MzcsMTEgKzcxNiw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9lbmNyeXB0aW9uL1N5bW1ldHJpY0VuY3J5cHRpb25DcmVhdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vU3ltbWV0cmljRW5jcnlwdGlvbkNyZWF0aW9uVGVzdC5qYXZhCmluZGV4IDZiZjdjZjAuLjZjMWJiNjIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vU3ltbWV0cmljRW5jcnlwdGlvbkNyZWF0aW9uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vU3ltbWV0cmljRW5jcnlwdGlvbkNyZWF0aW9uVGVzdC5qYXZhCkBAIC0xMjYsMTAgKzEyNiw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMTg3LDEwICsxODUsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTI0OCwxMCArMjQ0LDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC0zMDksMTAgKzMwMyw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtMzcwLDEwICszNjIsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTQzMSwxMCArNDIxLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC00OTEsMTAgKzQ3OSw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtNTU1LDEwICs1NDEsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTYxOCwxMCArNjAyLDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygidXJuOmV4YW1wbGU6cG8iLCAiUGF5bWVudEluZm8iKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhub2RlTGlzdC5nZXRMZW5ndGgoKSwgMCk7CkBAIC02ODEsMTAgKzY2Myw4IEBACiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoInVybjpleGFtcGxlOnBvIiwgIlBheW1lbnRJbmZvIik7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobm9kZUxpc3QuZ2V0TGVuZ3RoKCksIDApOwpAQCAtNzQ0LDEwICs3MjQsOCBAQAogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vU3ltbWV0cmljRW5jcnlwdGlvblZlcmlmaWNhdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vU3ltbWV0cmljRW5jcnlwdGlvblZlcmlmaWNhdGlvblRlc3QuamF2YQppbmRleCA2NGIyYjYyLi5iNzkyMjU0IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9lbmNyeXB0aW9uL1N5bW1ldHJpY0VuY3J5cHRpb25WZXJpZmljYXRpb25UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvZW5jcnlwdGlvbi9TeW1tZXRyaWNFbmNyeXB0aW9uVmVyaWZpY2F0aW9uVGVzdC5qYXZhCkBAIC0xMzQsMTEgKzEzNCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xODcsMTEgKzE4NCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0yNDAsMTEgKzIzNCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0yOTMsMTEgKzI4NCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0zNDYsMTEgKzMzNCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0zOTksMTIgKzM4NCw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0RGVjcnlwdGlvbktleShrZXkpOwpAQCAtNDUxLDEyICs0MzMsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldERlY3J5cHRpb25LZXkoa2V5KTsKQEAgLTUwNywxMiArNDg2LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXREZWNyeXB0aW9uS2V5KGtleSk7CkBAIC01NjMsMTIgKzUzOSw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIERlY3J5cHQKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0RGVjcnlwdGlvbktleShrZXkpOwpAQCAtNjE5LDEyICs1OTIsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBEZWNyeXB0CiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldERlY3J5cHRpb25LZXkoa2V5KTsKQEAgLTY3NSwxMiArNjQ1LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gRGVjcnlwdAogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXREZWNyeXB0aW9uS2V5KGtleSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9lbmNyeXB0aW9uL1hNTEVuY3J5cHRpb24xMVRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vWE1MRW5jcnlwdGlvbjExVGVzdC5qYXZhCmluZGV4IDM5M2Y2MjguLjcwMTY4NWIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vWE1MRW5jcnlwdGlvbjExVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L2VuY3J5cHRpb24vWE1MRW5jcnlwdGlvbjExVGVzdC5qYXZhCkBAIC0zMCw3ICszMCw2IEBACiBpbXBvcnQgamF2YS5zZWN1cml0eS5TZWN1cml0eTsKIGltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuWDUwOUNlcnRpZmljYXRlOwogaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkJhc2U2NDsKIGltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwpAQCAtNjUsNiArNjQsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnRlc3Quc3RheC51dGlscy5TdEFYMkRPTTsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS50ZXN0LnN0YXgudXRpbHMuWE1MU2VjRXZlbnRBbGxvY2F0b3I7CiBpbXBvcnQgb3JnLmFwYWNoZS54bWwuc2VjdXJpdHkudGVzdC5zdGF4LnV0aWxzLlhtbFJlYWRlclRvV3JpdGVyOworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlY3VyaXR5LnV0aWxzLkJhc2U2NDsKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS51dGlscy5YTUxVdGlsczsKIGltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OwogaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CkBAIC0zNDUsNyArMzQ1LDcgQEAKICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhNTEyIiwKICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwOS94bWxlbmMxMSNtZ2Yxc2hhMSIsCiAgICAgICAgICAgICAgICAgc2Vzc2lvbktleSwgImh0dHA6Ly93d3cudzMub3JnLzIwMDkveG1sZW5jMTEjYWVzMjU2LWdjbSIsCi0gICAgICAgICAgICAgICAgQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKCJaSFZ0YlhreE1qTT0iLmdldEJ5dGVzKCJVVEYtOCIpKSk7CisgICAgICAgICAgICAgICAgQmFzZTY0LmRlY29kZSgiWkhWdGJYa3hNak09Ii5nZXRCeXRlcygiVVRGLTgiKSkpOwogICAgICAgICAvLyBYTUxVdGlscy5vdXRwdXRET00oZWQuZ2V0Rmlyc3RDaGlsZCgpLCBTeXN0ZW0ub3V0KTsKIAogICAgICAgICAvLyBQZXJmb3JtIGRlY3J5cHRpb24KQEAgLTM4NCw3ICszODQsNyBAQAogICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNzaGE1MTIiLAogICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LnczLm9yZy8yMDA5L3htbGVuYzExI21nZjFzaGE1MTIiLAogICAgICAgICAgICAgICAgIHNlc3Npb25LZXksICJodHRwOi8vd3d3LnczLm9yZy8yMDA5L3htbGVuYzExI2FlczI1Ni1nY20iLAotICAgICAgICAgICAgICAgIEJhc2U2NC5nZXRNaW1lRGVjb2RlcigpLmRlY29kZSgiWkhWdGJYa3hNak09Ii5nZXRCeXRlcygiVVRGLTgiKSkpOworICAgICAgICAgICAgICAgIEJhc2U2NC5kZWNvZGUoIlpIVnRiWGt4TWpNPSIuZ2V0Qnl0ZXMoIlVURi04IikpKTsKICAgICAgICAgLy8gWE1MVXRpbHMub3V0cHV0RE9NKGVkLmdldEZpcnN0Q2hpbGQoKSwgU3lzdGVtLm91dCk7CiAKICAgICAgICAgLy8gUGVyZm9ybSBkZWNyeXB0aW9uCkBAIC00MjQsNyArNDI0LDcgQEAKICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjc2hhNTEyIiwKICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvMjAwOS94bWxlbmMxMSNtZ2Yxc2hhNTEyIiwKICAgICAgICAgICAgICAgICBzZXNzaW9uS2V5LCAiaHR0cDovL3d3dy53My5vcmcvMjAwOS94bWxlbmMxMSNhZXMyNTYtZ2NtIiwKLSAgICAgICAgICAgICAgICBCYXNlNjQuZ2V0TWltZURlY29kZXIoKS5kZWNvZGUoIlpIVnRiWGt4TWpNPSIuZ2V0Qnl0ZXMoIlVURi04IikpKTsKKyAgICAgICAgICAgICAgICBCYXNlNjQuZGVjb2RlKCJaSFZ0YlhreE1qTT0iLmdldEJ5dGVzKCJVVEYtOCIpKSk7CiAgICAgICAgIC8vIFhNTFV0aWxzLm91dHB1dERPTShlZC5nZXRGaXJzdENoaWxkKCksIFN5c3RlbS5vdXQpOwogCiAgICAgICAgIE5vZGVMaXN0IG5sID0gZWQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjIiwgIkNpcGhlclZhbHVlIik7CkBAIC01NTYsMTAgKzU1Niw4IEBACiAgICAgICAgIFhtbFJlYWRlclRvV3JpdGVyLndyaXRlQWxsKHhtbFN0cmVhbVJlYWRlciwgeG1sU3RyZWFtV3JpdGVyKTsKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKCJ1cm46ZXhhbXBsZTpwbyIsICJQYXltZW50SW5mbyIpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5vZGVMaXN0LmdldExlbmd0aCgpLCAwKTsKQEAgLTU4Miw4ICs1ODAsNyBAQAogICAgICAgICBpZiAob2FlcFBhcmFtcyAhPSBudWxsKSB7CiAgICAgICAgICAgICBOb2RlTGlzdCBvYWVwUGFyYW1zRWxlbWVudHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTFNlY3VyaXR5Q29uc3RhbnRzLk5TX1hNTEVOQywgIk9BRVBwYXJhbXMiKTsKICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgb2FlcFBhcmFtc0VsZW1lbnRzLmdldExlbmd0aCgpKTsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50ID0gWE1MVXRpbHMuZ2V0RnVsbFRleHRDaGlsZHJlbkZyb21FbGVtZW50KChFbGVtZW50KSBvYWVwUGFyYW1zRWxlbWVudHMuaXRlbSgwKSk7Ci0gICAgICAgICAgICBBc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHMob2FlcFBhcmFtcywgQmFzZTY0LmdldE1pbWVEZWNvZGVyKCkuZGVjb2RlKGNvbnRlbnQpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRBcnJheUVxdWFscyhvYWVwUGFyYW1zLCBCYXNlNjQuZGVjb2RlKChFbGVtZW50KSBvYWVwUGFyYW1zRWxlbWVudHMuaXRlbSgwKSkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBkb2N1bWVudDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvQmFsdGltb3JlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL0JhbHRpbW9yZVRlc3QuamF2YQppbmRleCBjYmI2MDM0Li5kYjA1ODFhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvQmFsdGltb3JlVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9CYWx0aW1vcmVUZXN0LmphdmEKQEAgLTEzNywxMSArMTM3LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE3NywxMSArMTc0LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTIxNCwxMSArMjA4LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTI0OSwxMSArMjQwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTI4NCwxMSArMjcyLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTMxOSwxMSArMzA0LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTM2OSwxMSArMzUxLDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTQyNSwxMSArNDA0LDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTQ2OSwxMSArNDQ1LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTUwOSwxMSArNDgyLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTU0OSwxMSArNTE5LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTU4OCwxMSArNTU1LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTYyNCwxMSArNTg4LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTY1OSwxMSArNjIwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTcxMCwxMSArNjY4LDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTc2NiwxMSArNzIxLDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTgyNywxMSArNzc5LDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTg4OCwxMSArODM3LDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTkzNSwxMSArODgxLDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTk4MSwxMSArOTI0LDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTEwMzUsMTEgKzk3NSw4IEBACiAgICAgICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xMDk2LDExICsxMDMzLDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTExNTEsMTEgKzEwODUsOCBAQAogICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTE5MSwxMSArMTEyMiw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xMjQwLDExICsxMTY4LDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTEzMDEsMTEgKzEyMjYsOCBAQAogICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTM0OCwxMSArMTI3MCw4IEBACiAgICAgICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xMzk0LDEyICsxMzEzLDkgQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgIEluYm91bmRYTUxTZWMgaW5ib3VuZFhNTFNlYyA9IFhNTFNlYy5nZXRJbmJvdW5kV1NTZWMocHJvcGVydGllcyk7CkBAIC0xNDQ4LDExICsxMzY0LDggQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE1MDksMTEgKzE0MjIsOCBAQAogICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTU2NCwxMSArMTQ3NCw4IEBACiAgICAgICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvSUFJS1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9JQUlLVGVzdC5qYXZhCmluZGV4IDU3ODRhZTguLmQzMDk3OTUgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9JQUlLVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9JQUlLVGVzdC5qYXZhCkBAIC0xMjAsMTEgKzEyMCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xOTIsMTEgKzE4OSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0yMjcsMTEgKzIyMSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0zMzMsMTEgKzMyNCw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvUEtTaWduYXR1cmVDcmVhdGlvblRlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9QS1NpZ25hdHVyZUNyZWF0aW9uVGVzdC5qYXZhCmluZGV4IGE2MDYwNzEuLmRiNTc0OTEgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9QS1NpZ25hdHVyZUNyZWF0aW9uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9QS1NpZ25hdHVyZUNyZWF0aW9uVGVzdC5qYXZhCkBAIC0xMTgsMTAgKzExOCw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgdXNpbmcgRE9NCiAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCByc2FLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMTYxLDEwICsxNTksOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgcnNhS2V5UGFpci5nZXRQdWJsaWMoKSwgcHJvcGVydGllcy5nZXRTaWduYXR1cmVTZWN1cmVQYXJ0cygpKTsKQEAgLTIwNCwxMCArMjAwLDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIHJzYUtleVBhaXIuZ2V0UHVibGljKCksIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC0yNDcsMTAgKzI0MSw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgdXNpbmcgRE9NCiAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCByc2FLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMjkzLDEwICsyODUsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgcnNhS2V5UGFpci5nZXRQdWJsaWMoKSwgcHJvcGVydGllcy5nZXRTaWduYXR1cmVTZWN1cmVQYXJ0cygpKTsKQEAgLTMzOSwxMCArMzI5LDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIHJzYUtleVBhaXIuZ2V0UHVibGljKCksIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC0zODUsMTAgKzM3Myw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgdXNpbmcgRE9NCiAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCByc2FLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtNDMxLDEwICs0MTcsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgcnNhS2V5UGFpci5nZXRQdWJsaWMoKSwgcHJvcGVydGllcy5nZXRTaWduYXR1cmVTZWN1cmVQYXJ0cygpKTsKQEAgLTQ3NywxMCArNDYxLDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIHJzYUtleVBhaXIuZ2V0UHVibGljKCksIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC01MjMsMTAgKzUwNSw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgdXNpbmcgRE9NCiAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCByc2FLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtNTY2LDEwICs1NDYsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgZWNLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtNjA5LDEwICs1ODcsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgZWNLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtNjUyLDEwICs2MjgsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgZWNLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtNjk1LDEwICs2NjksOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgZWNLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtNzM4LDEwICs3MTAsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgZWNLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtNzg0LDEwICs3NTQsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgZWNLZXlQYWlyLmdldFB1YmxpYygpLCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1BLU2lnbmF0dXJlVmVyaWZpY2F0aW9uVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1BLU2lnbmF0dXJlVmVyaWZpY2F0aW9uVGVzdC5qYXZhCmluZGV4IDhiMmM3NWIuLmU3ODc4ZGIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9QS1NpZ25hdHVyZVZlcmlmaWNhdGlvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvUEtTaWduYXR1cmVWZXJpZmljYXRpb25UZXN0LmphdmEKQEAgLTEyMSwxMSArMTIxLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE2MiwxMSArMTU5LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTIwMywxMSArMTk3LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTI0NCwxMiArMjM1LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkocnNhS2V5UGFpci5nZXRQdWJsaWMoKSk7CkBAIC0yODgsMTIgKzI3Niw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0U2lnbmF0dXJlVmVyaWZpY2F0aW9uS2V5KHJzYUtleVBhaXIuZ2V0UHVibGljKCkpOwpAQCAtMzMyLDEyICszMTcsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CisKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkocnNhS2V5UGFpci5nZXRQdWJsaWMoKSk7CkBAIC0zNzYsMTIgKzM1OCw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKKwogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldFNpZ25hdHVyZVZlcmlmaWNhdGlvbktleShyc2FLZXlQYWlyLmdldFB1YmxpYygpKTsKQEAgLTQyMCwxMiArMzk5LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkocnNhS2V5UGFpci5nZXRQdWJsaWMoKSk7CkBAIC00NjQsMTIgKzQ0MCw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0U2lnbmF0dXJlVmVyaWZpY2F0aW9uS2V5KHJzYUtleVBhaXIuZ2V0UHVibGljKCkpOwpAQCAtNTA4LDEyICs0ODEsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldFNpZ25hdHVyZVZlcmlmaWNhdGlvbktleShyc2FLZXlQYWlyLmdldFB1YmxpYygpKTsKQEAgLTU0OSwxMiArNTE5LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoZWNLZXlQYWlyLmdldFB1YmxpYygpKTsKQEAgLTU5MCwxMiArNTU3LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoZWNLZXlQYWlyLmdldFB1YmxpYygpKTsKQEAgLTYzMSwxMiArNTk1LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoZWNLZXlQYWlyLmdldFB1YmxpYygpKTsKQEAgLTY3MiwxMiArNjMzLDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoZWNLZXlQYWlyLmdldFB1YmxpYygpKTsKQEAgLTcxMywxMiArNjcxLDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoZWNLZXlQYWlyLmdldFB1YmxpYygpKTsKQEAgLTc1NywxMiArNzEyLDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoZWNLZXlQYWlyLmdldFB1YmxpYygpKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9QaGFvc1Rlc3QuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9QaGFvc1Rlc3QuamF2YQppbmRleCBlYjQyNDRhLi40ZWJmZWJiIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvUGhhb3NUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1BoYW9zVGVzdC5qYXZhCkBAIC05OSwxMSArOTksOCBAQAogICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTM1LDEyICsxMzIsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtMTY2LDEyICsxNjAsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtMjE0LDEyICsyMDUsOSBAQAogICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoa2V5KTsKQEAgLTI1NSwxMiArMjQzLDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoa2V5KTsKQEAgLTI5MSwxMiArMjc2LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoa2V5KTsKQEAgLTM0MSwxMiArMzIzLDkgQEAKICAgICAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCiAgICAgICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgICAgIEluYm91bmRYTUxTZWMgaW5ib3VuZFhNTFNlYyA9IFhNTFNlYy5nZXRJbmJvdW5kV1NTZWMocHJvcGVydGllcyk7CkBAIC0zNzcsMTIgKzM1Niw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIEluYm91bmRYTUxTZWMgaW5ib3VuZFhNTFNlYyA9IFhNTFNlYy5nZXRJbmJvdW5kV1NTZWMocHJvcGVydGllcyk7CkBAIC00MTMsMTIgKzM4OSw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIEluYm91bmRYTUxTZWMgaW5ib3VuZFhNTFNlYyA9IFhNTFNlYy5nZXRJbmJvdW5kV1NTZWMocHJvcGVydGllcyk7CkBAIC00NDQsMTIgKzQxNyw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIEluYm91bmRYTUxTZWMgaW5ib3VuZFhNTFNlYyA9IFhNTFNlYy5nZXRJbmJvdW5kV1NTZWMocHJvcGVydGllcyk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvUlNBU2VjdXJpdHlUZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvUlNBU2VjdXJpdHlUZXN0LmphdmEKaW5kZXggODJhZTJlMy4uZWYzN2IxNCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1JTQVNlY3VyaXR5VGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9SU0FTZWN1cml0eVRlc3QuamF2YQpAQCAtNzYsMTIgKzc2LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgSW5ib3VuZFhNTFNlYyBpbmJvdW5kWE1MU2VjID0gWE1MU2VjLmdldEluYm91bmRXU1NlYyhwcm9wZXJ0aWVzKTsKQEAgLTExMiwxMiArMTA5LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgSW5ib3VuZFhNTFNlYyBpbmJvdW5kWE1MU2VjID0gWE1MU2VjLmdldEluYm91bmRXU1NlYyhwcm9wZXJ0aWVzKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVDcmVhdGlvblJlZmVyZW5jZVVSSVJlc29sdmVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZUNyZWF0aW9uUmVmZXJlbmNlVVJJUmVzb2x2ZXJUZXN0LmphdmEKaW5kZXggZGExZjE2YS4uNzg3MTFjNyAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZUNyZWF0aW9uUmVmZXJlbmNlVVJJUmVzb2x2ZXJUZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZUNyZWF0aW9uUmVmZXJlbmNlVVJJUmVzb2x2ZXJUZXN0LmphdmEKQEAgLTk4LDEwICs5OCw4IEBACiAgICAgICAgIFhtbFJlYWRlclRvV3JpdGVyLndyaXRlQWxsKHhtbFN0cmVhbVJlYWRlciwgeG1sU3RyZWFtV3JpdGVyKTsKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC0xNDksMTAgKzE0Nyw4IEBACiAgICAgICAgIFhtbFJlYWRlclRvV3JpdGVyLndyaXRlQWxsKHhtbFN0cmVhbVJlYWRlciwgeG1sU3RyZWFtV3JpdGVyKTsKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC0yMDYsMTAgKzIwMiw4IEBACiAgICAgICAgICAgICBYbWxSZWFkZXJUb1dyaXRlci53cml0ZUFsbCh4bWxTdHJlYW1SZWFkZXIsIHhtbFN0cmVhbVdyaXRlcik7CiAgICAgICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAotICAgICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCBjZXJ0LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCksIHJlc29sdmVyRGlyZWN0SFRUUCk7CkBAIC0yNTMsMTAgKzI0Nyw4IEBACiAgICAgICAgIFhtbFJlYWRlclRvV3JpdGVyLndyaXRlQWxsKHhtbFN0cmVhbVJlYWRlciwgeG1sU3RyZWFtV3JpdGVyKTsKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC8wOS94bWxkc2lnIyIsICJSZWZlcmVuY2UiKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBub2RlTGlzdC5nZXRMZW5ndGgoKSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlQ3JlYXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlQ3JlYXRpb25UZXN0LmphdmEKaW5kZXggMTZmMWJjYy4uMWMxZDFhOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZUNyZWF0aW9uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVDcmVhdGlvblRlc3QuamF2YQpAQCAtOTMsMTAgKzkzLDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy9maXJzdCBjaGlsZCBlbGVtZW50IG11c3QgYmUgdGhlIGRzaWc6U2lnbmF0dXJlIEBzZWUgU0FOVFVBUklPLTMyNDoKICAgICAgICAgTm9kZSBjaGlsZE5vZGUgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKS5nZXRGaXJzdENoaWxkKCk7CkBAIC0xOTksMTAgKzE5Nyw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvL2ZpcnN0IGNoaWxkIGVsZW1lbnQgbXVzdCBiZSB0aGUgZHNpZzpTaWduYXR1cmUgQHNlZSBTQU5UVUFSSU8tMzI0OgogICAgICAgICBOb2RlIGNoaWxkTm9kZSA9IGRvY3VtZW50LmdldERvY3VtZW50RWxlbWVudCgpLmdldEZpcnN0Q2hpbGQoKTsKQEAgLTI2MywxMCArMjU5LDggQEAKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwogCi0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vZmlyc3QgY2hpbGQgZWxlbWVudCBtdXN0IGJlIHRoZSBkc2lnOlNpZ25hdHVyZSBAc2VlIFNBTlRVQVJJTy0zMjQ6CiAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpOwpAQCAtMzM4LDEwICszMzIsOCBAQAogCiAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKIAotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudAorICAgICAgICAgICAgICAgID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy9maW5kIGZpcnN0IGNoaWxkIGVsZW1lbnQ6CiAgICAgICAgIE5vZGUgY2hpbGROb2RlID0gWE1MVXRpbHMuZ2V0TmV4dEVsZW1lbnQoZG9jdW1lbnQuZ2V0RG9jdW1lbnRFbGVtZW50KCkuZ2V0Rmlyc3RDaGlsZCgpKTsKQEAgLTQxMSwxMCArNDAzLDggQEAKIAogICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7CiAKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQKKyAgICAgICAgICAgICAgICA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSxudWxsLHRydWUsIklEIik7CkBAIC00NjAsMTAgKzQ1MCw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC01MTYsMTAgKzUwNCw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgWFBhdGhGYWN0b3J5IHhwZiA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwpAQCAtNTgwLDEwICs1NjYsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgdXNpbmcgRE9NCiAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCBrZXksIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC02MjgsMTAgKzYxMiw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC02ODgsMTAgKzY3MCw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC03NDksMTAgKzcyOSw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC03OTYsMTAgKzc3NCw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC04NDQsMTAgKzgyMCw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5nZXROYW1lc3BhY2VVUkkoKSwgWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfQ2Fub25pY2FsaXphdGlvbk1ldGhvZC5nZXRMb2NhbFBhcnQoKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpOwpAQCAtOTEyLDEwICs4ODYsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0Nhbm9uaWNhbGl6YXRpb25NZXRob2QuZ2V0TmFtZXNwYWNlVVJJKCksIFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0Nhbm9uaWNhbGl6YXRpb25NZXRob2QuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5vZGVMaXN0LmdldExlbmd0aCgpKTsKQEAgLTk3OSwxMSArOTUxLDkgQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOworCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CiAgICAgfQpAQCAtMTAyNywxMCArOTk3LDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTZWN1cml0eUNvbnN0YW50cy5UQUdfYzE0bkV4Y2xfSW5jbHVzaXZlTmFtZXNwYWNlcy5nZXROYW1lc3BhY2VVUkkoKSwgWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2MxNG5FeGNsX0luY2x1c2l2ZU5hbWVzcGFjZXMuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG5vZGVMaXN0LmdldExlbmd0aCgpKTsKQEAgLTEwNzgsMTAgKzEwNDYsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgdXNpbmcgRE9NCiAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCBjZXJ0LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMTEzMywxMCArMTA5OSw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSk7CkBAIC0xMTc5LDEwICsxMTQzLDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgY2VydCwgcHJvcGVydGllcy5nZXRTaWduYXR1cmVTZWN1cmVQYXJ0cygpKTsKQEAgLTEyMjUsMTAgKzExODcsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgdXNpbmcgRE9NCiAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCBjZXJ0LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMTI3MywxMCArMTIzMyw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgdXNpbmcgRE9NCiAgICAgICAgIHZlcmlmeVVzaW5nRE9NKGRvY3VtZW50LCBjZXJ0LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMTMyMSwxMCArMTI3OSw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSB1c2luZyBET00KICAgICAgICAgdmVyaWZ5VXNpbmdET00oZG9jdW1lbnQsIGNlcnQsIHByb3BlcnRpZXMuZ2V0U2lnbmF0dXJlU2VjdXJlUGFydHMoKSwgbnVsbCwgZmFsc2UsICJJZCIpOwpAQCAtMTM2OSwxMCArMTMyNSw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfS2V5TmFtZS5nZXROYW1lc3BhY2VVUkkoKSwgWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfS2V5TmFtZS5nZXRMb2NhbFBhcnQoKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBub2RlTGlzdC5nZXRMZW5ndGgoKSk7CmRpZmYgLS1naXQgYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlRGlnZXN0Q3JlYXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlRGlnZXN0Q3JlYXRpb25UZXN0LmphdmEKaW5kZXggNDkxYmMzYi4uZmNlMGExNSAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZURpZ2VzdENyZWF0aW9uVGVzdC5qYXZhCisrKyBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVEaWdlc3RDcmVhdGlvblRlc3QuamF2YQpAQCAtMTIxLDEwICsxMjEsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0RpZ2VzdE1ldGhvZC5nZXROYW1lc3BhY2VVUkkoKSwgWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfRGlnZXN0TWV0aG9kLmdldExvY2FsUGFydCgpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBub2RlTGlzdC5nZXRMZW5ndGgoKSk7CkBAIC0xNzYsMTAgKzE3NCw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfRGlnZXN0TWV0aG9kLmdldE5hbWVzcGFjZVVSSSgpLCBYTUxTZWN1cml0eUNvbnN0YW50cy5UQUdfZHNpZ19EaWdlc3RNZXRob2QuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5vZGVMaXN0LmdldExlbmd0aCgpKTsKQEAgLTIzMSwxMCArMjI3LDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTZWN1cml0eUNvbnN0YW50cy5UQUdfZHNpZ19EaWdlc3RNZXRob2QuZ2V0TmFtZXNwYWNlVVJJKCksIFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0RpZ2VzdE1ldGhvZC5nZXRMb2NhbFBhcnQoKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpOwpAQCAtMjg2LDEwICsyODAsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0RpZ2VzdE1ldGhvZC5nZXROYW1lc3BhY2VVUkkoKSwgWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfRGlnZXN0TWV0aG9kLmdldExvY2FsUGFydCgpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBub2RlTGlzdC5nZXRMZW5ndGgoKSk7CkBAIC0zNDEsMTAgKzMzMyw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfRGlnZXN0TWV0aG9kLmdldE5hbWVzcGFjZVVSSSgpLCBYTUxTZWN1cml0eUNvbnN0YW50cy5UQUdfZHNpZ19EaWdlc3RNZXRob2QuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5vZGVMaXN0LmdldExlbmd0aCgpKTsKQEAgLTM5OSwxMCArMzg5LDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTZWN1cml0eUNvbnN0YW50cy5UQUdfZHNpZ19EaWdlc3RNZXRob2QuZ2V0TmFtZXNwYWNlVVJJKCksIFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0RpZ2VzdE1ldGhvZC5nZXRMb2NhbFBhcnQoKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpOwpAQCAtNDU3LDEwICs0NDUsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0RpZ2VzdE1ldGhvZC5nZXROYW1lc3BhY2VVUkkoKSwgWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfRGlnZXN0TWV0aG9kLmdldExvY2FsUGFydCgpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBub2RlTGlzdC5nZXRMZW5ndGgoKSk7CkBAIC01MTUsMTAgKzUwMSw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfRGlnZXN0TWV0aG9kLmdldE5hbWVzcGFjZVVSSSgpLCBYTUxTZWN1cml0eUNvbnN0YW50cy5UQUdfZHNpZ19EaWdlc3RNZXRob2QuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5vZGVMaXN0LmdldExlbmd0aCgpKTsKQEAgLTU3MywxMCArNTU3LDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWVOUyhYTUxTZWN1cml0eUNvbnN0YW50cy5UQUdfZHNpZ19EaWdlc3RNZXRob2QuZ2V0TmFtZXNwYWNlVVJJKCksIFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0RpZ2VzdE1ldGhvZC5nZXRMb2NhbFBhcnQoKSk7CiAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkpOwpAQCAtNjMxLDEwICs2MTMsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgTm9kZUxpc3Qgbm9kZUxpc3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZU5TKFhNTFNlY3VyaXR5Q29uc3RhbnRzLlRBR19kc2lnX0RpZ2VzdE1ldGhvZC5nZXROYW1lc3BhY2VVUkkoKSwgWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfRGlnZXN0TWV0aG9kLmdldExvY2FsUGFydCgpKTsKICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBub2RlTGlzdC5nZXRMZW5ndGgoKSk7CkBAIC02ODksMTAgKzY2OSw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICBOb2RlTGlzdCBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lTlMoWE1MU2VjdXJpdHlDb25zdGFudHMuVEFHX2RzaWdfRGlnZXN0TWV0aG9kLmdldE5hbWVzcGFjZVVSSSgpLCBYTUxTZWN1cml0eUNvbnN0YW50cy5UQUdfZHNpZ19EaWdlc3RNZXRob2QuZ2V0TG9jYWxQYXJ0KCkpOwogICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIG5vZGVMaXN0LmdldExlbmd0aCgpKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVEaWdlc3RWZXJpZmljYXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlRGlnZXN0VmVyaWZpY2F0aW9uVGVzdC5qYXZhCmluZGV4IDYyM2IyYzQuLmQxNjQ3MjcgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVEaWdlc3RWZXJpZmljYXRpb25UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZURpZ2VzdFZlcmlmaWNhdGlvblRlc3QuamF2YQpAQCAtMTI4LDEyICsxMjgsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtMTgwLDEyICsxNzcsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtMjMyLDEyICsyMjYsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtMjg0LDEyICsyNzUsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtMzM2LDEyICszMjQsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtMzkxLDEyICszNzYsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtNDQ2LDEyICs0MjgsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtNTAxLDEyICs0ODAsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtNTU2LDEyICs1MzIsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtNjExLDEyICs1ODQsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpAQCAtNjY2LDEyICs2MzYsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBJbmJvdW5kWE1MU2VjIGluYm91bmRYTUxTZWMgPSBYTUxTZWMuZ2V0SW5ib3VuZFdTU2VjKHByb3BlcnRpZXMpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZUVuY3J5cHRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlRW5jcnlwdGlvblRlc3QuamF2YQppbmRleCAxYzU2ZmM4Li5jMzI0ZDg5IDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlRW5jcnlwdGlvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlRW5jcnlwdGlvblRlc3QuamF2YQpAQCAtOTgsMTAgKzk4LDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQgdXNpbmcgRE9NIEFQSQogICAgICAgICBEb2N1bWVudCBkb2MgPQpAQCAtMTY3LDEwICsxNjUsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gRGVjcnlwdCB1c2luZyBET00gQVBJCiAgICAgICAgIERvY3VtZW50IGRvYyA9CkBAIC0yNDQsMTAgKzI0MCw4IEBACiAgICAgICAgIHhtbFN0cmVhbVdyaXRlci5jbG9zZSgpOwogCiAgICAgICAgIC8vIFN5c3RlbS5vdXQucHJpbnRsbigiR290OlxuIiArIG5ldyBTdHJpbmcoYmFvcy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKSk7Ci0gICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgICBkb2N1bWVudCA9IFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UoaXMpOwotICAgICAgICB9CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0KKyAgICAgICAgICAgICAgICBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBEZWNyeXB0IHVzaW5nIERPTSBBUEkKICAgICAgICAgRG9jdW1lbnQgZG9jID0KQEAgLTMyMSwxMCArMzE1LDggQEAKICAgICAgICAgeG1sU3RyZWFtV3JpdGVyLmNsb3NlKCk7CiAKICAgICAgICAgLy8gU3lzdGVtLm91dC5wcmludGxuKCJHb3Q6XG4iICsgbmV3IFN0cmluZyhiYW9zLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpKTsKLSAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgIGRvY3VtZW50ID0gWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPQorICAgICAgICAgICAgICAgIFhNTFV0aWxzLmNyZWF0ZURvY3VtZW50QnVpbGRlcihmYWxzZSkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIERlY3J5cHQgdXNpbmcgRE9NIEFQSQogICAgICAgICBEb2N1bWVudCBkb2MgPQpAQCAtMzk4LDEwICszOTAsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwgY2VydCwgcHJvcGVydGllcy5nZXRTaWduYXR1cmVTZWN1cmVQYXJ0cygpKTsKQEAgLTQ4Miw5ICs0NzIsNyBAQAogCiAgICAgcHJpdmF0ZSBUZXN0U2VjdXJpdHlFdmVudExpc3RlbmVyIHZlcmlmeVVzaW5nU3RBWCgKICAgICAgICAgICAgIGJ5dGVbXSBkb2MsIEtleSBkZWNyeXB0aW9uS2V5LCBQdWJsaWNLZXkgc2lnbmF0dXJlVmVyaWZpY2F0aW9uS2V5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkb2MpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmVyaWZ5VXNpbmdTdEFYKGlzLCBkZWNyeXB0aW9uS2V5LCBzaWduYXR1cmVWZXJpZmljYXRpb25LZXkpOwotICAgICAgICB9CisgICAgICAgIHJldHVybiB2ZXJpZnlVc2luZ1N0QVgobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRvYyksIGRlY3J5cHRpb25LZXksIHNpZ25hdHVyZVZlcmlmaWNhdGlvbktleSk7CiAgICAgfQogCiAgICAgcHJpdmF0ZSBUZXN0U2VjdXJpdHlFdmVudExpc3RlbmVyIHZlcmlmeVVzaW5nU3RBWCgKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVITUFDQ3JlYXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlSE1BQ0NyZWF0aW9uVGVzdC5qYXZhCmluZGV4IDg0NGYzMjAuLmEzNTJmMTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVITUFDQ3JlYXRpb25UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZUhNQUNDcmVhdGlvblRlc3QuamF2YQpAQCAtMTEyLDEwICsxMTIsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwga2V5LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMTU3LDEwICsxNTUsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwga2V5LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMjAyLDEwICsxOTgsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwga2V5LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMjQ3LDEwICsyNDEsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwga2V5LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMjkyLDEwICsyODQsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwga2V5LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpAQCAtMzQwLDEwICszMzAsOCBAQAogICAgICAgICB4bWxTdHJlYW1Xcml0ZXIuY2xvc2UoKTsKIAogICAgICAgICAvLyBTeXN0ZW0ub3V0LnByaW50bG4oIkdvdDpcbiIgKyBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSwgIlVURi04IikpOwotICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgZG9jdW1lbnQgPSBYTUxVdGlscy5jcmVhdGVEb2N1bWVudEJ1aWxkZXIoZmFsc2UpLnBhcnNlKGlzKTsKLSAgICAgICAgfQorICAgICAgICBEb2N1bWVudCBkb2N1bWVudCA9CisgICAgICAgICAgICAgICAgWE1MVXRpbHMuY3JlYXRlRG9jdW1lbnRCdWlsZGVyKGZhbHNlKS5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHVzaW5nIERPTQogICAgICAgICB2ZXJpZnlVc2luZ0RPTShkb2N1bWVudCwga2V5LCBwcm9wZXJ0aWVzLmdldFNpZ25hdHVyZVNlY3VyZVBhcnRzKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZUhNQUNWZXJpZmljYXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlSE1BQ1ZlcmlmaWNhdGlvblRlc3QuamF2YQppbmRleCAzNDk3MDk1Li5mOWI3YzZhIDEwMDY0NAotLS0gYS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlSE1BQ1ZlcmlmaWNhdGlvblRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlSE1BQ1ZlcmlmaWNhdGlvblRlc3QuamF2YQpAQCAtMTE5LDExICsxMTksOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xNjUsMTEgKzE2Miw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0yMTEsMTEgKzIwNSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0yNTcsMTIgKzI0OCw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKKwogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldFNpZ25hdHVyZVZlcmlmaWNhdGlvbktleShrZXkpOwpAQCAtMzAzLDExICsyOTEsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMzUyLDExICszMzcsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZVZlcmlmaWNhdGlvblJlZmVyZW5jZVVSSVJlc29sdmVyVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZVZlcmlmaWNhdGlvblJlZmVyZW5jZVVSSVJlc29sdmVyVGVzdC5qYXZhCmluZGV4IDk5NzEyMDIuLjk5MmNlOTIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVWZXJpZmljYXRpb25SZWZlcmVuY2VVUklSZXNvbHZlclRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlVmVyaWZpY2F0aW9uUmVmZXJlbmNlVVJJUmVzb2x2ZXJUZXN0LmphdmEKQEAgLTExMCwxMiArMTEwLDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoY2VydC5nZXRQdWJsaWNLZXkoKSk7CkBAIC0xODAsMTIgKzE3Nyw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0U2lnbmF0dXJlVmVyaWZpY2F0aW9uS2V5KGNlcnQuZ2V0UHVibGljS2V5KCkpOwpAQCAtMjYwLDEyICsyNTQsOSBAQAogICAgICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAKICAgICAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoY2VydC5nZXRQdWJsaWNLZXkoKSk7CkBAIC0zMzgsMTIgKzMyOSw5IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0U2lnbmF0dXJlVmVyaWZpY2F0aW9uS2V5KGNlcnQuZ2V0UHVibGljS2V5KCkpOwpAQCAtNDEyLDEyICs0MDAsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOworICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9Ci0gICAgICAgIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwogICAgICAgICBwcm9wZXJ0aWVzLnNldFNpZ25hdHVyZVZlcmlmaWNhdGlvbktleShjZXJ0LmdldFB1YmxpY0tleSgpKTsKQEAgLTQ3OSwxMCArNDY0LDggQEAKIAogICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbihiYW9zLnRvU3RyaW5nKCkpOwogCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKZGlmZiAtLWdpdCBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVWZXJpZmljYXRpb25UZXN0LmphdmEgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvU2lnbmF0dXJlVmVyaWZpY2F0aW9uVGVzdC5qYXZhCmluZGV4IGY5YmNlODkuLmRhYzRiMGIgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9TaWduYXR1cmVWZXJpZmljYXRpb25UZXN0LmphdmEKKysrIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1NpZ25hdHVyZVZlcmlmaWNhdGlvblRlc3QuamF2YQpAQCAtMTE4LDExICsxMTgsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTk4LDExICsxOTUsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMjkyLDEyICsyODYsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CisKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgSW5ib3VuZFhNTFNlYyBpbmJvdW5kWE1MU2VjID0gWE1MU2VjLmdldEluYm91bmRXU1NlYyhwcm9wZXJ0aWVzKTsKQEAgLTM1OSwxMSArMzUwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTQwNywxMSArMzk1LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTQ4NywxMSArNDcyLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTU1OCwxMSArNTQwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTY0MSwxMSArNjIwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTcyNCwxMSArNzAwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTgwNywxMSArNzgwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTg5NCwxMSArODY0LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTk3NywxMSArOTQ0LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTEwNjgsMTIgKzEwMzIsOSBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQotICAgICAgICAKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CisKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKICAgICAgICAgcHJvcGVydGllcy5zZXRTaWduYXR1cmVWZXJpZmljYXRpb25LZXkoY2VydC5nZXRQdWJsaWNLZXkoKSk7CkBAIC0xMTQ4LDExICsxMTA5LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTEyMjksMTEgKzExODcsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTMwMiwxMSArMTI1Nyw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xMzYyLDExICsxMzE0LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE0MjIsMTEgKzEzNzEsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTQ4NSwxMSArMTQzMSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xNTQ1LDEyICsxNDg4LDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOworCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIEluYm91bmRYTUxTZWMgaW5ib3VuZFhNTFNlYyA9IFhNTFNlYy5nZXRJbmJvdW5kV1NTZWMocHJvcGVydGllcyk7CkBAIC0xNjIwLDExICsxNTYwLDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE2NzIsMTEgKzE2MDksOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpAQCAtMTczNywxMSArMTY3MSw4IEBACiAgICAgICAgIGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lckZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CiAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKGRvY3VtZW50KSwgbmV3IFN0cmVhbVJlc3VsdChiYW9zKSk7Ci0gICAgICAgIAotICAgICAgICBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKSB7Ci0gICAgICAgICAgIHhtbFN0cmVhbVJlYWRlciA9IHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIoaXMpOwotICAgICAgICB9CisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOwogCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CkBAIC0xODA4LDExICsxNzM5LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE4ODYsMTEgKzE4MTQsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1Vua25vd25BbGdvU2lnbmF0dXJlVGVzdC5qYXZhIGIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvc2lnbmF0dXJlL1Vua25vd25BbGdvU2lnbmF0dXJlVGVzdC5qYXZhCmluZGV4IGM4Njk4YTQuLmRkMmE2NDAgMTAwNjQ0Ci0tLSBhL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3NpZ25hdHVyZS9Vbmtub3duQWxnb1NpZ25hdHVyZVRlc3QuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC9zaWduYXR1cmUvVW5rbm93bkFsZ29TaWduYXR1cmVUZXN0LmphdmEKQEAgLTEyOCwxMSArMTI4LDggQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KKyAgICAgICAgZmluYWwgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9CisgICAgICAgICAgICAgICAgeG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSk7CiAKICAgICAgICAgLy8gVmVyaWZ5IHNpZ25hdHVyZQogICAgICAgICBYTUxTZWN1cml0eVByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBYTUxTZWN1cml0eVByb3BlcnRpZXMoKTsKQEAgLTE3NCwxMiArMTcxLDkgQEAKICAgICAgICAgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zZm9ybWVyRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwogICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKICAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KGJhb3MpKTsKLSAgICAgICAgCi0gICAgICAgIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPSBudWxsOwotICAgICAgICB0cnkgKElucHV0U3RyZWFtIGlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpIHsKLSAgICAgICAgICAgeG1sU3RyZWFtUmVhZGVyID0geG1sSW5wdXRGYWN0b3J5LmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgCisgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIgPQorICAgICAgICAgICAgICAgIHhtbElucHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1SZWFkZXIobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSkpOworCiAgICAgICAgIC8vIFZlcmlmeSBzaWduYXR1cmUKICAgICAgICAgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBuZXcgWE1MU2VjdXJpdHlQcm9wZXJ0aWVzKCk7CiAgICAgICAgIHByb3BlcnRpZXMuc2V0U2lnbmF0dXJlVmVyaWZpY2F0aW9uS2V5KGNlcnQuZ2V0UHVibGljS2V5KCkpOwpAQCAtMjIxLDExICsyMTUsOCBAQAogICAgICAgICBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXJGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CiAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwogICAgICAgICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IERPTVNvdXJjZShkb2N1bWVudCksIG5ldyBTdHJlYW1SZXN1bHQoYmFvcykpOwotICAgICAgICAKLSAgICAgICAgWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeSAoSW5wdXRTdHJlYW0gaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSkgewotICAgICAgICAgICB4bWxTdHJlYW1SZWFkZXIgPSB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKGlzKTsKLSAgICAgICAgfQorICAgICAgICBmaW5hbCBYTUxTdHJlYW1SZWFkZXIgeG1sU3RyZWFtUmVhZGVyID0KKyAgICAgICAgICAgICAgICB4bWxJbnB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtUmVhZGVyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpKTsKIAogICAgICAgICAvLyBWZXJpZnkgc2lnbmF0dXJlCiAgICAgICAgIFhNTFNlY3VyaXR5UHJvcGVydGllcyBwcm9wZXJ0aWVzID0gbmV3IFhNTFNlY3VyaXR5UHJvcGVydGllcygpOwpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvdXRpbHMvSHR0cFJlcXVlc3RSZWRpcmVjdG9yUHJveHkuamF2YSBiL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS94bWwvc2VjdXJpdHkvdGVzdC9zdGF4L3V0aWxzL0h0dHBSZXF1ZXN0UmVkaXJlY3RvclByb3h5LmphdmEKaW5kZXggOWVmMzkxYy4uM2IxODNiOCAxMDA2NDQKLS0tIGEvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL3htbC9zZWN1cml0eS90ZXN0L3N0YXgvdXRpbHMvSHR0cFJlcXVlc3RSZWRpcmVjdG9yUHJveHkuamF2YQorKysgYi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUveG1sL3NlY3VyaXR5L3Rlc3Qvc3RheC91dGlscy9IdHRwUmVxdWVzdFJlZGlyZWN0b3JQcm94eS5qYXZhCkBAIC0yMCw2ICsyMCw3IEBACiAKIGltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZWN1cml0eS5zdGF4LmV4dC5YTUxTZWN1cml0eVV0aWxzOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5Lmh0dHAuTWltZVR5cGVzOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmlvLkJ1ZmZlcjsKIGltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuU2VydmVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldENvbnRleHRIYW5kbGVyOwogaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldEhvbGRlcjsKQEAgLTEwNSw5ICsxMDYsOSBAQAogICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShzICsgIi8iICsgZmlsZSk7CiAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgbWltZSA9IG1pbWVUeXBlcy5nZXRNaW1lQnlFeHRlbnNpb24ocmVxLmdldFBhdGhJbmZvKCkpOworICAgICAgICAgICAgICAgICAgICBCdWZmZXIgbWltZSA9IG1pbWVUeXBlcy5nZXRNaW1lQnlFeHRlbnNpb24ocmVxLmdldFBhdGhJbmZvKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAobWltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXNwLnNldENvbnRlbnRUeXBlKG1pbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcC5zZXRDb250ZW50VHlwZShtaW1lLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIFhNTFNlY3VyaXR5VXRpbHMuY29weShpbnB1dFN0cmVhbSwgcmVzcC5nZXRPdXRwdXRTdHJlYW0oKSk7CiAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Cg==