ZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvLmdpdGlnbm9yZSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvLmdpdGlnbm9yZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRiMGI4My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54Ly5naXRpZ25vcmUKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLS5jbGFzc3BhdGgKLS5wcm9qZWN0Ci10YXJnZXQKLS5zZXR0aW5ncwotLmlkZWEKLSouaW1sCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2RlcGxveVNpdGUuc2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2RlcGxveVNpdGUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2YzI2NWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9kZXBsb3lTaXRlLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyEvYmluL3NoCi0KLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotbXZuIC1QcmVwb3J0aW5nIHNpdGUgc2l0ZTpzdGFnZSAkQAotbXZuIHNjbS1wdWJsaXNoOnB1Ymxpc2gtc2NtICRACmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNmE3NWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9pbnRlZ3JhdGlvbi10ZXN0LWFyY2hldHlwZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLmFyY2hldHlwZXM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmFzc2VtYmx5LXBsdWdpbi1pdC1hcmNoZXR5cGU8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tYXJjaGV0eXBlPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPk1hdmVuIEFzc2VtYmx5IFBsdWdpbiBJbnRlZ3JhdGlvbiBUZXN0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8YnVpbGQ+Ci0gICAgPGV4dGVuc2lvbnM+Ci0gICAgICA8ZXh0ZW5zaW9uPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLmFyY2hldHlwZTwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+YXJjaGV0eXBlLXBhY2thZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLWFscGhhLTI8L3ZlcnNpb24+Ci0gICAgICA8L2V4dGVuc2lvbj4KLSAgICA8L2V4dGVuc2lvbnM+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoZXR5cGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAtYWxwaGEtMjwvdmVyc2lvbj4KLSAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLSAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHJlcG9zaXRvcnk+Ci0gICAgICA8aWQ+aW50ZWdyYXRpb24udGVzdC5yZXBvPC9pZD4KLSAgICAgIDx1cmw+JHt0ZXN0LnJlbW90ZS5yZXBvLnVybH08L3VybD4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUtbWV0YWRhdGEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2ZkZjcxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFyY2hldHlwZS1kZXNjcmlwdG9yIG5hbWU9ImFzc2VtYmx5LWludGVncmF0aW9uLXRlc3QiPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQgZmlsdGVyZWQ9InRydWUiIHBhY2thZ2VkPSJ0cnVlIiBlbmNvZGluZz0iVVRGLTgiPgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioqLyouamF2YTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YTwvZGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qKi8qLmphdmE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vYXNzZW1ibHk8L2RpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+KiovKi54bWw8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KLSAgICAgIDxkaXJlY3Rvcnk+PC9kaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPmdvYWxzLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0IGVuY29kaW5nPSJVVEYtOCI+Ci0gICAgICA8ZGlyZWN0b3J5PjwvZGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT52ZXJpZnkuYnNoPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2FyY2hldHlwZS1kZXNjcmlwdG9yPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9pbnRlZ3JhdGlvbi10ZXN0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmYTIyMDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9pbnRlZ3JhdGlvbi10ZXN0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXJjaGV0eXBlPgotICA8aWQ+YXNzZW1ibHktaW50ZWdyYXRpb24tdGVzdDwvaWQ+Ci0gIDxzb3VyY2VzPgotICAgIDxzb3VyY2U+c3JjL21haW4vamF2YS9BcHAuamF2YTwvc291cmNlPgotICA8L3NvdXJjZXM+Ci0gIDx0ZXN0U291cmNlcz4KLSAgICA8c291cmNlPnNyYy9qYXZhL0FwcFRlc3QuamF2YTwvc291cmNlPgotICA8L3Rlc3RTb3VyY2VzPgotICA8cmVzb3VyY2VzPgotICAgIDxyZXNvdXJjZT5nb2Fscy50eHQ8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvYXNzZW1ibGUvYmluLnhtbDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlPnZlcmlmeS5ic2g8L3Jlc291cmNlPgotICA8L3Jlc291cmNlcz4KLTwvYXJjaGV0eXBlPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9pbnRlZ3JhdGlvbi10ZXN0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI1YzU4Yy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz0jIFNwZWNpZnkgdGhlIGdvYWxzIHRvIGJlIHJ1biBoZXJlLCBvbmUgcGVyIGxpbmUuIExpbmVzIGJlZ2lubmluZyB3aXRoIGEgaGFzaCAnIycgd2lsbCBiZSBpZ25vcmVkLiBjbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0OGE4YmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9pbnRlZ3JhdGlvbi10ZXN0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5zaW5nbGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9qYXZhL0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL2phdmEvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWFhMTQ3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL2phdmEvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotcGFja2FnZSAke3BhY2thZ2V9OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCAke3BhY2thZ2V9IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSAke3BhY2thZ2V9IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSAke3BhY2thZ2V9TmFtZSBuYW1lIG9mIHRoZSAke3BhY2thZ2V9IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nICR7cGFja2FnZX1OYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCAke3BhY2thZ2V9TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mICR7cGFja2FnZX1zIGJlaW5nICR7cGFja2FnZX1lZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkICR7cGFja2FnZX1BcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5Yjk1Mi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHNjb3BlPiR7dGVzdH08L3Njb3BlPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9pbnRlZ3JhdGlvbi10ZXN0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9pbnRlZ3JhdGlvbi10ZXN0LWFyY2hldHlwZS9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTE3ZjcwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2UgJHtwYWNrYWdlfTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvaW50ZWdyYXRpb24tdGVzdC1hcmNoZXR5cGUvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmMDdmNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L2ludGVncmF0aW9uLXRlc3QtYXJjaGV0eXBlL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qCi0gVGhpcyBpcyB3aGVyZSB5b3UgdmVyaWZ5IHRoZSByZXN1bHRzIG9mIHRoZSBhc3NlbWJseSBidWlsZC4gWW91IG1heSBuZWVkIHRvIGNoZWNrIHRoZSBleGlzdGVuY2Ugb2YgYSBmaWxlLAotIG9yIGV2ZW4gcGVlayB3aXRoaW4gYSBqYXIgZmlsZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgYXNzZW1ibHkgZGlkIHRoZSByaWdodCB0aGluZy4KLSAqLwotcmV0dXJuIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0LyR7YXJ0aWZhY3RJZH0tJHt2ZXJzaW9ufS1iaW4uZGlyL2xpYi9qdW5pdC5qYXIiICkuZXhpc3RzKCk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhYWRhMjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luczwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+Mjc8L3ZlcnNpb24+Ci0gICAgPHJlbGF0aXZlUGF0aD4uLi9tYXZlbi1wbHVnaW5zL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4yLjY8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0KLSAgPG5hbWU+QXBhY2hlIE1hdmVuIEFzc2VtYmx5IFBsdWdpbjwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPkEgTWF2ZW4gcGx1Z2luIHRvIGNyZWF0ZSBhcmNoaXZlcyBvZiB5b3VyIHByb2plY3QncyBzb3VyY2VzLCBjbGFzc2VzLCBkZXBlbmRlbmNpZXMgZXRjLiBmcm9tIGZsZXhpYmxlIGFzc2VtYmx5IGRlc2NyaXB0b3JzLjwvZGVzY3JpcHRpb24+Ci0KLSAgPHByZXJlcXVpc2l0ZXM+Ci0gICAgPG1hdmVuPiR7bWF2ZW5WZXJzaW9ufTwvbWF2ZW4+Ci0gIDwvcHJlcmVxdWlzaXRlcz4KLQotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9tYXZlbi9wbHVnaW5zL3RhZ3MvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIuNjwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL21hdmVuL3BsdWdpbnMvdGFncy9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi42PC9kZXZlbG9wZXJDb25uZWN0aW9uPgotICAgIDx1cmw+aHR0cDovL3N2bi5hcGFjaGUub3JnL3ZpZXd2Yy9tYXZlbi9wbHVnaW5zL3RhZ3MvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIuNjwvdXJsPgotICA8L3NjbT4KLSAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICA8dXJsPmh0dHBzOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvTUFTU0VNQkxZPC91cmw+Ci0gIDwvaXNzdWVNYW5hZ2VtZW50PgotICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICA8c2l0ZT4KLSAgICAgIDxpZD5hcGFjaGUud2Vic2l0ZTwvaWQ+Ci0gICAgICA8dXJsPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9pbmZyYS93ZWJzaXRlcy9wcm9kdWN0aW9uL21hdmVuL2NvbXBvbmVudHMvJHttYXZlbi5zaXRlLnBhdGh9PC91cmw+Ci0gICAgPC9zaXRlPgotICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPG1hdmVuLmNvbXBpbGVyLnNvdXJjZT4xLjY8L21hdmVuLmNvbXBpbGVyLnNvdXJjZT4KLSAgICA8bWF2ZW4uY29tcGlsZXIudGFyZ2V0PjEuNjwvbWF2ZW4uY29tcGlsZXIudGFyZ2V0PgotCi0gICAgPG1kb1ZlcnNpb24+MS4xLjM8L21kb1ZlcnNpb24+Ci0gICAgPG1hdmVuQXJjaGl2ZXJWZXJzaW9uPjIuNTwvbWF2ZW5BcmNoaXZlclZlcnNpb24+Ci0gICAgPG1hdmVuRmlsdGVyaW5nVmVyc2lvbj4xLjM8L21hdmVuRmlsdGVyaW5nVmVyc2lvbj4KLSAgICA8bWF2ZW5WZXJzaW9uPjIuMi4xPC9tYXZlblZlcnNpb24+Ci0gICAgPHRlc3RPdXRwdXRUb0ZpbGU+dHJ1ZTwvdGVzdE91dHB1dFRvRmlsZT4KLSAgICA8Y2hlY2tzdHlsZS52aW9sYXRpb24uaWdub3JlPlJlZHVuZGFudFRocm93cyxOZXdsaW5lQXRFbmRPZkZpbGUsUGFyYW1ldGVyTnVtYmVyLE1ldGhvZExlbmd0aCxGaWxlTGVuZ3RoLE1vZGlmaWVyT3JkZXIsSmF2YWRvY01ldGhvZDwvY2hlY2tzdHlsZS52aW9sYXRpb24uaWdub3JlPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGNvbnRyaWJ1dG9ycz4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5TdGVwaGVuIENvbGVib3VybmU8L25hbWU+Ci0gICAgPC9jb250cmlidXRvcj4KLSAgICA8Y29udHJpYnV0b3I+Ci0gICAgICA8bmFtZT5Ub255IEpld2VsbDwvbmFtZT4KLSAgICA8L2NvbnRyaWJ1dG9yPgotICA8L2NvbnRyaWJ1dG9ycz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke21hdmVuVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke21hdmVuVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke21hdmVuVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFydGlmYWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHttYXZlblZlcnNpb259PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1tb2RlbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7bWF2ZW5WZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbW1vbi1hcnRpZmFjdC1maWx0ZXJzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbS5nb29nbGUuY29kZS5maW5kYnVnczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpzcjMwNTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10b29sczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtaW50ZXJwb2xhdGlvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1hcmNoaXZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+ZmlsZS1tYW5hZ2VtZW50PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2hhcmVkLWlvPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaW88L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7bWF2ZW5GaWx0ZXJpbmdWZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWlvPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoaXZlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7bWF2ZW5BcmNoaXZlclZlcnNpb259PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjAuMjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvc2l0b3J5LWJ1aWxkZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4tdGVzdGluZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi10ZXN0aW5nLXRvb2xzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRlc3Rpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi10ZXN0LXRvb2xzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5lYXN5bW9jazwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmVhc3ltb2NrY2xhc3NleHRlbnNpb248L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjUuMjwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9jazwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuNS4yPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmpkb208L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qZG9tPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmpheGVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+amF4ZW48L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtRkNTPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnNheHBhdGg8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zYXhwYXRoPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLUZDUzwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+NC44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21wb25lbnQtYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+Ci0gICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxyZXNvdXJjZXM+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPgotICAgICAgPC9yZXNvdXJjZT4KLSAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtcmVzb3VyY2VzL3BsZXh1czwvZGlyZWN0b3J5PgotICAgICAgPC9yZXNvdXJjZT4KLSAgICA8L3Jlc291cmNlcz4KLQotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbXBvbmVudC1tZXRhZGF0YTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS42PC92ZXJzaW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmRlc2NyaXB0b3JzPC9pZD4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+Z2VuZXJhdGUtbWV0YWRhdGE8L2dvYWw+Ci0gICAgICAgICAgICAgIDxnb2FsPmdlbmVyYXRlLXRlc3QtbWV0YWRhdGE8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2RlbGxvPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tb2RlbGxvLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS44LjM8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDx2ZXJzaW9uPiR7bWRvVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgPG1vZGVscz4KLSAgICAgICAgICAgIDxtb2RlbD5zcmMvbWFpbi9tZG8vZGVzY3JpcHRvci5tZG88L21vZGVsPgotICAgICAgICAgICAgPG1vZGVsPnNyYy9tYWluL21kby9jb21wb25lbnQubWRvPC9tb2RlbD4KLSAgICAgICAgICA8L21vZGVscz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPm1kbzwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnhwcDMtcmVhZGVyPC9nb2FsPgotICAgICAgICAgICAgICA8Z29hbD54cHAzLXdyaXRlcjwvZ29hbD4KLSAgICAgICAgICAgICAgPGdvYWw+amF2YTwvZ29hbD4KLSAgICAgICAgICAgICAgPGdvYWw+eHNkPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPm1kby1zaXRlPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wcmUtc2l0ZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnhkb2M8L2dvYWw+Ci0gICAgICAgICAgICAgIDxnb2FsPnhzZDwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxlc2NhcGVTdHJpbmc+XDwvZXNjYXBlU3RyaW5nPgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxyZWRpcmVjdFRlc3RPdXRwdXRUb0ZpbGU+JHt0ZXN0T3V0cHV0VG9GaWxlfTwvcmVkaXJlY3RUZXN0T3V0cHV0VG9GaWxlPgotICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgotICAgICAgICAgICAgICA8IS0tIE5PVEU6IEVuc3VyZSB0aGUgdG1wIGRpciBjb25maWd1cmVkIGZvciBTdXJlZmlyZSBleGlzdHMgb3Igc29tZSBKUkVzIChlLmcuIDEuNSkgd2lsbCBmYWlsIHRvIGNyZWF0ZSB0ZW1wIGZpbGVzIC0tPgotICAgICAgICAgICAgICA8amF2YS5pby50bXBkaXI+JHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9PC9qYXZhLmlvLnRtcGRpcj4KLSAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLnJhdDwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5hcGFjaGUtcmF0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxleGNsdWRlcyBjb21iaW5lLmNoaWxkcmVuPSJhcHBlbmQiPgotICAgICAgICAgICAgICA8IS0tCi0gICAgICAgICAgICAgICAgVGhlc2UgZmlsZXMgY29udGFpbiByZWFsIHJlcG9zaXRvcnkgYXJ0aWZhY3RzLgotICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzLyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZW1vdGUtcmVwby9hc3NlbWJseS9kZXBlbmRlbmN5LWFydGlmYWN0LyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICA8IS0tIFRoZXNlIGZpbGVzIGFyZSBvbmx5IHJlc291cmNlcyBmb3IgaW50ZWdyYXRpb24gdGVzdHMuIC0tPgotICAgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2NoaWxkL3JlbW90ZS1yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzLzEuNC4zLVNOQVBTSE9UL3BsZXh1cy11dGlscy0xLjQuMy1TTkFQU0hPVC5wb208L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgIDxleGNsdWRlPnNyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zZXJ2aWNlcy1hZ2dyZWdhdGlvbi8qKi8qPC9leGNsdWRlPgotICAgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uLyoqLyo8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgIDwhLS0gVGhlIGZvbGxvd2luZyBpcyB1c2VkIHRvIGV4Y2x1ZGUgb25seSB0eHQgZmlsZXMgd2hpY2ggZG9uJ3QgaGF2ZSBhIGxpY2Vuc2UgaGVhZGVyIC0tPgotICAgICAgICAgICAgICA8ZXhjbHVkZT5zcmMvaXQvKiovKi50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgIDwhLS0gVGhlIGZvbGxvd2luZyBpcyB1c2VkIHRvIGV4Y2x1ZGUgZmlsZXMgd2l0aCB0aGUgZXh0ZW5zaW9uICouZmlsZSAtLT4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL2l0LyoqLyouZmlsZTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+c3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC9zcmMvbWFpbi9jb25maWcvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgIDxleGNsdWRlPnNyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICA8L3BsdWdpbnM+Ci0gICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotICA8L2J1aWxkPgotCi0gIDxwcm9maWxlcz4KLSAgICA8cHJvZmlsZT4KLSAgICAgIDxpZD5ydW4taXRzPC9pZD4KLSAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8aW52b2tlclBsdWdpblZlcnNpb24+MS45PC9pbnZva2VyUGx1Z2luVmVyc2lvbj4KLSAgICAgICAgPGl0UGFyZW50PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2l0L2l0LXByb2plY3QtcGFyZW50PC9pdFBhcmVudD4KLSAgICAgICAgPGl0UHJvamVjdHM+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vaXQvcHJvamVjdHM8L2l0UHJvamVjdHM+Ci0gICAgICAgIDxsb2NhbFJlcG9zaXRvcnlQYXRoPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2xvY2FsLXJlcG9zaXRvcnk8L2xvY2FsUmVwb3NpdG9yeVBhdGg+Ci0gICAgICAgIDx0ZXN0LnJlbW90ZS5yZXBvLnVybD5maWxlOi8vJHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9L3JlbW90ZS1yZXBvc2l0b3J5PC90ZXN0LnJlbW90ZS5yZXBvLnVybD4KLSAgICAgICAgPGl0LnBvbUluY2x1ZGVzPioqL3BvbS54bWw8L2l0LnBvbUluY2x1ZGVzPgotICAgICAgICA8aXQuc3RyZWFtTG9ncz5mYWxzZTwvaXQuc3RyZWFtTG9ncz4KLSAgICAgICAgPGl0LmRlYnVnPnRydWU8L2l0LmRlYnVnPgotICAgICAgICA8dGVzdFZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC90ZXN0VmVyc2lvbj4KLSAgICAgICAgPHVzZUp2bUNobW9kPmZhbHNlPC91c2VKdm1DaG1vZD4KLSAgICAgIDwvcHJvcGVydGllcz4KLQotICAgICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW52b2tlci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4ke2ludm9rZXJQbHVnaW5WZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5UGF0aD4ke2xvY2FsUmVwb3NpdG9yeVBhdGh9PC9sb2NhbFJlcG9zaXRvcnlQYXRoPgotICAgICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8dXNlSnZtQ2htb2Q+JHt1c2VKdm1DaG1vZH08L3VzZUp2bUNobW9kPgotICAgICAgICAgICAgICAgIDx0ZXN0VmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdGVzdFZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeVBhdGg+JHtsb2NhbFJlcG9zaXRvcnlQYXRofTwvbG9jYWxSZXBvc2l0b3J5UGF0aD4KLSAgICAgICAgICAgICAgICA8aW52b2tlclBsdWdpblZlcnNpb24+JHtpbnZva2VyUGx1Z2luVmVyc2lvbn08L2ludm9rZXJQbHVnaW5WZXJzaW9uPgotICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICAgICAgICAgIDxzaG93VmVyc2lvbj50cnVlPC9zaG93VmVyc2lvbj4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxpZD5zZXR1cC1pbnRlZ3JhdGlvbi10ZXN0LWVudjwvaWQ+Ci0gICAgICAgICAgICAgICAgPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD5pbnN0YWxsPC9nb2FsPgotICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8c3VwcHJlc3NTdW1tYXJpZXM+dHJ1ZTwvc3VwcHJlc3NTdW1tYXJpZXM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDxnb2FsPmluc3RhbGw8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgPHByb2plY3RzRGlyZWN0b3J5PnNyYy9pdC9pdC1wcm9qZWN0LXBhcmVudDwvcHJvamVjdHNEaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICA8Y2xvbmVQcm9qZWN0c1RvPiR7aXRQYXJlbnR9PC9jbG9uZVByb2plY3RzVG8+Ci0gICAgICAgICAgICAgICAgICA8cG9tSW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxwb21JbmNsdWRlPnBvbS54bWw8L3BvbUluY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICA8L3BvbUluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgPHN0cmVhbUxvZ3M+JHtpdC5zdHJlYW1Mb2dzfTwvc3RyZWFtTG9ncz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxpZD5pbnRlZ3JhdGlvbi10ZXN0PC9pZD4KLSAgICAgICAgICAgICAgICA8cGhhc2U+aW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICA8cHJvamVjdHNEaXJlY3Rvcnk+c3JjL2l0L3Byb2plY3RzPC9wcm9qZWN0c0RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgIDxjbG9uZUNsZWFuPnRydWU8L2Nsb25lQ2xlYW4+Ci0gICAgICAgICAgICAgICAgICA8Y2xvbmVQcm9qZWN0c1RvPiR7aXRQcm9qZWN0c308L2Nsb25lUHJvamVjdHNUbz4KLSAgICAgICAgICAgICAgICAgIDx0ZXN0UHJvcGVydGllc0ZpbGU+dGVzdC5wcm9wZXJ0aWVzPC90ZXN0UHJvcGVydGllc0ZpbGU+Ci0gICAgICAgICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgPHVzZUp2bUNobW9kPiR7dXNlSnZtQ2htb2R9PC91c2VKdm1DaG1vZD4KLSAgICAgICAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgIDxkZWJ1Zz4ke2l0LmRlYnVnfTwvZGVidWc+Ci0gICAgICAgICAgICAgICAgICA8c2V0dGluZ3NGaWxlPnNyYy9pdC9zZXR0aW5ncy54bWw8L3NldHRpbmdzRmlsZT4KLSAgICAgICAgICAgICAgICAgIDxwb21JbmNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPHBvbUluY2x1ZGU+JHtpdC5wb21JbmNsdWRlc308L3BvbUluY2x1ZGU+Ci0gICAgICAgICAgICAgICAgICA8L3BvbUluY2x1ZGVzPgotICAgICAgICAgICAgICAgICAgPHN0cmVhbUxvZ3M+JHtpdC5zdHJlYW1Mb2dzfTwvc3RyZWFtTG9ncz4KLSAgICAgICAgICAgICAgICAgIDxwb21FeGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgPHBvbUV4Y2x1ZGU+cmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL3BvbS54bWw8L3BvbUV4Y2x1ZGU+Ci0KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBUaGlzIHdpbGwgYmUgaGFuZGxlZCBieSB0aGUgcGFyZW50IGluIHRoZSBidWdzL21hc3NlbWJseS0yODUgZGlyLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHBvbUV4Y2x1ZGU+YnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtKi9wb20ueG1sPC9wb21FeGNsdWRlPgotCi0gICAgICAgICAgICAgICAgICAgIDxwb21FeGNsdWRlPmRlcGVuZGVuY3ktc2V0cy9kZXBTZXQtZW51bS12cy13aWxkY2FyZC9lbnVtL3BvbS54bWw8L3BvbUV4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxwb21FeGNsdWRlPmRlcGVuZGVuY3ktc2V0cy9kZXBTZXQtZW51bS12cy13aWxkY2FyZC93aWxkY2FyZC9wb20ueG1sPC9wb21FeGNsdWRlPgotCi0gICAgICAgICAgICAgICAgICAgIDxwb21FeGNsdWRlPioqL215LWFwcCovcG9tLnhtbDwvcG9tRXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPHBvbUV4Y2x1ZGU+KiovY2hpbGQqL3BvbS54bWw8L3BvbUV4Y2x1ZGU+Ci0gICAgICAgICAgICAgICAgICAgIDxwb21FeGNsdWRlPioqL21vZHVsZSovcG9tLnhtbDwvcG9tRXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgICAgPHBvbUV4Y2x1ZGU+KiovZGVzY3JpcHRvci9wb20ueG1sPC9wb21FeGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8cG9tRXhjbHVkZT4qKi9oYW5kbGVyLWRlZi9wb20ueG1sPC9wb21FeGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8cG9tRXhjbHVkZT4qKi9hc3NlbWJseS9wb20ueG1sPC9wb21FeGNsdWRlPgotICAgICAgICAgICAgICAgICAgICA8cG9tRXhjbHVkZT5kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvcG9tLnhtbDwvcG9tRXhjbHVkZT4KLSAgICAgICAgICAgICAgICAgIDwvcG9tRXhjbHVkZXM+Ci0gICAgICAgICAgICAgICAgICA8cG9zdEJ1aWxkSG9va1NjcmlwdD52ZXJpZnk8L3Bvc3RCdWlsZEhvb2tTY3JpcHQ+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY29tbW9uczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWNvbXByZXNzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuOTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgIDwvYnVpbGQ+Ci0gICAgPC9wcm9maWxlPgotICA8L3Byb2ZpbGVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvQXNzZW1ibHlNb2pvVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L0Fzc2VtYmx5TW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU5ZTVhZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvQXNzZW1ibHlNb2pvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5OwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2pvcy5Bc3NlbWJseU1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5KYXJBcmNoaXZlclN0dWI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuUmVhY3Rvck1hdmVuUHJvamVjdFN0dWI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuV2FyQXJjaGl2ZXJTdHViOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3RpbmcuQWJzdHJhY3RNb2pvVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLlBsZXh1c1Rlc3RDYXNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLk1hbmlmZXN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIudGFyLlRhckFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIudGFyLlRhckxvbmdGaWxlTW9kZTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbUJ1aWxkZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZW5hbWVGaWx0ZXI7Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBFZHdpbiBQdW56YWxhbgotICovCi1wdWJsaWMgY2xhc3MgQXNzZW1ibHlNb2pvVGVzdAotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvVGVzdENhc2UKLXsKLSAgICBwcml2YXRlIFN0cmluZyBiYXNlZGlyID0gUGxleHVzVGVzdENhc2UuZ2V0QmFzZWRpcigpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pbkNvbmZpZ3VyYXRpb24oKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBleGVjdXRlTW9qbyggIm1pbi1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdFdpdGhDbGFzc2lmaWVyKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZXhlY3V0ZU1vam8oICJjbGFzc2lmaWVyLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIEZpbGUgYXNzZW1ibHlKYXIgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXREZXN0RmlsZSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGFyY2hpdmUgZW5kcyB3aXRoIHRoZSBjbGFzc2lmaWVyIiwgYXNzZW1ibHlKYXIuZ2V0TmFtZSgpLmVuZHNXaXRoKCAidGVzdC1oYXJuZXNzLnppcCIgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5KCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZXhlY3V0ZU1vam8oICJkZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5LXBsdWdpbi1jb25maWcueG1sIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrZWREZXBlbmRlbmN5U2V0KCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBnZXRNb2pvKCAiZGVwU2V0LWRlZmF1bHQtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgImV4ZWN1dGVkUHJvamVjdCIgKTsKLSAgICAgICAgU2V0IGFydGlmYWN0U2V0ID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsKLQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZU1hcCA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0gICAgICAgIENvbGxlY3Rpb24gYXJjaGl2ZWRGaWxlcyA9IGFyY2hpdmVNYXAua2V5U2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBudW1iZXIgb2YgZmlsZXMgaW4gYXJjaGl2ZSIsIGFydGlmYWN0U2V0LnNpemUoKSArIDEsIGFyY2hpdmVkRmlsZXMuc2l6ZSgpICk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgYXJ0aWZhY3RzID0gYXJ0aWZhY3RTZXQuaXRlcmF0b3IoKTsgYXJ0aWZhY3RzLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBleHBlY3RlZCA9IChBcnRpZmFjdCkgYXJ0aWZhY3RzLm5leHQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgZXhwZWN0ZWQgZGVwZW5kZW5jeSBhcnRpZmFjdHMgaW4gYXJjaGl2ZSIsIGFyY2hpdmVkRmlsZXMuY29udGFpbnMoIGV4cGVjdGVkLmdldEZpbGUoKSApICk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBleHBlY3RlZCBkZXBlbmRlbmN5IGlzIG5vdCB1bnBhY2tlZCIsIGV4cGVjdGVkLmdldEZpbGUoKS5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApICk7Ci0KLSAgICAgICAgICAgIEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUgYXJjaGl2ZUZpbGUgPQotICAgICAgICAgICAgICAgIChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlTWFwLmdldCggZXhwZWN0ZWQuZ2V0RmlsZSgpICk7Ci0gICAgICAgICAgICBTdHJpbmcgYXJjaGl2ZVBhdGggPSBhcmNoaXZlRmlsZS5nZXRPdXRwdXROYW1lKCk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpbmNsdWRlQmFzZURpcmVjdG9yeSIsIGFyY2hpdmVQYXRoLnN0YXJ0c1dpdGgoICJhc3NlbWJseS8iICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IHByb2plY3QgaXMgaW4gYXJjaGl2ZSIsIGFyY2hpdmVkRmlsZXMuY29udGFpbnMoIHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRGaWxlKCkgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBwcm9qZWN0IGlzIG5vdCB1bnBhY2tlZCIsIHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCAiLmphciIgKSApOwotCi0gICAgICAgIEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUgYXJjaGl2ZUZpbGUgPQotICAgICAgICAgICAgKEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUpIGFyY2hpdmVNYXAuZ2V0KCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpICk7Ci0gICAgICAgIFN0cmluZyBhcmNoaXZlUGF0aCA9IGFyY2hpdmVGaWxlLmdldE91dHB1dE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaW5jbHVkZUJhc2VEaXJlY3RvcnkiLCBhcmNoaXZlUGF0aC5zdGFydHNXaXRoKCAiYXNzZW1ibHkvIiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhY2tlZERlcGVuZGVuY3lTZXRXaXRoRmlsZW5hbWVNYXBwaW5nKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBnZXRNb2pvKCAiZGVwU2V0LWZpbGVuYW1lLW1hcHBpbmctcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgImV4ZWN1dGVkUHJvamVjdCIgKTsKLSAgICAgICAgU2V0IGFydGlmYWN0U2V0ID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsKLQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZU1hcCA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0gICAgICAgIENvbGxlY3Rpb24gYXJjaGl2ZWRGaWxlcyA9IGFyY2hpdmVNYXAua2V5U2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBudW1iZXIgb2YgZmlsZXMgaW4gYXJjaGl2ZSIsIGFydGlmYWN0U2V0LnNpemUoKSArIDEsIGFyY2hpdmVkRmlsZXMuc2l6ZSgpICk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgYXJ0aWZhY3RzID0gYXJ0aWZhY3RTZXQuaXRlcmF0b3IoKTsgYXJ0aWZhY3RzLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBleHBlY3RlZCA9IChBcnRpZmFjdCkgYXJ0aWZhY3RzLm5leHQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgZXhwZWN0ZWQgZGVwZW5kZW5jeSBhcnRpZmFjdHMgaW4gYXJjaGl2ZSIsIGFyY2hpdmVkRmlsZXMuY29udGFpbnMoIGV4cGVjdGVkLmdldEZpbGUoKSApICk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBleHBlY3RlZCBkZXBlbmRlbmN5IGlzIG5vdCB1bnBhY2tlZCIsIGV4cGVjdGVkLmdldEZpbGUoKS5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApICk7Ci0KLSAgICAgICAgICAgIEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUgYXJjaGl2ZUZpbGUgPSAoSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSkgYXJjaGl2ZU1hcC5nZXQoIGV4cGVjdGVkLmdldEZpbGUoKSApOwotICAgICAgICAgICAgU3RyaW5nIGFyY2hpdmVQYXRoID0gYXJjaGl2ZUZpbGUuZ2V0T3V0cHV0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTmFtZSA9Ci0gICAgICAgICAgICAgICAgImxpYnMvIiArIGV4cGVjdGVkLmdldFZlcnNpb24oKSArICItIiArIGV4cGVjdGVkLmdldEFydGlmYWN0SWQoKSArICItIiArIGV4cGVjdGVkLmdldEdyb3VwSWQoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGZpbGVuYW1lIG1hcHBpbmcgd2FzIHVzZWQiLCBhcmNoaXZlUGF0aC5lcXVhbHMoIGV4cGVjdGVkTmFtZSApICk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZSggIlRlc3QgaW5jbHVkZUJhc2VEaXJlY3RvcnkiLCBhcmNoaXZlUGF0aC5zdGFydHNXaXRoKCAiYXNzZW1ibHkvIiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBwcm9qZWN0IGlzIGluIGFyY2hpdmUiLCBhcmNoaXZlZEZpbGVzLmNvbnRhaW5zKCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgcHJvamVjdCBpcyBub3QgdW5wYWNrZWQiLCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpLmdldE5hbWUoKS5lbmRzV2l0aCggIi5qYXIiICkgKTsKLQotICAgICAgICBKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlIGFyY2hpdmVGaWxlID0KLSAgICAgICAgICAgIChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlTWFwLmdldCggcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSApOwotICAgICAgICBTdHJpbmcgYXJjaGl2ZVBhdGggPSBhcmNoaXZlRmlsZS5nZXRPdXRwdXROYW1lKCk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCAiVGVzdCBpbmNsdWRlQmFzZURpcmVjdG9yeSIsIGFyY2hpdmVQYXRoLnN0YXJ0c1dpdGgoICJhc3NlbWJseS8iICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2VkRGVwZW5kZW5jeVNldFdpdGhGaWxlbmFtZU1hcHBpbmdBbmRDbGFzc2lmaWVyKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBnZXRNb2pvKCAiZGVwU2V0LWZpbGVuYW1lLW1hcHBpbmctYW5kLWNsYXNzaWZpZXItcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgImV4ZWN1dGVkUHJvamVjdCIgKTsKLSAgICAgICAgU2V0IGFydGlmYWN0U2V0ID0gcHJvamVjdC5nZXRBcnRpZmFjdHMoKTsKLQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZU1hcCA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0gICAgICAgIENvbGxlY3Rpb24gYXJjaGl2ZWRGaWxlcyA9IGFyY2hpdmVNYXAua2V5U2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBudW1iZXIgb2YgZmlsZXMgaW4gYXJjaGl2ZSIsIGFydGlmYWN0U2V0LnNpemUoKSArIDEsIGFyY2hpdmVkRmlsZXMuc2l6ZSgpICk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgYXJ0aWZhY3RzID0gYXJ0aWZhY3RTZXQuaXRlcmF0b3IoKTsgYXJ0aWZhY3RzLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBleHBlY3RlZCA9IChBcnRpZmFjdCkgYXJ0aWZhY3RzLm5leHQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgZXhwZWN0ZWQgZGVwZW5kZW5jeSBhcnRpZmFjdHMgaW4gYXJjaGl2ZSIsIGFyY2hpdmVkRmlsZXMuY29udGFpbnMoIGV4cGVjdGVkLmdldEZpbGUoKSApICk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBleHBlY3RlZCBkZXBlbmRlbmN5IGlzIG5vdCB1bnBhY2tlZCIsIGV4cGVjdGVkLmdldEZpbGUoKS5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApICk7Ci0KLSAgICAgICAgICAgIEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUgYXJjaGl2ZUZpbGUgPSAoSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSkgYXJjaGl2ZU1hcC5nZXQoIGV4cGVjdGVkLmdldEZpbGUoKSApOwotICAgICAgICAgICAgU3RyaW5nIGFyY2hpdmVQYXRoID0gYXJjaGl2ZUZpbGUuZ2V0T3V0cHV0TmFtZSgpOwotICAgICAgICAgICAgU3RyaW5nIGV4cGVjdGVkTmFtZTsKLSAgICAgICAgICAgIGlmICggU3RyaW5nVXRpbHMuaXNFbXB0eSggZXhwZWN0ZWQuZ2V0Q2xhc3NpZmllcigpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGV4cGVjdGVkTmFtZSA9Ci0gICAgICAgICAgICAgICAgICAgICJsaWJzLyIgKyBleHBlY3RlZC5nZXRWZXJzaW9uKCkgKyAiLiIgKyBleHBlY3RlZC5nZXRBcnRpZmFjdElkKCkgKyAiLiIgKwotICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5nZXRHcm91cElkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhwZWN0ZWROYW1lID0KLSAgICAgICAgICAgICAgICAgICAgImxpYnMvIiArIGV4cGVjdGVkLmdldFZlcnNpb24oKSArICIuIiArIGV4cGVjdGVkLmdldEFydGlmYWN0SWQoKSArCi0gICAgICAgICAgICAgICAgICAgICItY2xhc3NpZmllciIgKyAiLiIgKyBleHBlY3RlZC5nZXRHcm91cElkKCk7Ci0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyggIlRlc3QgZmlsZW5hbWUgbWFwcGluZyB3YXMgdXNlZCIsIGFyY2hpdmVQYXRoLCBleHBlY3RlZE5hbWUgKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCAiVGVzdCBpbmNsdWRlQmFzZURpcmVjdG9yeSIsIGFyY2hpdmVQYXRoLnN0YXJ0c1dpdGgoICJhc3NlbWJseS8iICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IHByb2plY3QgaXMgaW4gYXJjaGl2ZSIsIGFyY2hpdmVkRmlsZXMuY29udGFpbnMoIHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRGaWxlKCkgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBwcm9qZWN0IGlzIG5vdCB1bnBhY2tlZCIsIHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCAiLmphciIgKSApOwotCi0gICAgICAgIEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUgYXJjaGl2ZUZpbGUgPQotICAgICAgICAgICAgKEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUpIGFyY2hpdmVNYXAuZ2V0KCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpICk7Ci0gICAgICAgIFN0cmluZyBhcmNoaXZlUGF0aCA9IGFyY2hpdmVGaWxlLmdldE91dHB1dE5hbWUoKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoICJUZXN0IGluY2x1ZGVCYXNlRGlyZWN0b3J5IiwgYXJjaGl2ZVBhdGguc3RhcnRzV2l0aCggImFzc2VtYmx5LyIgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrZWREZXBlbmRlbmN5U2V0V2l0aFNjb3BlKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBnZXRNb2pvKCAiZGVwU2V0LXNjb3BlZC1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IChNYXZlblByb2plY3QpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAiZXhlY3V0ZWRQcm9qZWN0IiApOwotICAgICAgICBTZXQgYXJ0aWZhY3RTZXQgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpOwotCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOwotCi0gICAgICAgIE1hcCBhcmNoaXZlTWFwID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBhcmNoaXZlZEZpbGVzID0gYXJjaGl2ZU1hcC5rZXlTZXQoKTsKLQotICAgICAgICBmb3IgKCBJdGVyYXRvciBhcnRpZmFjdHMgPSBhcnRpZmFjdFNldC5pdGVyYXRvcigpOyBhcnRpZmFjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGV4cGVjdGVkID0gKEFydGlmYWN0KSBhcnRpZmFjdHMubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoICFleHBlY3RlZC5nZXRTY29wZSgpLmVxdWFscyggQXJ0aWZhY3QuU0NPUEVfVEVTVCApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBleHBlY3RlZCBkZXBlbmRlbmN5IGFydGlmYWN0cyBpbiBhcmNoaXZlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlZEZpbGVzLmNvbnRhaW5zKCBleHBlY3RlZC5nZXRGaWxlKCkgKSApOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGV4cGVjdGVkIGRlcGVuZGVuY3kgaXMgbm90IHVucGFja2VkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZC5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCAiLmphciIgKSApOwotCi0gICAgICAgICAgICAgICAgSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSBhcmNoaXZlRmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlTWFwLmdldCggZXhwZWN0ZWQuZ2V0RmlsZSgpICk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFyY2hpdmVQYXRoID0gYXJjaGl2ZUZpbGUuZ2V0T3V0cHV0TmFtZSgpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGluY2x1ZGVCYXNlRGlyZWN0b3J5IiwgYXJjaGl2ZVBhdGguc3RhcnRzV2l0aCggImFzc2VtYmx5LyIgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKCAiVGVzdCB1bmV4cGVjdGVkIGRlcGVuZGVuY3kgYXJ0aWZhY3RzIGluIGFyY2hpdmUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmNoaXZlZEZpbGVzLmNvbnRhaW5zKCBleHBlY3RlZC5nZXRGaWxlKCkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgcHJvamVjdCBpcyBpbiBhcmNoaXZlIiwgYXJjaGl2ZWRGaWxlcy5jb250YWlucyggcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSApICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IHByb2plY3QgaXMgbm90IHVucGFja2VkIiwgcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKS5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApICk7Ci0KLSAgICAgICAgSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSBhcmNoaXZlRmlsZSA9Ci0gICAgICAgICAgICAoSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSkgYXJjaGl2ZU1hcC5nZXQoIHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRGaWxlKCkgKTsKLSAgICAgICAgU3RyaW5nIGFyY2hpdmVQYXRoID0gYXJjaGl2ZUZpbGUuZ2V0T3V0cHV0TmFtZSgpOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpbmNsdWRlQmFzZURpcmVjdG9yeSIsIGFyY2hpdmVQYXRoLnN0YXJ0c1dpdGgoICJhc3NlbWJseS8iICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2VkRGVwZW5kZW5jeVNldEluY2x1ZGVzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBnZXRNb2pvKCAiZGVwU2V0LWluY2x1ZGVzLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJleGVjdXRlZFByb2plY3QiICk7Ci0gICAgICAgIFNldCBhcnRpZmFjdFNldCA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgTWFwIGFyY2hpdmVNYXAgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotICAgICAgICBDb2xsZWN0aW9uIGFyY2hpdmVkRmlsZXMgPSBhcmNoaXZlTWFwLmtleVNldCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIlRlc3QgbnVtYmVyIG9mIGZpbGVzIGluIGFyY2hpdmUiLCAxLCBhcmNoaXZlZEZpbGVzLnNpemUoKSApOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGFydGlmYWN0cyA9IGFydGlmYWN0U2V0Lml0ZXJhdG9yKCk7IGFydGlmYWN0cy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgQXJ0aWZhY3QgZGVwQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGFydGlmYWN0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICggZGVwQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpLmVxdWFscyggImRlcGVuZGVuY3ktYXJ0aWZhY3QxIiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBleHBlY3RlZCBkZXBlbmRlbmN5IGFydGlmYWN0cyBpbiBhcmNoaXZlIiwgYXJjaGl2ZWRGaWxlcy5jb250YWlucyggZGVwQXJ0aWZhY3QuZ2V0RmlsZSgpICkgKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBleHBlY3RlZCBkZXBlbmRlbmN5IGlzIG5vdCB1bnBhY2tlZCIsIGRlcEFydGlmYWN0LmdldEZpbGUoKS5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApICk7Ci0KLSAgICAgICAgICAgICAgICBKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlIGFyY2hpdmVGaWxlID0KLSAgICAgICAgICAgICAgICAgICAgKEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUpIGFyY2hpdmVNYXAuZ2V0KCBkZXBBcnRpZmFjdC5nZXRGaWxlKCkgKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgYXJjaGl2ZVBhdGggPSBhcmNoaXZlRmlsZS5nZXRPdXRwdXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaW5jbHVkZUJhc2VEaXJlY3RvcnkiLCBhcmNoaXZlUGF0aC5zdGFydHNXaXRoKCAiYXNzZW1ibHkvIiApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoICJUZXN0IGRlcGVuZGVuY3kgYXJ0aWZhY3RzIGlzIE5PVCBpbiBhcmNoaXZlIiwgYXJjaGl2ZWRGaWxlcy5jb250YWlucyggZGVwQXJ0aWZhY3QuZ2V0RmlsZSgpICkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydEZhbHNlKCAiVGVzdCBwcm9qZWN0IGlzIE5PVCBpbiBhcmNoaXZlIiwgYXJjaGl2ZWRGaWxlcy5jb250YWlucyggcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFBhY2tlZERlcGVuZGVuY3lTZXRFeGNsdWRlcygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VtYmx5TW9qbyBtb2pvID0gZ2V0TW9qbyggImRlcFNldC1leGNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IChNYXZlblByb2plY3QpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAiZXhlY3V0ZWRQcm9qZWN0IiApOwotICAgICAgICBTZXQgYXJ0aWZhY3RTZXQgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpOwotCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOwotCi0gICAgICAgIE1hcCBhcmNoaXZlTWFwID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLSAgICAgICAgQ29sbGVjdGlvbiBhcmNoaXZlZEZpbGVzID0gYXJjaGl2ZU1hcC5rZXlTZXQoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IG51bWJlciBvZiBmaWxlcyBpbiBhcmNoaXZlIiwgYXJ0aWZhY3RTZXQuc2l6ZSgpLCBhcmNoaXZlZEZpbGVzLnNpemUoKSApOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGFydGlmYWN0cyA9IGFydGlmYWN0U2V0Lml0ZXJhdG9yKCk7IGFydGlmYWN0cy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgQXJ0aWZhY3QgZGVwQXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIGFydGlmYWN0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGlmICggIWRlcEFydGlmYWN0LmdldEFydGlmYWN0SWQoKS5lcXVhbHMoICJkZXBlbmRlbmN5LWFydGlmYWN0MSIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgZXhwZWN0ZWQgZGVwZW5kZW5jeSBhcnRpZmFjdHMgaW4gYXJjaGl2ZSIsIGFyY2hpdmVkRmlsZXMuY29udGFpbnMoIGRlcEFydGlmYWN0LmdldEZpbGUoKSApICk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgZXhwZWN0ZWQgZGVwZW5kZW5jeSBpcyBub3QgdW5wYWNrZWQiLCBkZXBBcnRpZmFjdC5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCAiLmphciIgKSApOwotCi0gICAgICAgICAgICAgICAgSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSBhcmNoaXZlRmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgIChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlTWFwLmdldCggZGVwQXJ0aWZhY3QuZ2V0RmlsZSgpICk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGFyY2hpdmVQYXRoID0gYXJjaGl2ZUZpbGUuZ2V0T3V0cHV0TmFtZSgpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGluY2x1ZGVCYXNlRGlyZWN0b3J5IiwgYXJjaGl2ZVBhdGguc3RhcnRzV2l0aCggImFzc2VtYmx5LyIgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFzc2VydEZhbHNlKCAiVGVzdCBkZXBlbmRlbmN5IGFydGlmYWN0cyBpcyBOT1QgaW4gYXJjaGl2ZSIsIGFyY2hpdmVkRmlsZXMuY29udGFpbnMoIGRlcEFydGlmYWN0LmdldEZpbGUoKSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBwcm9qZWN0IGlzIGluIGFyY2hpdmUiLCBhcmNoaXZlZEZpbGVzLmNvbnRhaW5zKCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgcHJvamVjdCBpcyBub3QgdW5wYWNrZWQiLCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpLmdldE5hbWUoKS5lbmRzV2l0aCggIi5qYXIiICkgKTsKLQotICAgICAgICBKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlIGFyY2hpdmVGaWxlID0KLSAgICAgICAgICAgIChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlTWFwLmdldCggcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSApOwotICAgICAgICBTdHJpbmcgYXJjaGl2ZVBhdGggPSBhcmNoaXZlRmlsZS5nZXRPdXRwdXROYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGluY2x1ZGVCYXNlRGlyZWN0b3J5IiwgYXJjaGl2ZVBhdGguc3RhcnRzV2l0aCggImFzc2VtYmx5LyIgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbnBhY2tlZERlcGVuZGVuY3lTZXQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGdldE1vam8oICJkZXBTZXQtdW5wYWNrLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJleGVjdXRlZFByb2plY3QiICk7Ci0gICAgICAgIFNldCBhcnRpZmFjdFNldCA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0KLSAgICAgICAgRmlsZSB3b3JrRGlyID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAid29ya0RpcmVjdG9yeSIgKTsKLQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICBDb2xsZWN0aW9uIGFyY2hpdmVkRmlsZVNldCA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCkua2V5U2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBudW1iZXIgb2YgZmlsZXMgaW4gYXJjaGl2ZSIsIGFydGlmYWN0U2V0LnNpemUoKSArIDEsIGFyY2hpdmVkRmlsZVNldC5zaXplKCkgKTsKLQotICAgICAgICBmb3IgKCBJdGVyYXRvciBhcnRpZmFjdHMgPSBhcnRpZmFjdFNldC5pdGVyYXRvcigpOyBhcnRpZmFjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGRlcGVuZGVuY3kgPSAoQXJ0aWZhY3QpIGFydGlmYWN0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIFN0cmluZyBuYW1lID0gZGVwZW5kZW5jeS5nZXRBcnRpZmFjdElkKCkgKyAiLSIgKyBkZXBlbmRlbmN5LmdldFZlcnNpb24oKSArICIuIiArIGRlcGVuZGVuY3kuZ2V0VHlwZSgpOwotICAgICAgICAgICAgRmlsZSB3b3JrUGF0aCA9IG5ldyBGaWxlKCB3b3JrRGlyLCBuYW1lICk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGV4cGVjdGVkIGRlcGVuZGVuY3kgaXMgdW5wYWNrZWQiLCB3b3JrUGF0aC5leGlzdHMoKSAmJiB3b3JrUGF0aC5pc0RpcmVjdG9yeSgpICk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBleHBlY3RlZCBkZXBlbmRlbmN5IGlzIGluIHRoZSBhcmNoaXZlIiwgYXJjaGl2ZWRGaWxlU2V0LmNvbnRhaW5zKCB3b3JrUGF0aCApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbmFtZSA9IHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRBcnRpZmFjdElkKCkgKyAiLSIgKyBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0VmVyc2lvbigpICsgIi4iICsKLSAgICAgICAgICAgIHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5nZXRUeXBlKCk7Ci0gICAgICAgIEZpbGUgd29ya1BhdGggPSBuZXcgRmlsZSggd29ya0RpciwgbmFtZSApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHByb2plY3QgaXMgdW5wYWNrZWQiLCB3b3JrUGF0aC5leGlzdHMoKSAmJiB3b3JrUGF0aC5pc0RpcmVjdG9yeSgpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHByb2plY3QgaXMgaW4gdGhlIGFyY2hpdmUiLCBhcmNoaXZlZEZpbGVTZXQuY29udGFpbnMoIHdvcmtQYXRoICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVNldCgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdEZpbGVTZXRzKCAiXHJcbiIgKTsKLQotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGV4ZWN1dGVNb2pvKCAiZmlsZVNldC1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZXJGaWxlcyA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBhcmNoaXZlIGFkZHMiLCBhcmNoaXZlckZpbGVzLnNpemUoKSwgMSApOwotCi0gICAgICAgIEZpbGUga2V5ID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQiICk7Ci0gICAgICAgIEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUgZmlsZSA9IChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlckZpbGVzLmdldCgga2V5ICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIlRlc3QgZXhwZWN0ZWQgRmlsZVNldCIsIGZpbGUgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggIlRlc3QgaW5jbHVkZXMiLCBmaWxlLmdldEluY2x1ZGVzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgZXhjbHVkZXMiLAotICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIEZpbGVVdGlscy5nZXREZWZhdWx0RXhjbHVkZXNBc0xpc3QoKS50b0FycmF5KCBuZXcgU3RyaW5nWzBdICksIGZpbGUuZ2V0RXhjbHVkZXMoKSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXRXaXRoQXJjaGl2ZUJhc2VEaXIoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZW5lcmF0ZVRlc3RGaWxlU2V0cyggIlxyXG4iICk7Ci0KLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBleGVjdXRlTW9qbyggImZpbGVTZXQtYXJjaGl2ZUJhc2VEaXItcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWFwIGFyY2hpdmVyRmlsZXMgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIlRlc3QgYXJjaGl2ZSBhZGRzIiwgYXJjaGl2ZXJGaWxlcy5zaXplKCksIDEgKTsKLQotICAgICAgICBGaWxlIGtleSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0IiApOwotICAgICAgICBKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlIGZpbGUgPSAoSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSkgYXJjaGl2ZXJGaWxlcy5nZXQoIGtleSApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoICJUZXN0IGV4cGVjdGVkIEZpbGVTZXQiLCBmaWxlICk7Ci0gICAgICAgIGFzc2VydE51bGwoICJUZXN0IGluY2x1ZGVzIiwgZmlsZS5nZXRJbmNsdWRlcygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGV4Y2x1ZGVzIiwKLSAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBGaWxlVXRpbHMuZ2V0RGVmYXVsdEV4Y2x1ZGVzQXNMaXN0KCkudG9BcnJheSggbmV3IFN0cmluZ1swXSApLCBmaWxlLmdldEV4Y2x1ZGVzKCkgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU2V0SW5jbHVkZXNFeGNsdWRlcygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdEZpbGVTZXRzKCAiXHJcbiIgKTsKLQotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGV4ZWN1dGVNb2pvKCAiZmlsZVNldC1pbmNsdWRlcy1leGNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZXJGaWxlcyA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBhcmNoaXZlIGFkZHMiLCBhcmNoaXZlckZpbGVzLnNpemUoKSwgMSApOwotCi0gICAgICAgIEZpbGUga2V5ID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQiICk7Ci0gICAgICAgIEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUgZmlsZSA9IChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlckZpbGVzLmdldCgga2V5ICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIlRlc3QgZXhwZWN0ZWQgRmlsZVNldCIsIGZpbGUgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaW5jbHVkZXMiLCBhc3NlcnRFcXVhbHMoIG5ldyBTdHJpbmdbXXsiKiovKi50eHQifSwgZmlsZS5nZXRJbmNsdWRlcygpICkgKTsKLQotICAgICAgICBMaXN0IGV4Y2x1ZGVzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgZXhjbHVkZXNMaXN0LmFkZCggIioqLyoueG1sIiApOwotICAgICAgICBleGNsdWRlc0xpc3QuYWRkQWxsKCBGaWxlVXRpbHMuZ2V0RGVmYXVsdEV4Y2x1ZGVzQXNMaXN0KCkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBleGNsdWRlcyIsIGFzc2VydEVxdWFscyggZXhjbHVkZXNMaXN0LnRvQXJyYXkoIG5ldyBTdHJpbmdbMF0gKSwgZmlsZS5nZXRFeGNsdWRlcygpICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVNldFVuaXhMaW5lRW5kaW5ncygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdEZpbGVTZXRzKCAiXHJcbiIgKTsKLQotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGV4ZWN1dGVNb2pvKCAiZmlsZVNldC11bml4LWxpbmVFbmRpbmdzLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlckZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGFyY2hpdmUgYWRkcyIsIGFyY2hpdmVyRmlsZXMuc2l6ZSgpLCAxICk7Ci0KLSAgICAgICAgRmlsZSBrZXkgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldCIgKTsKLSAgICAgICAgSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSBmaWxlID0gKEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUpIGFyY2hpdmVyRmlsZXMuZ2V0KCBrZXkgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggIlRlc3Qgb3JpZ2luYWwgRmlsZVNldCBpcyBub3QgaW4gYXJjaGl2ZSIsIGZpbGUgKTsKLQotICAgICAgICBGaWxlIHRlbXBSb290ID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAidGVtcFJvb3QiICk7Ci0gICAgICAgIEZpbGUgdGVtcERpciA9IChGaWxlKSBhcmNoaXZlckZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBkaXIgaXMgaW4gdGVtcFJvb3QiLCB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoIHRlbXBSb290LmdldEFic29sdXRlUGF0aCgpICkgKTsKLQotICAgICAgICBTdHJpbmcgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2hpYmVybmF0ZS5oYm0ueG1sIjsKLSAgICAgICAgU3RyaW5nIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPCAwICk7Ci0KLSAgICAgICAgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL0xJQ0VOU0UudHh0IjsKLSAgICAgICAgdW5peENvbnRlbnRzID0gRmlsZVV0aWxzLmZpbGVSZWFkKCBuZXdGaWxlICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1vZGlmaWVkIGZpbGUgZXhpc3RzIGluIHRlbXBSb290IiwgRmlsZVV0aWxzLmZpbGVFeGlzdHMoIG5ld0ZpbGUgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBhbGwgXFxyXFxuIGFyZSByZXBsYWNlZCIsIHVuaXhDb250ZW50cy5pbmRleE9mKCAiXHJcbiIgKSA8IDAgKTsKLQotICAgICAgICBuZXdGaWxlID0gdGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIvUkVBRE1FLnR4dCI7Ci0gICAgICAgIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPCAwICk7Ci0KLSAgICAgICAgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2NvbmZpZ3MvY29uZmlnLnR4dCI7Ci0gICAgICAgIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPCAwICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXRMRkxpbmVFbmRpbmdzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2VuZXJhdGVUZXN0RmlsZVNldHMoICJcclxuIiApOwotCi0gICAgICAgIEFzc2VtYmx5TW9qbyBtb2pvID0gZXhlY3V0ZU1vam8oICJmaWxlU2V0LWxmLWxpbmVFbmRpbmdzLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlckZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGFyY2hpdmUgYWRkcyIsIGFyY2hpdmVyRmlsZXMuc2l6ZSgpLCAxICk7Ci0KLSAgICAgICAgRmlsZSBrZXkgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldCIgKTsKLSAgICAgICAgSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSBmaWxlID0gKEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUpIGFyY2hpdmVyRmlsZXMuZ2V0KCBrZXkgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggIlRlc3Qgb3JpZ2luYWwgRmlsZVNldCBpcyBub3QgaW4gYXJjaGl2ZSIsIGZpbGUgKTsKLQotICAgICAgICBGaWxlIHRlbXBSb290ID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAidGVtcFJvb3QiICk7Ci0gICAgICAgIEZpbGUgdGVtcERpciA9IChGaWxlKSBhcmNoaXZlckZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBkaXIgaXMgaW4gdGVtcFJvb3QiLCB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoIHRlbXBSb290LmdldEFic29sdXRlUGF0aCgpICkgKTsKLQotICAgICAgICBTdHJpbmcgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2hpYmVybmF0ZS5oYm0ueG1sIjsKLSAgICAgICAgU3RyaW5nIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPCAwICk7Ci0KLSAgICAgICAgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL0xJQ0VOU0UudHh0IjsKLSAgICAgICAgdW5peENvbnRlbnRzID0gRmlsZVV0aWxzLmZpbGVSZWFkKCBuZXdGaWxlICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1vZGlmaWVkIGZpbGUgZXhpc3RzIGluIHRlbXBSb290IiwgRmlsZVV0aWxzLmZpbGVFeGlzdHMoIG5ld0ZpbGUgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBhbGwgXFxyXFxuIGFyZSByZXBsYWNlZCIsIHVuaXhDb250ZW50cy5pbmRleE9mKCAiXHJcbiIgKSA8IDAgKTsKLQotICAgICAgICBuZXdGaWxlID0gdGVtcERpci5nZXRBYnNvbHV0ZVBhdGgoKSArICIvUkVBRE1FLnR4dCI7Ci0gICAgICAgIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPCAwICk7Ci0KLSAgICAgICAgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2NvbmZpZ3MvY29uZmlnLnR4dCI7Ci0gICAgICAgIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPCAwICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXRET1NMaW5lRW5kaW5ncygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdEZpbGVTZXRzKCAiXG4iICk7Ci0KLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBleGVjdXRlTW9qbyggImZpbGVTZXQtZG9zLWxpbmVFbmRpbmdzLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlckZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGFyY2hpdmUgYWRkcyIsIGFyY2hpdmVyRmlsZXMuc2l6ZSgpLCAxICk7Ci0KLSAgICAgICAgRmlsZSBrZXkgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldCIgKTsKLSAgICAgICAgSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSBmaWxlID0gKEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUpIGFyY2hpdmVyRmlsZXMuZ2V0KCBrZXkgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggIlRlc3Qgb3JpZ2luYWwgRmlsZVNldCBpcyBub3QgaW4gYXJjaGl2ZSIsIGZpbGUgKTsKLQotICAgICAgICBGaWxlIHRlbXBSb290ID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAidGVtcFJvb3QiICk7Ci0gICAgICAgIEZpbGUgdGVtcERpciA9IChGaWxlKSBhcmNoaXZlckZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBkaXIgaXMgaW4gdGVtcFJvb3QiLCB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoIHRlbXBSb290LmdldEFic29sdXRlUGF0aCgpICkgKTsKLQotICAgICAgICBTdHJpbmcgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2hpYmVybmF0ZS5oYm0ueG1sIjsKLSAgICAgICAgU3RyaW5nIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPj0gMCApOwotCi0gICAgICAgIG5ld0ZpbGUgPSB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsgIi9MSUNFTlNFLnR4dCI7Ci0gICAgICAgIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPj0gMCApOwotCi0gICAgICAgIG5ld0ZpbGUgPSB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsgIi9SRUFETUUudHh0IjsKLSAgICAgICAgdW5peENvbnRlbnRzID0gRmlsZVV0aWxzLmZpbGVSZWFkKCBuZXdGaWxlICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1vZGlmaWVkIGZpbGUgZXhpc3RzIGluIHRlbXBSb290IiwgRmlsZVV0aWxzLmZpbGVFeGlzdHMoIG5ld0ZpbGUgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBhbGwgXFxyXFxuIGFyZSByZXBsYWNlZCIsIHVuaXhDb250ZW50cy5pbmRleE9mKCAiXHJcbiIgKSA+PSAwICk7Ci0KLSAgICAgICAgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2NvbmZpZ3MvY29uZmlnLnR4dCI7Ci0gICAgICAgIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPj0gMCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU2V0Q1JMRkxpbmVFbmRpbmdzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2VuZXJhdGVUZXN0RmlsZVNldHMoICJcbiIgKTsKLQotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGV4ZWN1dGVNb2pvKCAiZmlsZVNldC1jcmxmLWxpbmVFbmRpbmdzLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlckZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGFyY2hpdmUgYWRkcyIsIGFyY2hpdmVyRmlsZXMuc2l6ZSgpLCAxICk7Ci0KLSAgICAgICAgRmlsZSBrZXkgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldCIgKTsKLSAgICAgICAgSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSBmaWxlID0gKEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUpIGFyY2hpdmVyRmlsZXMuZ2V0KCBrZXkgKTsKLSAgICAgICAgYXNzZXJ0TnVsbCggIlRlc3Qgb3JpZ2luYWwgRmlsZVNldCBpcyBub3QgaW4gYXJjaGl2ZSIsIGZpbGUgKTsKLQotICAgICAgICBGaWxlIHRlbXBSb290ID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAidGVtcFJvb3QiICk7Ci0gICAgICAgIEZpbGUgdGVtcERpciA9IChGaWxlKSBhcmNoaXZlckZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBkaXIgaXMgaW4gdGVtcFJvb3QiLCB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpLnN0YXJ0c1dpdGgoIHRlbXBSb290LmdldEFic29sdXRlUGF0aCgpICkgKTsKLQotICAgICAgICBTdHJpbmcgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2hpYmVybmF0ZS5oYm0ueG1sIjsKLSAgICAgICAgU3RyaW5nIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPj0gMCApOwotCi0gICAgICAgIG5ld0ZpbGUgPSB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsgIi9MSUNFTlNFLnR4dCI7Ci0gICAgICAgIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPj0gMCApOwotCi0gICAgICAgIG5ld0ZpbGUgPSB0ZW1wRGlyLmdldEFic29sdXRlUGF0aCgpICsgIi9SRUFETUUudHh0IjsKLSAgICAgICAgdW5peENvbnRlbnRzID0gRmlsZVV0aWxzLmZpbGVSZWFkKCBuZXdGaWxlICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1vZGlmaWVkIGZpbGUgZXhpc3RzIGluIHRlbXBSb290IiwgRmlsZVV0aWxzLmZpbGVFeGlzdHMoIG5ld0ZpbGUgKSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBhbGwgXFxyXFxuIGFyZSByZXBsYWNlZCIsIHVuaXhDb250ZW50cy5pbmRleE9mKCAiXHJcbiIgKSA+PSAwICk7Ci0KLSAgICAgICAgbmV3RmlsZSA9IHRlbXBEaXIuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiL2NvbmZpZ3MvY29uZmlnLnR4dCI7Ci0gICAgICAgIHVuaXhDb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggbmV3RmlsZSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtb2RpZmllZCBmaWxlIGV4aXN0cyBpbiB0ZW1wUm9vdCIsIEZpbGVVdGlscy5maWxlRXhpc3RzKCBuZXdGaWxlICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYWxsIFxcclxcbiBhcmUgcmVwbGFjZWQiLCB1bml4Q29udGVudHMuaW5kZXhPZiggIlxyXG4iICkgPj0gMCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlU2V0SW52YWxpZExpbmVFbmRpbmdzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGV4ZWN1dGVNb2pvKCAiZmlsZVNldC1saW5lRW5kaW5ncy1leGNlcHRpb24tcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgICAgIGZhaWwoICJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIE1vam9GYWlsdXJlRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVTZXREaXJlY3RvcnlEb2VzbnRFeGlzdCgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGV4ZWN1dGVNb2pvKCAiZmlsZVNldC1kb2VzbnQtZXhpc3QtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZVNldFdpdGhOb0RpcmVjdG9yeUluQXNzZW1ibHlYbWwoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGV4ZWN1dGVNb2pvKCAiZmlsZVNldC1uby1kaXJlY3RvcnktcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgRmlsZSBiYXNlZGlyID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAiYmFzZWRpciIgKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZWRGaWxlcyA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIlRlc3QgaWYgYmFzZWRpciBpcyB1c2VkIHdoZW4gPGZpbGVTZXQ+PGRpcmVjdG9yeT4gaXMgbm90IGdpdmVuIiwgYXJjaGl2ZWRGaWxlcy5yZW1vdmUoIGJhc2VkaXIgKSApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIGZpbGVzIGFkZGVkIiwgYXJjaGl2ZWRGaWxlcy5pc0VtcHR5KCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUl0ZW0oKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZW5lcmF0ZVRlc3RGaWxlU2V0cyggIlxyXG4iICk7Ci0KLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBleGVjdXRlTW9qbyggImZpbGVJdGVtLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlckZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGFyY2hpdmUgZmlsZXMiLCAyLCBhcmNoaXZlckZpbGVzLnNpemUoKSApOwotCi0gICAgICAgIEl0ZXJhdG9yIGZpbGVzID0gYXJjaGl2ZXJGaWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpOwotCi0gICAgICAgIEZpbGUgYXJjaGl2ZWRGaWxlID0gKEZpbGUpIGZpbGVzLm5leHQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBhcmNoaXZlZCBmaWxlIGV4aXN0cyIsIGFyY2hpdmVkRmlsZS5leGlzdHMoKSApOwotCi0gICAgICAgIGlmICggIlJFQURNRS50eHQiLmVxdWFscyggYXJjaGl2ZWRGaWxlLmdldE5hbWUoKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gRmlsZVV0aWxzLmZpbGVSZWFkKCBhcmNoaXZlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLQotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgZmlsZSBmaWx0ZXJpbmcgaXMgZGlzYWJsZWQiLCBjb250ZW50cy5pbmRleE9mKCAiJHtwcm9qZWN0LmFydGlmYWN0SWR9IiApID49IDAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFyY2hpdmVkRmlsZSA9IChGaWxlKSBmaWxlcy5uZXh0KCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgYXJjaGl2ZWQgZmlsZSBleGlzdHMiLCBhcmNoaXZlZEZpbGUuZXhpc3RzKCkgKTsKLQotICAgICAgICBpZiAoICJSRUFETUUudHh0Ii5lcXVhbHMoIGFyY2hpdmVkRmlsZS5nZXROYW1lKCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBjb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggYXJjaGl2ZWRGaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGZpbGUgZmlsdGVyaW5nIGlzIGRpc2FibGVkIiwgY29udGVudHMuaW5kZXhPZiggIiR7cHJvamVjdC5hcnRpZmFjdElkfSIgKSA+PSAwICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUl0ZW1XaXRoT3V0cHV0TmFtZSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdEZpbGVTZXRzKCAiXHJcbiIgKTsKLQotICAgICAgICBleGVjdXRlTW9qbyggImZpbGVJdGVtLW91dHB1dC1uYW1lLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlckZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGFyY2hpdmUgZmlsZXMiLCAxLCBhcmNoaXZlckZpbGVzLnNpemUoKSApOwotCi0gICAgICAgIEZpbGUgYXJjaGl2ZWRGaWxlID0gKEZpbGUpIGFyY2hpdmVyRmlsZXMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0KLSAgICAgICAgSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSBmaWxlID0gKEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUpIGFyY2hpdmVyRmlsZXMuZ2V0KCBhcmNoaXZlZEZpbGUgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGFyY2hpdmUgZmlsZSBwYXRoIiwgImFzc2VtYmx5L291dHB1dC9SRUFEVEhJUy50eHQiLCBmaWxlLmdldE91dHB1dE5hbWUoKSApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGFyY2hpdmVkIGZpbGUgZXhpc3RzIiwgYXJjaGl2ZWRGaWxlLmV4aXN0cygpICk7Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gRmlsZVV0aWxzLmZpbGVSZWFkKCBhcmNoaXZlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBmaWxlIGZpbHRlcmluZyBpcyBkaXNhYmxlZCIsIGNvbnRlbnRzLmluZGV4T2YoICIke3Byb2plY3QuYXJ0aWZhY3RJZH0iICkgPj0gMCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlSXRlbVdpdGhGaWx0ZXJpbmcoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZW5lcmF0ZVRlc3RGaWxlU2V0cyggIlxyXG4iICk7Ci0KLSAgICAgICAgZXhlY3V0ZU1vam8oICJmaWxlSXRlbS1maWx0ZXJlZC1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZXJGaWxlcyA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBhcmNoaXZlIGZpbGVzIiwgMSwgYXJjaGl2ZXJGaWxlcy5zaXplKCkgKTsKLQotICAgICAgICBGaWxlIGFyY2hpdmVkRmlsZSA9IChGaWxlKSBhcmNoaXZlckZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGFyY2hpdmVkIGZpbGUgZXhpc3RzIiwgYXJjaGl2ZWRGaWxlLmV4aXN0cygpICk7Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gRmlsZVV0aWxzLmZpbGVSZWFkKCBhcmNoaXZlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBmaWxlIGZpbHRlcmluZyBpcyBlbmFibGVkIiwgY29udGVudHMuaW5kZXhPZiggIiR7cHJvamVjdC5hcnRpZmFjdElkfSIgKSA8IDAgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZUl0ZW1GaWx0ZXJpbmdXaXRoRmlsdGVyRmlsZSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdlbmVyYXRlVGVzdEZpbGVTZXRzKCAiXG4iICk7Ci0KLSAgICAgICAgRmlsZSBmaWx0ZXJGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQvZmlsdGVyRmlsZS5wcm9wZXJ0aWVzIiApOwotCi0gICAgICAgIFN0cmluZyBmaWxlQ29udGVudHMgPSAic2VudGVuY2U9VGhpcyBzZW50ZW5jZSBjYW1lIGZyb20gYSBmaWx0ZXIgZmlsZS4iOwotCi0gICAgICAgIEZpbGVVdGlscy5maWxlV3JpdGUoIGZpbHRlckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCksIGZpbGVDb250ZW50cyApOwotCi0gICAgICAgIGV4ZWN1dGVNb2pvKCAiZmlsZUl0ZW0tZmlsdGVyLWZpbGUtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWFwIGFyY2hpdmVyRmlsZXMgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIlRlc3QgYXJjaGl2ZSBmaWxlcyIsIDEsIGFyY2hpdmVyRmlsZXMuc2l6ZSgpICk7Ci0KLSAgICAgICAgRmlsZSBhcmNoaXZlZEZpbGUgPSAoRmlsZSkgYXJjaGl2ZXJGaWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBhcmNoaXZlZCBmaWxlIGV4aXN0cyIsIGFyY2hpdmVkRmlsZS5leGlzdHMoKSApOwotCi0gICAgICAgIFN0cmluZyBjb250ZW50cyA9IEZpbGVVdGlscy5maWxlUmVhZCggYXJjaGl2ZWRGaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgZmlsZSBmaWx0ZXJpbmcgZm9yICR7cHJvamVjdH0gaXMgZW5hYmxlZCIsIGNvbnRlbnRzLmluZGV4T2YoICIke3Byb2plY3QuYXJ0aWZhY3RJZH0iICkgPCAwICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgZmlsZSBmaWx0ZXJpbmcgZm9yICR7c2VudGVuY2V9IGlzIGVuYWJsZWQiLCBjb250ZW50cy5pbmRleE9mKCAiJHtzZW50ZW5jZX0iICkgPCAwICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbGVJdGVtTGluZUVuZGluZ3MoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBnZW5lcmF0ZVRlc3RGaWxlU2V0cyggIlxyXG4iICk7Ci0KLSAgICAgICAgZXhlY3V0ZU1vam8oICJmaWxlSXRlbS1saW5lRW5kaW5ncy1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZXJGaWxlcyA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBhcmNoaXZlIGZpbGVzIiwgMSwgYXJjaGl2ZXJGaWxlcy5zaXplKCkgKTsKLQotICAgICAgICBGaWxlIGFyY2hpdmVkRmlsZSA9IChGaWxlKSBhcmNoaXZlckZpbGVzLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGFyY2hpdmVkIGZpbGUgZXhpc3RzIiwgYXJjaGl2ZWRGaWxlLmV4aXN0cygpICk7Ci0KLSAgICAgICAgU3RyaW5nIGNvbnRlbnRzID0gRmlsZVV0aWxzLmZpbGVSZWFkKCBhcmNoaXZlZEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBmaWxlIGxpbmUgZW5kaW5ncyIsIGNvbnRlbnRzLmluZGV4T2YoICJcclxuIiApIDwgMCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWxlSXRlbUZpbGVNb2RlKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2VuZXJhdGVUZXN0RmlsZVNldHMoICJcclxuIiApOwotCi0gICAgICAgIGV4ZWN1dGVNb2pvKCAiZmlsZUl0ZW0tZmlsZU1vZGUtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWFwIGFyY2hpdmVyRmlsZXMgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIlRlc3QgYXJjaGl2ZSBmaWxlcyIsIDEsIGFyY2hpdmVyRmlsZXMuc2l6ZSgpICk7Ci0KLSAgICAgICAgRmlsZSBhcmNoaXZlZEZpbGUgPSAoRmlsZSkgYXJjaGl2ZXJGaWxlcy5rZXlTZXQoKS5pdGVyYXRvcigpLm5leHQoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBhcmNoaXZlZCBmaWxlIGV4aXN0cyIsIGFyY2hpdmVkRmlsZS5leGlzdHMoKSApOwotCi0gICAgICAgIEphckFyY2hpdmVyU3R1Yi5BcmNoaXZlckZpbGUgZmlsZSA9IChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlckZpbGVzLmdldCggYXJjaGl2ZWRGaWxlICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBmaWxlIG1vZGUiLCA3NzcsIGZpbGUuZ2V0RmlsZU1vZGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVTZXQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGdldE1vam8oICJtb2R1bGVTZXQtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgImV4ZWN1dGVkUHJvamVjdCIgKTsKLQotICAgICAgICBMaXN0IHJlYWN0b3JQcm9qZWN0c0xpc3QgPSAoTGlzdCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJyZWFjdG9yUHJvamVjdHMiICk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgcmVhY3RvclByb2plY3RzID0gcmVhY3RvclByb2plY3RzTGlzdC5pdGVyYXRvcigpOyByZWFjdG9yUHJvamVjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hdmVuUHJvamVjdCByZWFjdG9yUHJvamVjdCA9IChNYXZlblByb2plY3QpIHJlYWN0b3JQcm9qZWN0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIHJlYWN0b3JQcm9qZWN0LnNldFBhcmVudCggcHJvamVjdCApOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgYW4gYXJjaGl2ZSB3YXMgY3JlYXRlZCIsIEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldERlc3RGaWxlKCkuZXhpc3RzKCkgKTsKLQotICAgICAgICBGaWxlIHdvcmtEaXIgPSAoRmlsZSkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJ3b3JrRGlyZWN0b3J5IiApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlckZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBmb3IgKCBJdGVyYXRvciByZWFjdG9yUHJvamVjdHMgPSByZWFjdG9yUHJvamVjdHNMaXN0Lml0ZXJhdG9yKCk7IHJlYWN0b3JQcm9qZWN0cy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgTWF2ZW5Qcm9qZWN0IHJlYWN0b3JQcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgcmVhY3RvclByb2plY3RzLm5leHQoKTsKLQotICAgICAgICAgICAgRmlsZSB1bnBhY2tlZCA9IG5ldyBGaWxlKCB3b3JrRGlyLCByZWFjdG9yUHJvamVjdC5nZXRCdWlsZCgpLmdldEZpbmFsTmFtZSgpICk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiByZWFjdG9yIHByb2plY3Qgd2FzIHVucGFja2VkIGluIHdvcmsgZGlyZWN0b3J5IiwgdW5wYWNrZWQuZXhpc3RzKCkgKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHVucGFja2VkIGRpcmVjdG9yeSBpcyBpbiB0aGUgYXJjaGl2ZSIsIGFyY2hpdmVyRmlsZXMuY29udGFpbnNLZXkoIHVucGFja2VkICkgKTsKLSAgICAgICAgICAgIGFyY2hpdmVyRmlsZXMucmVtb3ZlKCB1bnBhY2tlZCApOwotCi0gICAgICAgICAgICBGaWxlIG1ldGFJbmYgPSBuZXcgRmlsZSggdW5wYWNrZWQsICJNRVRBLUlORiIgKTsKLSAgICAgICAgICAgIGlmICggbWV0YUluZi5leGlzdHMoKSAmJiBtZXRhSW5mLmxpc3RGaWxlcygpLmxlbmd0aCA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlc3RTaWduYXR1cmVGaWxlcyggbWV0YUluZiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlIHNyY0RpciA9IHJlYWN0b3JQcm9qZWN0LmdldEJhc2VkaXIoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHJlYWN0b3Igc291cmNlcyBpcyBpbiB0aGUgYXJjaGl2ZSIsIGFyY2hpdmVyRmlsZXMuY29udGFpbnNLZXkoIHNyY0RpciApICk7Ci0gICAgICAgICAgICBhcmNoaXZlckZpbGVzLnJlbW92ZSggc3JjRGlyICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIGFyY2hpdmUgZmlsZXMgYWRkZWQiLCAwLCBhcmNoaXZlckZpbGVzLnNpemUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVTZXRJbmNsdWRlcygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFJlYWN0b3JNYXZlblByb2plY3RTdHViLnJlYWN0b3JQcm9qZWN0cy5jbGVhcigpOwotCi0gICAgICAgIEFzc2VtYmx5TW9qbyBtb2pvID0gZ2V0TW9qbyggIm1vZHVsZVNldC1pbmNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IChNYXZlblByb2plY3QpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAiZXhlY3V0ZWRQcm9qZWN0IiApOwotCi0gICAgICAgIExpc3QgcmVhY3RvclByb2plY3RzTGlzdCA9IChMaXN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgInJlYWN0b3JQcm9qZWN0cyIgKTsKLQotICAgICAgICBmb3IgKCBJdGVyYXRvciByZWFjdG9yUHJvamVjdHMgPSByZWFjdG9yUHJvamVjdHNMaXN0Lml0ZXJhdG9yKCk7IHJlYWN0b3JQcm9qZWN0cy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgTWF2ZW5Qcm9qZWN0IHJlYWN0b3JQcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgcmVhY3RvclByb2plY3RzLm5leHQoKTsKLQotICAgICAgICAgICAgcmVhY3RvclByb2plY3Quc2V0UGFyZW50KCBwcm9qZWN0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBhbiBhcmNoaXZlIHdhcyBjcmVhdGVkIiwgQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RGVzdEZpbGUoKS5leGlzdHMoKSApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlckZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBGaWxlIHdvcmtEaXIgPSAoRmlsZSkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJ3b3JrRGlyZWN0b3J5IiApOwotCi0gICAgICAgIEZpbGUgdW5wYWNrZWQgPSBuZXcgRmlsZSggd29ya0RpciwgInJlYWN0b3ItcHJvamVjdC0xLTEuMC5qYXIiICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgcmVhY3RvciBwcm9qZWN0IHdhcyB1bnBhY2tlZCBpbiB3b3JrIGRpcmVjdG9yeSIsIHVucGFja2VkLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHVucGFja2VkIGRpcmVjdG9yeSBpcyBpbiB0aGUgYXJjaGl2ZSIsIGFyY2hpdmVyRmlsZXMuY29udGFpbnNLZXkoIHVucGFja2VkICkgKTsKLSAgICAgICAgYXJjaGl2ZXJGaWxlcy5yZW1vdmUoIHVucGFja2VkICk7Ci0KLSAgICAgICAgRmlsZSBtZXRhSW5mID0gbmV3IEZpbGUoIHVucGFja2VkLCAiTUVUQS1JTkYiICk7Ci0gICAgICAgIGlmICggbWV0YUluZi5leGlzdHMoKSAmJiBtZXRhSW5mLmxpc3RGaWxlcygpLmxlbmd0aCA+IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZXN0U2lnbmF0dXJlRmlsZXMoIG1ldGFJbmYgKTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgc3JjRGlyID0gbmV3IEZpbGUoIHdvcmtEaXIuZ2V0UGFyZW50RmlsZSgpLCAicmVhY3Rvci1wcm9qZWN0LTEiICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHJlYWN0b3IgcHJvamVjdCBzb3VyY2VzIGlzIGluIHRoZSBhcmNoaXZlIiwgYXJjaGl2ZXJGaWxlcy5jb250YWluc0tleSggc3JjRGlyICkgKTsKLSAgICAgICAgYXJjaGl2ZXJGaWxlcy5yZW1vdmUoIHNyY0RpciApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIlRlc3QgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIgYXJjaGl2ZSBmaWxlcyBhZGRlZCIsIDAsIGFyY2hpdmVyRmlsZXMuc2l6ZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZHVsZVNldEV4Y2x1ZGVzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIucmVhY3RvclByb2plY3RzLmNsZWFyKCk7Ci0KLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBnZXRNb2pvKCAibW9kdWxlU2V0LWV4Y2x1ZGVzLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJleGVjdXRlZFByb2plY3QiICk7Ci0KLSAgICAgICAgTGlzdCByZWFjdG9yUHJvamVjdHNMaXN0ID0gKExpc3QpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAicmVhY3RvclByb2plY3RzIiApOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIHJlYWN0b3JQcm9qZWN0cyA9IHJlYWN0b3JQcm9qZWN0c0xpc3QuaXRlcmF0b3IoKTsgcmVhY3RvclByb2plY3RzLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXZlblByb2plY3QgcmVhY3RvclByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSByZWFjdG9yUHJvamVjdHMubmV4dCgpOwotCi0gICAgICAgICAgICByZWFjdG9yUHJvamVjdC5zZXRQYXJlbnQoIHByb2plY3QgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGFuIGFyY2hpdmUgd2FzIGNyZWF0ZWQiLCBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXREZXN0RmlsZSgpLmV4aXN0cygpICk7Ci0KLSAgICAgICAgTWFwIGFyY2hpdmVyRmlsZXMgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIEZpbGUgd29ya0RpciA9IChGaWxlKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgIndvcmtEaXJlY3RvcnkiICk7Ci0KLSAgICAgICAgRmlsZSB1bnBhY2tlZCA9IG5ldyBGaWxlKCB3b3JrRGlyLCAicmVhY3Rvci1wcm9qZWN0LTItMS4wLmphciIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiByZWFjdG9yIHByb2plY3Qgd2FzIHVucGFja2VkIGluIHdvcmsgZGlyZWN0b3J5IiwgdW5wYWNrZWQuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgdW5wYWNrZWQgZGlyZWN0b3J5IGlzIGluIHRoZSBhcmNoaXZlIiwgYXJjaGl2ZXJGaWxlcy5jb250YWluc0tleSggdW5wYWNrZWQgKSApOwotICAgICAgICBhcmNoaXZlckZpbGVzLnJlbW92ZSggdW5wYWNrZWQgKTsKLQotICAgICAgICBGaWxlIG1ldGFJbmYgPSBuZXcgRmlsZSggdW5wYWNrZWQsICJNRVRBLUlORiIgKTsKLSAgICAgICAgaWYgKCBtZXRhSW5mLmV4aXN0cygpICYmIG1ldGFJbmYubGlzdEZpbGVzKCkubGVuZ3RoID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRlc3RTaWduYXR1cmVGaWxlcyggbWV0YUluZiApOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBzcmNEaXIgPSBuZXcgRmlsZSggd29ya0Rpci5nZXRQYXJlbnRGaWxlKCksICJyZWFjdG9yLXByb2plY3QtMiIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgcmVhY3RvciBwcm9qZWN0IHNvdXJjZXMgaXMgaW4gdGhlIGFyY2hpdmUiLCBhcmNoaXZlckZpbGVzLmNvbnRhaW5zS2V5KCBzcmNEaXIgKSApOwotICAgICAgICBhcmNoaXZlckZpbGVzLnJlbW92ZSggc3JjRGlyICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciBhcmNoaXZlIGZpbGVzIGFkZGVkIiwgMCwgYXJjaGl2ZXJGaWxlcy5zaXplKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlU2V0SW5jbHVkZURlcGVuZGVuY2llcygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VtYmx5TW9qbyBtb2pvID0gZ2V0TW9qbyggIm1vZHVsZVNldC1pbmNsdWRlLWRlcGVuZGVuY2llcy1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IChNYXZlblByb2plY3QpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAiZXhlY3V0ZWRQcm9qZWN0IiApOwotCi0gICAgICAgIExpc3QgcmVhY3RvclByb2plY3RzTGlzdCA9IChMaXN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgInJlYWN0b3JQcm9qZWN0cyIgKTsKLQotICAgICAgICBmb3IgKCBJdGVyYXRvciByZWFjdG9yUHJvamVjdHMgPSByZWFjdG9yUHJvamVjdHNMaXN0Lml0ZXJhdG9yKCk7IHJlYWN0b3JQcm9qZWN0cy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgTWF2ZW5Qcm9qZWN0IHJlYWN0b3JQcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgcmVhY3RvclByb2plY3RzLm5leHQoKTsKLQotICAgICAgICAgICAgcmVhY3RvclByb2plY3Quc2V0UGFyZW50KCBwcm9qZWN0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBhbiBhcmNoaXZlIHdhcyBjcmVhdGVkIiwgQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RGVzdEZpbGUoKS5leGlzdHMoKSApOwotCi0gICAgICAgIEZpbGUgd29ya0RpciA9IChGaWxlKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgIndvcmtEaXJlY3RvcnkiICk7Ci0KLSAgICAgICAgTWFwIGFyY2hpdmVyRmlsZXMgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIHJlYWN0b3JQcm9qZWN0cyA9IHJlYWN0b3JQcm9qZWN0c0xpc3QuaXRlcmF0b3IoKTsgcmVhY3RvclByb2plY3RzLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXZlblByb2plY3QgcmVhY3RvclByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSByZWFjdG9yUHJvamVjdHMubmV4dCgpOwotCi0gICAgICAgICAgICBGaWxlIHVucGFja2VkID0gbmV3IEZpbGUoIHdvcmtEaXIsIHJlYWN0b3JQcm9qZWN0LmdldEJ1aWxkKCkuZ2V0RmluYWxOYW1lKCkgKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHJlYWN0b3IgcHJvamVjdCBpcyB1bnBhY2tlZCBpbiB3b3JrIGRpcmVjdG9yeSIsIHVucGFja2VkLmV4aXN0cygpICk7Ci0gICAgICAgICAgICBGaWxlIGRlcGVuZGVuY3kgPSBuZXcgRmlsZSggdW5wYWNrZWQsICJyZWFjdG9yLWRlcGVuZGVuY3ktMS4wLmphci5leHRyYWN0ZWQiICk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiByZWFjdG9yIGRlcGVuZGVuY3kgaXMgYWxzbyB1bnBhY2tlZCIsIGRlcGVuZGVuY3kuZXhpc3RzKCkgKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHVucGFja2VkIGRpcmVjdG9yeSBpcyBpbiB0aGUgYXJjaGl2ZSIsIGFyY2hpdmVyRmlsZXMuY29udGFpbnNLZXkoIHVucGFja2VkICkgKTsKLSAgICAgICAgICAgIGFyY2hpdmVyRmlsZXMucmVtb3ZlKCB1bnBhY2tlZCApOwotCi0gICAgICAgICAgICBGaWxlIG1ldGFJbmYgPSBuZXcgRmlsZSggdW5wYWNrZWQsICJNRVRBLUlORiIgKTsKLSAgICAgICAgICAgIGlmICggbWV0YUluZi5leGlzdHMoKSAmJiBtZXRhSW5mLmxpc3RGaWxlcygpLmxlbmd0aCA+IDAgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlc3RTaWduYXR1cmVGaWxlcyggbWV0YUluZiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBGaWxlIHNyY0RpciA9IHJlYWN0b3JQcm9qZWN0LmdldEJhc2VkaXIoKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHJlYWN0b3Igc291cmNlcyBpcyBpbiB0aGUgYXJjaGl2ZSIsIGFyY2hpdmVyRmlsZXMuY29udGFpbnNLZXkoIHNyY0RpciApICk7Ci0gICAgICAgICAgICBhcmNoaXZlckZpbGVzLnJlbW92ZSggc3JjRGlyICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIGFyY2hpdmUgZmlsZXMgYWRkZWQiLCAwLCBhcmNoaXZlckZpbGVzLnNpemUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVTZXRQYWNrZWQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWFjdG9yTWF2ZW5Qcm9qZWN0U3R1Yi5yZWFjdG9yUHJvamVjdHMuY2xlYXIoKTsKLQotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGdldE1vam8oICJtb2R1bGVTZXQtcGFja2VkLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJleGVjdXRlZFByb2plY3QiICk7Ci0KLSAgICAgICAgTGlzdCByZWFjdG9yUHJvamVjdHNMaXN0ID0gKExpc3QpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAicmVhY3RvclByb2plY3RzIiApOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIHJlYWN0b3JQcm9qZWN0cyA9IHJlYWN0b3JQcm9qZWN0c0xpc3QuaXRlcmF0b3IoKTsgcmVhY3RvclByb2plY3RzLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXZlblByb2plY3QgcmVhY3RvclByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSByZWFjdG9yUHJvamVjdHMubmV4dCgpOwotCi0gICAgICAgICAgICByZWFjdG9yUHJvamVjdC5zZXRQYXJlbnQoIHByb2plY3QgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGFuIGFyY2hpdmUgd2FzIGNyZWF0ZWQiLCBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXREZXN0RmlsZSgpLmV4aXN0cygpICk7Ci0KLSAgICAgICAgTWFwIGFyY2hpdmVyRmlsZXMgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIEZpbGUgd29ya0RpciA9IChGaWxlKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgIndvcmtEaXJlY3RvcnkiICk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgcmVhY3RvclByb2plY3RzID0gcmVhY3RvclByb2plY3RzTGlzdC5pdGVyYXRvcigpOyByZWFjdG9yUHJvamVjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hdmVuUHJvamVjdCByZWFjdG9yUHJvamVjdCA9IChNYXZlblByb2plY3QpIHJlYWN0b3JQcm9qZWN0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCAiVGVzdCBpZiB3b3JrIGRpcmVjdG9yeSBpcyB1c2VkIiwgd29ya0Rpci5leGlzdHMoKSApOwotICAgICAgICAgICAgRmlsZSByZWFjdG9yUHJvamVjdEZpbGUgPSByZWFjdG9yUHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKTsKLSAgICAgICAgICAgIGFzc2VydE5vdE51bGwoICJUZXN0IGlmIHJlYWN0b3IgcHJvamVjdCBpcyBpbiB0aGUgYXJjaGl2ZSIsIGFyY2hpdmVyRmlsZXMucmVtb3ZlKCByZWFjdG9yUHJvamVjdEZpbGUgKSApOwotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0aWZhY3QgPSAoQXJ0aWZhY3QpIHJlYWN0b3JQcm9qZWN0LmdldEFydGlmYWN0cygpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgICAgICAgICAgRmlsZSBkZXBGaWxlID0gYXJ0aWZhY3QuZ2V0RmlsZSgpOwotICAgICAgICAgICAgYXNzZXJ0TnVsbCggIlRlc3QgaWYgcmVhY3RvciBkZXBlbmRlbmN5IGlzIG5vdCBpbiB0aGUgYXJjaGl2ZSIsIGFyY2hpdmVyRmlsZXMucmVtb3ZlKCBkZXBGaWxlICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIGFyY2hpdmUgZmlsZXMgYWRkZWQiLCBhcmNoaXZlckZpbGVzLmlzRW1wdHkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNb2R1bGVTZXRQYWNrZWRJbmNsdWRpbmdEZXBlbmRlbmNpZXMoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBSZWFjdG9yTWF2ZW5Qcm9qZWN0U3R1Yi5yZWFjdG9yUHJvamVjdHMuY2xlYXIoKTsKLQotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGdldE1vam8oICJtb2R1bGVTZXQtcGFja2VkLWluY2x1ZGluZy1kZXBlbmRlbmNpZXMtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgImV4ZWN1dGVkUHJvamVjdCIgKTsKLQotICAgICAgICBMaXN0IHJlYWN0b3JQcm9qZWN0c0xpc3QgPSAoTGlzdCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJyZWFjdG9yUHJvamVjdHMiICk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgcmVhY3RvclByb2plY3RzID0gcmVhY3RvclByb2plY3RzTGlzdC5pdGVyYXRvcigpOyByZWFjdG9yUHJvamVjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hdmVuUHJvamVjdCByZWFjdG9yUHJvamVjdCA9IChNYXZlblByb2plY3QpIHJlYWN0b3JQcm9qZWN0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIHJlYWN0b3JQcm9qZWN0LnNldFBhcmVudCggcHJvamVjdCApOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgYW4gYXJjaGl2ZSB3YXMgY3JlYXRlZCIsIEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldERlc3RGaWxlKCkuZXhpc3RzKCkgKTsKLQotICAgICAgICBNYXAgYXJjaGl2ZXJGaWxlcyA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgRmlsZSB3b3JrRGlyID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAid29ya0RpcmVjdG9yeSIgKTsKLQotICAgICAgICBmb3IgKCBJdGVyYXRvciByZWFjdG9yUHJvamVjdHMgPSByZWFjdG9yUHJvamVjdHNMaXN0Lml0ZXJhdG9yKCk7IHJlYWN0b3JQcm9qZWN0cy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgTWF2ZW5Qcm9qZWN0IHJlYWN0b3JQcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgcmVhY3RvclByb2plY3RzLm5leHQoKTsKLQotICAgICAgICAgICAgYXNzZXJ0RmFsc2UoICJUZXN0IGlmIHdvcmsgZGlyZWN0b3J5IGlzIHVzZWQiLCB3b3JrRGlyLmV4aXN0cygpICk7Ci0gICAgICAgICAgICBGaWxlIHJlYWN0b3JQcm9qZWN0RmlsZSA9IHJlYWN0b3JQcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCggIlRlc3QgaWYgcmVhY3RvciBwcm9qZWN0IGlzIGluIHRoZSBhcmNoaXZlIiwgYXJjaGl2ZXJGaWxlcy5yZW1vdmUoIHJlYWN0b3JQcm9qZWN0RmlsZSApICk7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IChBcnRpZmFjdCkgcmVhY3RvclByb2plY3QuZ2V0QXJ0aWZhY3RzKCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgICAgICBGaWxlIGRlcEZpbGUgPSBhcnRpZmFjdC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBhc3NlcnROb3ROdWxsKCAiVGVzdCBpZiByZWFjdG9yIGRlcGVuZGVuY3kgaXMgYWxzbyBpbiB0aGUgYXJjaGl2ZSIsIGFyY2hpdmVyRmlsZXMucmVtb3ZlKCBkZXBGaWxlICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIGFyY2hpdmUgZmlsZXMgYWRkZWQiLCBhcmNoaXZlckZpbGVzLmlzRW1wdHkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5KCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBleGVjdXRlTW9qbyggInJlcG9zaXRvcnktcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgRmlsZSB0ZW1wUm9vdCA9IChGaWxlKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgInRlbXBSb290IiApOwotCi0gICAgICAgIEZpbGUgdG1wUmVwb3NpdG9yeURpciA9IG5ldyBGaWxlKCB0ZW1wUm9vdCwgInJlcG9zaXRvcnkiICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHJlcG9zaXRvcnkgb3V0cHV0IGRpcmVjdG9yeSBpcyB1c2VkIiwgdG1wUmVwb3NpdG9yeURpci5leGlzdHMoKSApOwotCi0gICAgICAgIFN0cmluZyByZXBvUGF0aCA9ICJhc3NlbWJseS9kZXBlbmRlbmN5LWFydGlmYWN0LzEuMC9kZXBlbmRlbmN5LWFydGlmYWN0LTEuMC4iOwotCi0gICAgICAgIEZpbGUgdG1wQXJ0aWZhY3RKYXIgPSBuZXcgRmlsZSggdG1wUmVwb3NpdG9yeURpciwgcmVwb1BhdGggKyAiamFyIiApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBkZXBlbmRlbmN5IGFydGlmYWN0IGlzIGluIHJlcG9zaXRvcnkiLCB0bXBBcnRpZmFjdEphci5leGlzdHMoKSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtZDUgd2FzIGdlbmVyYXRlZCIsIG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJqYXIubWQ1IiApLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHNoYTEgd2FzIGdlbmVyYXRlZCIsIG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJqYXIuc2hhMSIgKS5leGlzdHMoKSApOwotCi0gICAgICAgIEZpbGUgdG1wQXJ0aWZhY3RQb20gPSBuZXcgRmlsZSggdG1wUmVwb3NpdG9yeURpciwgcmVwb1BhdGggKyAicG9tIiApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBkZXBlbmRlbmN5IGFydGlmYWN0IGlzIGluIHJlcG9zaXRvcnkiLCB0bXBBcnRpZmFjdFBvbS5leGlzdHMoKSApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtZDUgd2FzIGdlbmVyYXRlZCIsIG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJwb20ubWQ1IiApLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIHNoYTEgd2FzIGdlbmVyYXRlZCIsIG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJwb20uc2hhMSIgKS5leGlzdHMoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBvc2l0b3J5V2l0aE1ldGFkYXRhKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBleGVjdXRlTW9qbyggInJlcG9zaXRvcnktd2l0aC1tZXRhZGF0YS1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBGaWxlIHRlbXBSb290ID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAidGVtcFJvb3QiICk7Ci0KLSAgICAgICAgRmlsZSB0bXBSZXBvc2l0b3J5RGlyID0gbmV3IEZpbGUoIHRlbXBSb290LCAicmVwb3NpdG9yeSIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgcmVwb3NpdG9yeSBvdXRwdXQgZGlyZWN0b3J5IGlzIHVzZWQiLCB0bXBSZXBvc2l0b3J5RGlyLmV4aXN0cygpICk7Ci0KLSAgICAgICAgU3RyaW5nIHJlcG9QYXRoID0gImFzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4wL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4wLiI7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdEphciA9IG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJqYXIiICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGRlcGVuZGVuY3kgYXJ0aWZhY3QgaXMgaW4gcmVwb3NpdG9yeSIsIHRtcEFydGlmYWN0SmFyLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgImphci5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2hhMSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgImphci5zaGExIiApLmV4aXN0cygpICk7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdFBvbSA9IG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJwb20iICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGRlcGVuZGVuY3kgYXJ0aWZhY3QgaXMgaW4gcmVwb3NpdG9yeSIsIHRtcEFydGlmYWN0UG9tLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgInBvbS5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2hhMSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgInBvbS5zaGExIiApLmV4aXN0cygpICk7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdE1ldGFkYXRhZGlyID0gbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsICJhc3NlbWJseS9kZXBlbmRlbmN5LWFydGlmYWN0IiApOwotICAgICAgICBGaWxlIG1ldGFkYXRhWG1sID0gbmV3IEZpbGUoIHRtcEFydGlmYWN0TWV0YWRhdGFkaXIsICJtYXZlbi1tZXRhZGF0YS54bWwiICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1ldGFkYXRhIHdhcyBjcmVhdGVkIiwgbWV0YWRhdGFYbWwuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgbWV0YWRhdGEgbWQ1IHdhcyBnZW5lcmF0ZWQiLCBuZXcgRmlsZSggdG1wQXJ0aWZhY3RNZXRhZGF0YWRpciwgIm1hdmVuLW1ldGFkYXRhLnhtbC5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgbWV0YWRhdGEgbWQ1IHdhcyBnZW5lcmF0ZWQiLCBuZXcgRmlsZSggdG1wQXJ0aWZhY3RNZXRhZGF0YWRpciwgIm1hdmVuLW1ldGFkYXRhLnhtbC5zaGExIiApLmV4aXN0cygpICk7Ci0KLSAgICAgICAgbWV0YWRhdGFYbWwgPSBuZXcgRmlsZSggdG1wQXJ0aWZhY3RNZXRhZGF0YWRpciwgIm1hdmVuLW1ldGFkYXRhLWNlbnRyYWwueG1sIiApOwotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBpZiBtZXRhZGF0YSB3YXMgY3JlYXRlZCIsIG1ldGFkYXRhWG1sLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1ldGFkYXRhIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcEFydGlmYWN0TWV0YWRhdGFkaXIsICJtYXZlbi1tZXRhZGF0YS1jZW50cmFsLnhtbC5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgbWV0YWRhdGEgbWQ1IHdhcyBnZW5lcmF0ZWQiLCBuZXcgRmlsZSggdG1wQXJ0aWZhY3RNZXRhZGF0YWRpciwgIm1hdmVuLW1ldGFkYXRhLWNlbnRyYWwueG1sLnNoYTEiICkuZXhpc3RzKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwb3NpdG9yeUdyb3VwVmVyc2lvbkFsaWdubWVudCgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VtYmx5TW9qbyBtb2pvID0gZXhlY3V0ZU1vam8oICJyZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBGaWxlIHRlbXBSb290ID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAidGVtcFJvb3QiICk7Ci0KLSAgICAgICAgRmlsZSB0bXBSZXBvc2l0b3J5RGlyID0gbmV3IEZpbGUoIHRlbXBSb290LCAicmVwb3NpdG9yeSIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgcmVwb3NpdG9yeSBvdXRwdXQgZGlyZWN0b3J5IGlzIHVzZWQiLCB0bXBSZXBvc2l0b3J5RGlyLmV4aXN0cygpICk7Ci0KLSAgICAgICAgU3RyaW5nIHJlcG9QYXRoID0gImFzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4xL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4xLiI7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdEphciA9IG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJqYXIiICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGRlcGVuZGVuY3kgYXJ0aWZhY3QgaXMgaW4gcmVwb3NpdG9yeSIsIHRtcEFydGlmYWN0SmFyLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgImphci5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2hhMSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgImphci5zaGExIiApLmV4aXN0cygpICk7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdFBvbSA9IG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJwb20iICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGRlcGVuZGVuY3kgYXJ0aWZhY3QgaXMgaW4gcmVwb3NpdG9yeSIsIHRtcEFydGlmYWN0UG9tLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgInBvbS5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2hhMSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgInBvbS5zaGExIiApLmV4aXN0cygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlcG9zaXRvcnlHcm91cFZlcnNpb25BbGlnbm1lbnRFeGNsdWRlcygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VtYmx5TW9qbyBtb2pvID0gZXhlY3V0ZU1vam8oICJyZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1leGNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBGaWxlIHRlbXBSb290ID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAidGVtcFJvb3QiICk7Ci0KLSAgICAgICAgRmlsZSB0bXBSZXBvc2l0b3J5RGlyID0gbmV3IEZpbGUoIHRlbXBSb290LCAicmVwb3NpdG9yeSIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgcmVwb3NpdG9yeSBvdXRwdXQgZGlyZWN0b3J5IGlzIHVzZWQiLCB0bXBSZXBvc2l0b3J5RGlyLmV4aXN0cygpICk7Ci0KLSAgICAgICAgU3RyaW5nIHJlcG9QYXRoID0gImFzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4wL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4wLiI7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdEphciA9IG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJqYXIiICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGRlcGVuZGVuY3kgYXJ0aWZhY3QgaXMgaW4gcmVwb3NpdG9yeSIsIHRtcEFydGlmYWN0SmFyLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgImphci5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2hhMSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgImphci5zaGExIiApLmV4aXN0cygpICk7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdFBvbSA9IG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJwb20iICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGRlcGVuZGVuY3kgYXJ0aWZhY3QgaXMgaW4gcmVwb3NpdG9yeSIsIHRtcEFydGlmYWN0UG9tLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgInBvbS5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2hhMSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgInBvbS5zaGExIiApLmV4aXN0cygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1BU1NFTUJMWTk4KCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBleGVjdXRlTW9qbyggIk1BU1NFTUJMWS05OC1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBGaWxlIHRlbXBSb290ID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAidGVtcFJvb3QiICk7Ci0KLSAgICAgICAgRmlsZSB0bXBSZXBvc2l0b3J5RGlyID0gbmV3IEZpbGUoIHRlbXBSb290LCAicmVwb3NpdG9yeSIgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgcmVwb3NpdG9yeSBvdXRwdXQgZGlyZWN0b3J5IGlzIHVzZWQiLCB0bXBSZXBvc2l0b3J5RGlyLmV4aXN0cygpICk7Ci0KLSAgICAgICAgU3RyaW5nIHJlcG9QYXRoID0gImFzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4xL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4xLiI7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdEphciA9IG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJqYXIiICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGRlcGVuZGVuY3kgYXJ0aWZhY3QgaXMgaW4gcmVwb3NpdG9yeSIsIHRtcEFydGlmYWN0SmFyLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgImphci5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2hhMSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgImphci5zaGExIiApLmV4aXN0cygpICk7Ci0KLSAgICAgICAgRmlsZSB0bXBBcnRpZmFjdFBvbSA9IG5ldyBGaWxlKCB0bXBSZXBvc2l0b3J5RGlyLCByZXBvUGF0aCArICJwb20iICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGRlcGVuZGVuY3kgYXJ0aWZhY3QgaXMgaW4gcmVwb3NpdG9yeSIsIHRtcEFydGlmYWN0UG9tLmV4aXN0cygpICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIG1kNSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgInBvbS5tZDUiICkuZXhpc3RzKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2hhMSB3YXMgZ2VuZXJhdGVkIiwgbmV3IEZpbGUoIHRtcFJlcG9zaXRvcnlEaXIsIHJlcG9QYXRoICsgInBvbS5zaGExIiApLmV4aXN0cygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENvbXBvbmVudHMoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGV4ZWN1dGVNb2pvKCAiY29tcG9uZW50LXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIE1hcCBhcmNoaXZlZEZpbGVzID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IChNYXZlblByb2plY3QpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAicHJvamVjdCIgKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIlRlc3QgaWYgcHJvamVjdCBqYXIgaXMgaW4gYXJjaGl2ZSIsIGFyY2hpdmVkRmlsZXMucmVtb3ZlKCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpICkgKTsKLQotICAgICAgICBGaWxlIGZpbGVTZXREaXIgPSBuZXcgRmlsZSggUGxleHVzVGVzdENhc2UuZ2V0QmFzZWRpcigpLCAidGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0IiApOwotICAgICAgICBhc3NlcnROb3ROdWxsKCAiVGVzdCBpZiBGaWxlU2V0IGlzIGluIHRoZSBhcmNoaXZlIiwgYXJjaGl2ZWRGaWxlcy5yZW1vdmUoIGZpbGVTZXREaXIgKSApOwotCi0gICAgICAgIEZpbGUgcmVhZG1lID0gbmV3IEZpbGUoIFBsZXh1c1Rlc3RDYXNlLmdldEJhc2VkaXIoKSwgInRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldC9SRUFETUUudHh0IiApOwotICAgICAgICBhc3NlcnROb3ROdWxsKCAiVGVzdCBpZiBGaWxlSXRlbSBSRUFETUUudHh0IGlzIGluIHRoZSBhcmNoaXZlIiwgYXJjaGl2ZWRGaWxlcy5yZW1vdmUoIHJlYWRtZSApICk7Ci0KLSAgICAgICAgRmlsZSBsaWNlbnNlID0gbmV3IEZpbGUoIFBsZXh1c1Rlc3RDYXNlLmdldEJhc2VkaXIoKSwgInRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldC9MSUNFTlNFLnR4dCIgKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIlRlc3QgaWYgRmlsZUl0ZW0gTElDRU5TRS50eHQgaXMgaW4gdGhlIGFyY2hpdmUiLCBhcmNoaXZlZEZpbGVzLnJlbW92ZSggbGljZW5zZSApICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgdGhlcmUgYXJlIG5vIG1vcmUgZmlsZXMgaW4gdGhlIGFyY2hpdmUiLCBhcmNoaXZlZEZpbGVzLmlzRW1wdHkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGV4dXNDb21wb25lbnRzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSBwbGV4dXNEaXIgPSBuZXcgRmlsZSggYmFzZWRpciArICIvdGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0L01FVEEtSU5GL3BsZXh1cyIgKTsKLSAgICAgICAgcGxleHVzRGlyLm1rZGlycygpOwotICAgICAgICBTdHJpbmcgZmlsZUNvbnRlbnRzID0gIjxjb21wb25lbnQtc2V0PlxuICA8Y29tcG9uZW50cz5cbiAgICA8Y29tcG9uZW50PlxuICAgICAgPHJvbGU+Y2xhc3MuUm9sZTwvcm9sZT4iICsKLSAgICAgICAgICAgICJcbiAgICAgIDxpbXBsZW1lbnRhdGlvbj5jbGFzcy5JbXBsZW1lbnRhdGlvbjwvaW1wbGVtZW50YXRpb24+XG4gICAgPC9jb21wb25lbnQ+XG4gIDwvY29tcG9uZW50cz4iICsKLSAgICAgICAgICAgICJcbjwvY29tcG9uZW50LXNldD4iOwotICAgICAgICBGaWxlVXRpbHMuZmlsZVdyaXRlKCBuZXcgRmlsZSggcGxleHVzRGlyLCAiY29tcG9uZW50cy54bWwiICkuZ2V0QWJzb2x1dGVQYXRoKCksIGZpbGVDb250ZW50cyApOwotCi0gICAgICAgIEFzc2VtYmx5TW9qbyBtb2pvID0gZXhlY3V0ZU1vam8oICJwbGV4dXMtY29tcG9uZW50cy1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBNYXAgZmlsZXMgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIEZpbGUgZmlsZVNldERpciA9IG5ldyBGaWxlKCBQbGV4dXNUZXN0Q2FzZS5nZXRCYXNlZGlyKCkgKyAiL3RhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldCIgKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggIlRlc3QgaWYgRmlsZVNldCBpcyBpbiB0aGUgYXJjaGl2ZSIsIGZpbGVzLnJlbW92ZSggZmlsZVNldERpciApICk7Ci0KLSAgICAgICAgRmlsZSBjb21wb25lbnRYbWwgPSAoRmlsZSkgZmlsZXMua2V5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgICAgIGZpbGVzLnJlbW92ZSggY29tcG9uZW50WG1sICk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGlmIGNvbXBvbmVudFhtbCB0bXAgZmlsZSB3YXMgY3JlYXRlZCIsIGNvbXBvbmVudFhtbC5leGlzdHMoKSApOwotICAgICAgICBGaWxlUmVhZGVyIGZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlciggY29tcG9uZW50WG1sICk7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoICJUZXN0IGlmIGNvbXBvbmVudFhtbCBpcyBjb3JyZWN0bHkgY3JlYXRlZCIsIFhwcDNEb21CdWlsZGVyLmJ1aWxkKCBmaWxlUmVhZGVyICkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCB0aGVyZSBhcmUgbm8gbW9yZSBmaWxlcyBpbiB0aGUgYXJjaGl2ZSIsIGZpbGVzLmlzRW1wdHkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJbmNsdWRlU2l0ZURpcmVjdG9yeSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VtYmx5TW9qbyBtb2pvID0gZ2V0TW9qbyggImluY2x1ZGVTaXRlLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIEZpbGUgc2l0ZURpciA9IChGaWxlKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgInNpdGVEaXJlY3RvcnkiICk7Ci0KLSAgICAgICAgc2l0ZURpci5ta2RpcnMoKTsKLQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBhbiBhcmNoaXZlIHdhcyBjcmVhdGVkIiwgQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RGVzdEZpbGUoKS5leGlzdHMoKSApOwotCi0gICAgICAgIE1hcCBmaWxlcyA9IEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLmdldEZpbGVzKCk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaWYgc2l0ZSBkaXJlY3Rvcnkgd2FzIGFkZGVkIiwgZmlsZXMuY29udGFpbnNLZXkoIHNpdGVEaXIgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJHemlwQXJjaGl2ZSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGV4ZWN1dGVNb2pvKCAidGFyLWd6LXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIFRhckFyY2hpdmVyLlRhckNvbXByZXNzaW9uTWV0aG9kIG1ldGhvZCA9IChUYXJBcmNoaXZlci5UYXJDb21wcmVzc2lvbk1ldGhvZCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLCAidGFyQ29tcHJlc3Npb25NZXRob2QiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBUYXIgY29tcHJlc3Npb24gbWV0aG9kIiwgImd6aXAiLCBtZXRob2QuZ2V0VmFsdWUoKSApOwotCi0gICAgICAgIFRhckxvbmdGaWxlTW9kZSBsb25nRmlsZU1vZGUgPSAoVGFyTG9uZ0ZpbGVNb2RlKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIsICJsb25nRmlsZU1vZGUiICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgdGFyIGxvbmcgZmlsZSBtb2RlIGRlZmF1bHQiLCBsb25nRmlsZU1vZGUuaXNXYXJuTW9kZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRnekFyY2hpdmUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBleGVjdXRlTW9qbyggInRnei1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBUYXJBcmNoaXZlci5UYXJDb21wcmVzc2lvbk1ldGhvZCBtZXRob2QgPSAoVGFyQXJjaGl2ZXIuVGFyQ29tcHJlc3Npb25NZXRob2QpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1YiwgInRhckNvbXByZXNzaW9uTWV0aG9kIiApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIlRlc3QgVGFyIGNvbXByZXNzaW9uIG1ldGhvZCIsICJnemlwIiwgbWV0aG9kLmdldFZhbHVlKCkgKTsKLQotICAgICAgICBUYXJMb25nRmlsZU1vZGUgbG9uZ0ZpbGVNb2RlID0gKFRhckxvbmdGaWxlTW9kZSkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLCAibG9uZ0ZpbGVNb2RlIiApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IHRhciBsb25nIGZpbGUgbW9kZSBkZWZhdWx0IiwgbG9uZ0ZpbGVNb2RlLmlzV2Fybk1vZGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RUYXJCemlwMkFyY2hpdmUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBleGVjdXRlTW9qbyggInRhci1iejItcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgVGFyQXJjaGl2ZXIuVGFyQ29tcHJlc3Npb25NZXRob2QgbWV0aG9kID0gKFRhckFyY2hpdmVyLlRhckNvbXByZXNzaW9uTWV0aG9kKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIsICJ0YXJDb21wcmVzc2lvbk1ldGhvZCIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IFRhciBjb21wcmVzc2lvbiBtZXRob2QiLCAiYnppcDIiLCBtZXRob2QuZ2V0VmFsdWUoKSApOwotCi0gICAgICAgIFRhckxvbmdGaWxlTW9kZSBsb25nRmlsZU1vZGUgPSAoVGFyTG9uZ0ZpbGVNb2RlKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIsICJsb25nRmlsZU1vZGUiICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgdGFyIGxvbmcgZmlsZSBtb2RlIGRlZmF1bHQiLCBsb25nRmlsZU1vZGUuaXNGYWlsTW9kZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFRiejJBcmNoaXZlKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZXhlY3V0ZU1vam8oICJ0YnoyLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIFRhckFyY2hpdmVyLlRhckNvbXByZXNzaW9uTWV0aG9kIG1ldGhvZCA9IChUYXJBcmNoaXZlci5UYXJDb21wcmVzc2lvbk1ldGhvZCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLCAidGFyQ29tcHJlc3Npb25NZXRob2QiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGVzdCBUYXIgY29tcHJlc3Npb24gbWV0aG9kIiwgImJ6aXAyIiwgbWV0aG9kLmdldFZhbHVlKCkgKTsKLQotICAgICAgICBUYXJMb25nRmlsZU1vZGUgbG9uZ0ZpbGVNb2RlID0gKFRhckxvbmdGaWxlTW9kZSkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViLCAibG9uZ0ZpbGVNb2RlIiApOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IHRhciBsb25nIGZpbGUgbW9kZSBkZWZhdWx0IiwgbG9uZ0ZpbGVNb2RlLmlzRmFpbE1vZGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RXYXJBcmNoaXZlKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZXhlY3V0ZU1vam8oICJ3YXItcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgV2FyQXJjaGl2ZXJTdHViIGFyY2hpdmVyID0gKFdhckFyY2hpdmVyU3R1YikgQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWI7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoICJUZXN0IHRoYXQgd2ViLnhtbCBpcyBub3QgaWdub3JlZCIsIGFyY2hpdmVyLmdldElnbm9yZVdlYnhtbCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0RmlsZSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBjb250ZW50cyA9ICJNYW5pZmVzdC1WZXJzaW9uOiAxLjBcbiIgKyAiQXJjaGl2ZXItVmVyc2lvbjogUGxleHVzIEFyY2hpdmVyXG4iICsKLSAgICAgICAgICAgICJDcmVhdGVkLUJ5OiBBcGFjaGUgTWF2ZW5cbiIgKyAiQnVpbHQtQnk6IFVzZXJcbiIgKyAiQnVpbGQtSmRrOiAxLjQuMl8xMFxuIiArCi0gICAgICAgICAgICAiRXh0ZW5zaW9uLU5hbWU6IG1hdmVuLWFzc2VtYmx5LXBsdWdpblxuIiArICJTcGVjaWZpY2F0aW9uLVRpdGxlOiBNYXZlbiBQbHVnaW5zXG4iICsKLSAgICAgICAgICAgICJTcGVjaWZpY2F0aW9uLVZlbmRvcjogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25cbiIgKwotICAgICAgICAgICAgIkltcGxlbWVudGF0aW9uLVZlbmRvcjogQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb25cbiIgKyAiSW1wbGVtZW50YXRpb24tVGl0bGU6IG1hdmVuLWFzc2VtYmx5LXBsdWdpblxuIiArCi0gICAgICAgICAgICAiSW1wbGVtZW50YXRpb24tVmVyc2lvbjogMi4yLVNOQVBTSE9UIjsKLQotICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IG5ldyBGaWxlKCBQbGV4dXNUZXN0Q2FzZS5nZXRCYXNlZGlyKCkgKyAiL3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlL3Rlc3QtbWFuaWZlc3QuZmlsZSIgKTsKLQotICAgICAgICBtYW5pZmVzdEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotCi0gICAgICAgIEZpbGVVdGlscy5maWxlV3JpdGUoIG1hbmlmZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSwgY29udGVudHMgKTsKLQotICAgICAgICBleGVjdXRlTW9qbyggIm1hbmlmZXN0RmlsZS1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBKYXJBcmNoaXZlclN0dWIgYXJjaGl2ZXIgPSAoSmFyQXJjaGl2ZXJTdHViKSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1YjsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGlmIHByb3ZpZGVkIG1hbmlmZXN0IGlzIHVzZWQiLCBuZXcgTWFuaWZlc3QoIG5ldyBGaWxlUmVhZGVyKCBtYW5pZmVzdEZpbGUgKSApLCBhcmNoaXZlci5nZXRNYW5pZmVzdCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0KCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZXhlY3V0ZU1vam8oICJtYW5pZmVzdC1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBKYXJBcmNoaXZlclN0dWIgYXJjaGl2ZXIgPSAoSmFyQXJjaGl2ZXJTdHViKSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1YjsKLQotICAgICAgICBNYW5pZmVzdCBtYW5pZmVzdCA9IGFyY2hpdmVyLmdldE1hbmlmZXN0KCk7Ci0KLSAgICAgICAgbWFuaWZlc3Qud3JpdGUoIG5ldyBQcmludFdyaXRlciggU3lzdGVtLm91dCApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1hbmlmZXN0RmlsZU5vdEZvdW5kRXhjZXB0aW9uKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGV4ZWN1dGVNb2pvKCAibWFuaWZlc3RGaWxlLUZpbGVOb3RGb3VuZEV4Y2VwdGlvbi1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggTW9qb0ZhaWx1cmVFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGZvciBleHBlY3RlZCBleGNlcHRpb24iLCBlLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKCAiTWFuaWZlc3Qgbm90IGZvdW5kOiAiICkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbigpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBleGVjdXRlTW9qbyggIk5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgICAgICBmYWlsKCAiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgZm9yIGV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUuZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoICJVbmFibGUgdG8gb2J0YWluIGFyY2hpdmVyIGZvciBleHRlbnNpb24iICkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcmNoaXZlckV4Y2VwdGlvbk9uQWRkRGlyZWN0b3J5TWV0aG9kKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2VuZXJhdGVUZXN0RmlsZVNldHMoICJcbiIgKTsKLQotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGdldE1vam8oICJmaWxlU2V0LXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIEFyY2hpdmVyTWFuYWdlclN0dWIuYXJjaGl2ZXJTdHViID0gbmV3IEphckFyY2hpdmVyU3R1YigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggRmlsZSBmaWxlLCBTdHJpbmcgc3RyaW5nLCBTdHJpbmdbXSBpbmNsdWRlcywgU3RyaW5nW10gZXhjbHVkZXMgKQotICAgICAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbiggIkludGVudGlvbmFsIGV4Y2VwdGlvbiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgICAgIGZhaWwoICJFeHBlY3RlZCBleGNlcHRpb24gbm90IHRocm93biIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIE1vam9FeGVjdXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IHRocm93biBleGNlcHRpb24iLCBlLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKCAiRXJyb3IgYWRkaW5nIGRpcmVjdG9yeSB0byBhcmNoaXZlOiAiKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFyY2hpdmVyRXhjZXB0aW9uSW5Nb2R1bGVTZXQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlbWJseU1vam8gbW9qbyA9IGdldE1vam8oICJtb2R1bGVTZXQtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgImV4ZWN1dGVkUHJvamVjdCIgKTsKLQotICAgICAgICBMaXN0IHJlYWN0b3JQcm9qZWN0c0xpc3QgPSAoTGlzdCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJyZWFjdG9yUHJvamVjdHMiICk7Ci0KLSAgICAgICAgZm9yICggSXRlcmF0b3IgcmVhY3RvclByb2plY3RzID0gcmVhY3RvclByb2plY3RzTGlzdC5pdGVyYXRvcigpOyByZWFjdG9yUHJvamVjdHMuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hdmVuUHJvamVjdCByZWFjdG9yUHJvamVjdCA9IChNYXZlblByb2plY3QpIHJlYWN0b3JQcm9qZWN0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIHJlYWN0b3JQcm9qZWN0LnNldFBhcmVudCggcHJvamVjdCApOwotICAgICAgICB9Ci0KLSAgICAgICAgQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIgPSBuZXcgSmFyQXJjaGl2ZXJTdHViKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBGaWxlIGZpbGUsIFN0cmluZyBzdHJpbmcsIFN0cmluZ1tdIGluY2x1ZGVzLCBTdHJpbmdbXSBleGNsdWRlcyApCi0gICAgICAgICAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVyRXhjZXB0aW9uKCAiSW50ZW50aW9uYWwgZXhjZXB0aW9uIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIGV4Y2VwdGlvbiBub3QgdGhyb3duIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgdGhyb3duIGV4Y2VwdGlvbiIsIGUuZ2V0TWVzc2FnZSgpLnN0YXJ0c1dpdGgoICJFcnJvciBhZGRpbmcgZGlyZWN0b3J5IHRvIGFyY2hpdmU6ICIpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXR0YWNoZWRNb2pvKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTW9qbyBtb2pvID0gbG9va3VwTW9qbyggImF0dGFjaGVkIiwgYmFzZWRpciArICIvc3JjL3Rlc3QvcGx1Z2luLWNvbmZpZ3MvYXR0YWNoZWQvbWluLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOwotCi0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGFuIGFyY2hpdmUgd2FzIGNyZWF0ZWQiLCBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXREZXN0RmlsZSgpLmV4aXN0cygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEF0dGFjaGVkTW9qb0RlcGVuZGVuY3lTZXQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNb2pvIG1vam8gPSBsb29rdXBNb2pvKCAiYXR0YWNoZWQiLCBiYXNlZGlyICsgIi9zcmMvdGVzdC9wbHVnaW4tY29uZmlncy9hdHRhY2hlZC9kZXBTZXQtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgInByb2plY3QiICk7Ci0gICAgICAgIFNldCBhcnRpZmFjdFNldCA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0KLSAgICAgICAgTWFwIGFyY2hpdmVNYXAgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotICAgICAgICBDb2xsZWN0aW9uIGFyY2hpdmVkRmlsZXMgPSBhcmNoaXZlTWFwLmtleVNldCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIlRlc3QgbnVtYmVyIG9mIGZpbGVzIGluIGFyY2hpdmUiLCBhcnRpZmFjdFNldC5zaXplKCkgKyAxLCBhcmNoaXZlZEZpbGVzLnNpemUoKSApOwotCi0gICAgICAgIGZvciAoIEl0ZXJhdG9yIGFydGlmYWN0cyA9IGFydGlmYWN0U2V0Lml0ZXJhdG9yKCk7IGFydGlmYWN0cy5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgQXJ0aWZhY3QgZXhwZWN0ZWQgPSAoQXJ0aWZhY3QpIGFydGlmYWN0cy5uZXh0KCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoICJUZXN0IGV4cGVjdGVkIGRlcGVuZGVuY3kgYXJ0aWZhY3RzIGluIGFyY2hpdmUiLCBhcmNoaXZlZEZpbGVzLmNvbnRhaW5zKCBleHBlY3RlZC5nZXRGaWxlKCkgKSApOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgZXhwZWN0ZWQgZGVwZW5kZW5jeSBpcyBub3QgdW5wYWNrZWQiLCBleHBlY3RlZC5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVuZHNXaXRoKCAiLmphciIgKSApOwotCi0gICAgICAgICAgICBKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlIGFyY2hpdmVGaWxlID0KLSAgICAgICAgICAgICAgICAoSmFyQXJjaGl2ZXJTdHViLkFyY2hpdmVyRmlsZSkgYXJjaGl2ZU1hcC5nZXQoIGV4cGVjdGVkLmdldEZpbGUoKSApOwotICAgICAgICAgICAgU3RyaW5nIGFyY2hpdmVQYXRoID0gYXJjaGl2ZUZpbGUuZ2V0T3V0cHV0TmFtZSgpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgaW5jbHVkZUJhc2VEaXJlY3RvcnkiLCBhcmNoaXZlUGF0aC5zdGFydHNXaXRoKCAiYXNzZW1ibHkvIiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBwcm9qZWN0IGlzIGluIGFyY2hpdmUiLCBhcmNoaXZlZEZpbGVzLmNvbnRhaW5zKCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpICkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggIlRlc3QgcHJvamVjdCBpcyBub3QgdW5wYWNrZWQiLCBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpLmdldE5hbWUoKS5lbmRzV2l0aCggIi5qYXIiICkgKTsKLQotICAgICAgICBKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlIGFyY2hpdmVGaWxlID0KLSAgICAgICAgICAgIChKYXJBcmNoaXZlclN0dWIuQXJjaGl2ZXJGaWxlKSBhcmNoaXZlTWFwLmdldCggcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSApOwotICAgICAgICBTdHJpbmcgYXJjaGl2ZVBhdGggPSBhcmNoaXZlRmlsZS5nZXRPdXRwdXROYW1lKCk7Ci0gICAgICAgIGFzc2VydFRydWUoICJUZXN0IGluY2x1ZGVCYXNlRGlyZWN0b3J5IiwgYXJjaGl2ZVBhdGguc3RhcnRzV2l0aCggImFzc2VtYmx5LyIgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgQXNzZW1ibHlNb2pvIGdldE1vam8oIFN0cmluZyBwbHVnaW5YbWwgKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gKEFzc2VtYmx5TW9qbykgbG9va3VwTW9qbyggImFzc2VtYmx5IiwgYmFzZWRpciArICIvc3JjL3Rlc3QvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvIiArIHBsdWdpblhtbCApOwotICAgIH0KLQotICAgIHByaXZhdGUgQXNzZW1ibHlNb2pvIGV4ZWN1dGVNb2pvKCBTdHJpbmcgcGx1Z2luWG1sICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQXNzZW1ibHlNb2pvIG1vam8gPSBnZXRNb2pvKCBwbHVnaW5YbWwgKTsKLQotICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBhbiBhcmNoaXZlIHdhcyBjcmVhdGVkIiwgQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RGVzdEZpbGUoKS5leGlzdHMoKSApOwotCi0gICAgICAgIHJldHVybiBtb2pvOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBhc3NlcnRFcXVhbHMoIE9iamVjdFtdIG9iajEsIE9iamVjdFtdIG9iajIgKQotICAgIHsKLSAgICAgICAgYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotCi0gICAgICAgIGlmICggb2JqMS5sZW5ndGggPT0gb2JqMi5sZW5ndGggKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgY3RyID0gMDsgY3RyIDwgb2JqMS5sZW5ndGg7IGN0cisrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoICFvYmoxW2N0cl0uZXF1YWxzKCBvYmoyW2N0cl0gKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVxdWFsID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcXVhbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVUZXN0RmlsZVNldHMoIFN0cmluZyBsaW5lRW5kaW5nICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2VuZXJhdGVUZXN0RmlsZVNldHMoIGJhc2VkaXIsIGxpbmVFbmRpbmcgKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBnZW5lcmF0ZVRlc3RGaWxlU2V0cyggU3RyaW5nIGJhc2VkaXIsIFN0cmluZyBsaW5lRW5kaW5nICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGZpbGVTZXREaXIgPSBiYXNlZGlyICsgIi90YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQiOwotCi0gICAgICAgIC8qIGVuc3VyZSB0aGF0IHdlIHN0YXJ0IHdpdGggYSBmcmVzaCBkaXIsIGVsc2Ugd2UgZ2V0IGFsbCBtYW5uZXIgb2YgZHJvc3MgZnJvbSBvdGhlciB0ZXN0cyAqLwotICAgICAgICBGaWxlVXRpbHMuZGVsZXRlRGlyZWN0b3J5KGZpbGVTZXREaXIpOwotCi0gICAgICAgIEZpbGVVdGlscy5ta2RpciggZmlsZVNldERpciArICIvY29uZmlncyIgKTsKLQotICAgICAgICBTdHJpbmcgZmlsZUNvbnRlbnRzID0gIjxoaWJlcm5hdGU+IiArIGxpbmVFbmRpbmcgKyAiICA8aGliZXJuYXRlLW1hcHBpbmc+IiArIGxpbmVFbmRpbmcgKyAiICAgIDxjbGFzcy8+IiArCi0gICAgICAgICAgICBsaW5lRW5kaW5nICsgIiAgPC9oaWJlcm5hdGUtbWFwcGluZz4iICsgbGluZUVuZGluZyArICI8L2hpYmVybmF0ZT4iOwotICAgICAgICBGaWxlVXRpbHMuZmlsZVdyaXRlKCBmaWxlU2V0RGlyICsgIi9oaWJlcm5hdGUuaGJtLnhtbCIsIGZpbGVDb250ZW50cyApOwotCi0gICAgICAgIGZpbGVDb250ZW50cyA9ICJDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4iICsgbGluZUVuZGluZyArIGxpbmVFbmRpbmcgKwotICAgICAgICAgICAgIkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7IiArIGxpbmVFbmRpbmcgKwotICAgICAgICAgICAgInlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4iICsgbGluZUVuZGluZyArCi0gICAgICAgICAgICAiWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IiArIGxpbmVFbmRpbmcgKyBsaW5lRW5kaW5nICsKLSAgICAgICAgICAgICIgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCIgKyBsaW5lRW5kaW5nICsgbGluZUVuZGluZyArCi0gICAgICAgICAgICAiVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSIgKyBsaW5lRW5kaW5nICsKLSAgICAgICAgICAgICJkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsIiArIGxpbmVFbmRpbmcgKwotICAgICAgICAgICAgIldJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiIgKyBsaW5lRW5kaW5nICsKLSAgICAgICAgICAgICJTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIiArIGxpbmVFbmRpbmcgKwotICAgICAgICAgICAgImxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiI7Ci0gICAgICAgIEZpbGVVdGlscy5maWxlV3JpdGUoIGZpbGVTZXREaXIgKyAiL0xJQ0VOU0UudHh0IiwgZmlsZUNvbnRlbnRzICk7Ci0KLSAgICAgICAgZmlsZUNvbnRlbnRzID0gIlJlYWRtZSBmaWxlIHdpdGggb25seSBvbmUgbGluZSBmb3IgJHtwcm9qZWN0LmFydGlmYWN0SWR9LiAke3NlbnRlbmNlfSI7Ci0gICAgICAgIEZpbGVVdGlscy5maWxlV3JpdGUoIGZpbGVTZXREaXIgKyAiL1JFQURNRS50eHQiLCBmaWxlQ29udGVudHMgKTsKLQotICAgICAgICBmaWxlQ29udGVudHMgPSAic2FtcGxlIGNvbmZpZ3VyYXRpb24gZmlsZSBsaW5lIDEiICsgbGluZUVuZGluZyArICJzYW1wbGUgY29uZmlndXJhdGlvbiBmaWxlIGxpbmUgMiIgKwotICAgICAgICAgICAgbGluZUVuZGluZyArICJzYW1wbGUgY29uZmlndXJhdGlvbiBmaWxlIGxpbmUgMyIgKyBsaW5lRW5kaW5nICsgInNhbXBsZSBjb25maWd1cmF0aW9uIGZpbGUgbGluZSA0IjsKLSAgICAgICAgRmlsZVV0aWxzLmZpbGVXcml0ZSggZmlsZVNldERpciArICIvY29uZmlncy9jb25maWcudHh0IiwgZmlsZUNvbnRlbnRzICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RTaWduYXR1cmVGaWxlcyggRmlsZSBtZXRhSW5mICkKLSAgICB7Ci0gICAgICAgIEZpbGVbXSBtZXRhSW5mRmlsZXMgPSBtZXRhSW5mLmxpc3RGaWxlcygKLSAgICAgICAgICAgIG5ldyBGaWxlbmFtZUZpbHRlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nW10gc2lnbmF0dXJlRXh0ID0geyAiLnJzYSIsICIuZHNhIiwgIi5zZiIgfTsKLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFjY2VwdCggRmlsZSBkaXIsIFN0cmluZyBuYW1lICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoIGludCBpZHggPSAwOyBpZHggPCBzaWduYXR1cmVFeHQubGVuZ3RoOyBpZHgrKyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggbmFtZS50b0xvd2VyQ2FzZSgpLmVuZHNXaXRoKCBzaWduYXR1cmVFeHRbIGlkeCBdICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJUZXN0IGZvciBzaWduYXR1cmUgZmlsZXMiLCAwLCBtZXRhSW5mRmlsZXMubGVuZ3RoICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L0Jhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9CYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ZTBmYmUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L0Jhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0MiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkFydGlmYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLkFydGlmYWN0TWV0YWRhdGE7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5BcnRpZmFjdEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuQXJ0aWZhY3RWZXJzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5PdmVyQ29uc3RyYWluZWRWZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3RpbmcuQWJzdHJhY3RNb2pvVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5zdHVicy5NYXZlblByb2plY3RTdHViOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlVuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5kaWFncy5Ob09wQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLkFyY2hpdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5TdHJpbmdVdGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLldyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFRlc3QgY29tbW9uIGZlYXR1cmVzIG9mIGFsbCBhc3NlbWJseSBtb2pvcy4KLSAqIAotICogQHRvZG8gU3dpdGNoIHRvIHVzZSB0ZXN0LW9ubHkgbW9qb3MsIG9uY2Ugd2UgY2FuIGdlbmVyYXRlIGRlc2NyaXB0b3JzIGZvciB0aG9zZS4uLgotICovCi1wdWJsaWMgY2xhc3MgQmFzaWNBYnN0cmFjdEFzc2VtYmx5TW9qb0ZlYXR1cmVzVGVzdAotICAgIGV4dGVuZHMgQWJzdHJhY3RNb2pvVGVzdENhc2UKLXsKLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0T3V0cHV0RmlsZU5hbWVNYXBwaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHBsdWdpbkNvbmZpZyA9ICJvdXRwdXRGaWxlTmFtZU1hcHBpbmctcGx1Z2luQ29uZmlnLnhtbCI7Ci0gICAgICAgIAotICAgICAgICBMaXN0IHJlcXVpcmVkRGVwZW5kZW5jaWVzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAKLSAgICAgICAgcmVxdWlyZWREZXBlbmRlbmNpZXMuYWRkKCAiZGVwZW5kZW5jaWVzL3Rlc3QuamFyIiApOwotICAgICAgICByZXF1aXJlZERlcGVuZGVuY2llcy5hZGQoICJkZXBlbmRlbmNpZXMvdGVzdDIuamFyIiApOwotICAgICAgICAKLSAgICAgICAgTW9qbyBtb2pvID0gcnVuKCBwbHVnaW5Db25maWcsICJkaXJlY3RvcnktaW5saW5lIiApOwotICAgICAgICBhc3NlcnRGaWxlc0FkZGVkKCBtb2pvLCByZXF1aXJlZERlcGVuZGVuY2llcyApOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kdWxlU2V0U291cmNlSW5jbHVkZWRCaW5hcmllc05vdEluY2x1ZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHBsdWdpbkNvbmZpZyA9ICJtb2R1bGVTZXRTb3VyY2VJbmNsdWRlZEJpbmFyaWVzTm90SW5jbHVkZWQtcGx1Z2luQ29uZmlnLnhtbCI7Ci0gICAgICAgIAotICAgICAgICBNb2pvIG1vam8gPSBydW4oIHBsdWdpbkNvbmZpZywgImF0dGFjaGVkIiApOwotICAgICAgICAKLSAgICAgICAgTGlzdCByZXF1aXJlZCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoICJzb3VyY2VzL21vZHVsZTEvc3JjL21haW4vamF2YS9vcmcvdGVzdC9tb2R1bGUxL0FwcC5qYXZhIiApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RmlsZXNBZGRlZCggbW9qbywgcmVxdWlyZWQgKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBNb2pvIHJ1biggU3RyaW5nIHBsdWdpbkNvbmZpZywgU3RyaW5nIG1vam9OYW1lICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHBsdWdpbkNvbmZpZ1Jlc291cmNlID0gImJhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3QvIiArIHBsdWdpbkNvbmZpZzsKLSAgICAgICAgCi0gICAgICAgIEZpbGUgcGx1Z2luQ29uZmlnRmlsZSA9IG5ldyBGaWxlKCBnZXRCYXNlZGlyKCksICJzcmMvdGVzdC9wbHVnaW4tY29uZmlncy8iICsgcGx1Z2luQ29uZmlnUmVzb3VyY2UgKTsKLSAgICAgICAgCi0gICAgICAgIGFzc2VydFRydWUoICJDYW5ub3QgZmluZCBwbHVnaW4tY29uZmlndXJhdGlvbjogXCciICsgcGx1Z2luQ29uZmlnUmVzb3VyY2UgKyAiXCcgaW4gY29udGV4dC1jbGFzc2xvYWRlclwncyBjbGFzc3BhdGguIiwgcGx1Z2luQ29uZmlnRmlsZS5leGlzdHMoKSApOwotICAgICAgICAKLSAgICAgICAgLy8gVE9ETzogTmVlZCB0byByZXBsYWNlIHRoaXMgd2l0aCB0ZXN0LW9ubHkgbW9qb3MuLi4KLSAgICAgICAgTW9qbyBtb2pvID0gKE1vam8pIGxvb2t1cE1vam8oIG1vam9OYW1lLCBwbHVnaW5Db25maWdGaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0KLSAgICAgICAgRmlsZUxvZ2dpbmdBcmNoaXZlck1hbmFnZXJTdHViIGFyY2hpdmVyTWFuYWdlciA9IChGaWxlTG9nZ2luZ0FyY2hpdmVyTWFuYWdlclN0dWIpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAiYXJjaGl2ZXJNYW5hZ2VyIiApOwotICAgICAgICBhcmNoaXZlck1hbmFnZXIuY2xlYXJBcmNoaXZlcigpOwotICAgICAgICAKLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgcmV0dXJuIG1vam87Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydEZpbGVzQWRkZWQoIE1vam8gbW9qbywgTGlzdCByZXF1aXJlZERlcGVuZGVuY2llcyApIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGVMb2dnaW5nQXJjaGl2ZXJNYW5hZ2VyU3R1YiBhcmNoaXZlck1hbmFnZXIgPSAoRmlsZUxvZ2dpbmdBcmNoaXZlck1hbmFnZXJTdHViKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgImFyY2hpdmVyTWFuYWdlciIgKTsKLSAgICAgICAgCi0gICAgICAgIEZpbGVMb2dnaW5nQXJjaGl2ZXJTdHViIGFyY2hpdmVyID0gKEZpbGVMb2dnaW5nQXJjaGl2ZXJTdHViKSBhcmNoaXZlck1hbmFnZXIuZ2V0QXJjaGl2ZXIoIChGaWxlKW51bGwgKTsKLSAgICAgICAgCi0gICAgICAgIFNldCBhZGRlZEZpbGVzID0gYXJjaGl2ZXIuZ2V0QWRkZWRGaWxlcygpOwotICAgICAgICAKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiVGhlIGZvbGxvd2luZyBmaWxlcyB3ZXJlIGFkZGVkIHRvIHRoZSB0ZXN0IGFzc2VtYmx5OlxuIiArIGFkZGVkRmlsZXMudG9TdHJpbmcoKS5yZXBsYWNlKCcsJywgJ1xuJyApICk7Ci0gICAgICAgIAotICAgICAgICBmb3IgKCBJdGVyYXRvciBpdCA9IHJlcXVpcmVkRGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdGFyZ2V0UGF0aCA9IChTdHJpbmcpIGl0Lm5leHQoKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlJlcXVpcmVkIGRlcGVuZGVuY3kgcGF0aCBtaXNzaW5nOiBcJyIgKyB0YXJnZXRQYXRoICsgIlwnIiwgYWRkZWRGaWxlcy5jb250YWlucyggdGFyZ2V0UGF0aCApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCYXNlZGlyU2V0dGFibGVNYXZlblByb2plY3RTdHViIGV4dGVuZHMgTWF2ZW5Qcm9qZWN0U3R1YgotICAgIHsKLSAgICAgICAgCi0gICAgICAgIEZpbGUgYmFzZWRpcjsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldEJhc2VkaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gYmFzZWRpcjsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFzZWRpciggRmlsZSBiYXNlZGlyICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5iYXNlZGlyID0gYmFzZWRpcjsKLSAgICAgICAgfQotCi0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVMb2dnaW5nQXJjaGl2ZXJNYW5hZ2VyU3R1YgotICAgICAgICBpbXBsZW1lbnRzIEFyY2hpdmVyTWFuYWdlcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBGaWxlTG9nZ2luZ0FyY2hpdmVyU3R1YiBhcmNoaXZlclN0dWI7Ci0KLSAgICAgICAgcHVibGljIEFyY2hpdmVyIGdldEFyY2hpdmVyKCBTdHJpbmcgc3RyaW5nICkgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggYXJjaGl2ZXJTdHViID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyU3R1YiA9IG5ldyBGaWxlTG9nZ2luZ0FyY2hpdmVyU3R1YigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYXJjaGl2ZXJTdHViOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICB2b2lkIGNsZWFyQXJjaGl2ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlclN0dWIgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVuQXJjaGl2ZXIgZ2V0VW5BcmNoaXZlciggU3RyaW5nIGFyZzAgKSB0aHJvd3MgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBVbkFyY2hpdmVyIGdldFVuQXJjaGl2ZXIoIEZpbGUgYXJnMCApIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSAKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBBcmNoaXZlciBnZXRBcmNoaXZlciggRmlsZSBhcmcwICkgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9ICAgICAgICAgCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWxlTG9nZ2luZ0FyY2hpdmVyU3R1YgotICAgICAgICBleHRlbmRzIE5vT3BBcmNoaXZlcgotICAgIHsKLQotICAgICAgICBwcml2YXRlIFNldCBmaWxlcyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICAgIHByaXZhdGUgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlKCBGaWxlIGZpbGUsIFN0cmluZyB0YXJnZXRQYXRoLCBpbnQgbW9kZSApIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlcy5hZGQoIHRhcmdldFBhdGggKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoIEZpbGUgZmlsZSwgU3RyaW5nIHRhcmdldFBhdGggKSB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgZmlsZXMuYWRkKCB0YXJnZXRQYXRoICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU2V0IGdldEFkZGVkRmlsZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZXM7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggRmlsZSBkaXIgKSB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQWRkIGRpciAxIiApOwotICAgICAgICAgICAgYWRkRGlyZWN0b3J5XyggZGlyLCBudWxsLCBudWxsLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoIEZpbGUgZGlyLCBTdHJpbmcgcHJlZml4ICkgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkFkZCBkaXIgMiIgKTsKLSAgICAgICAgICAgIGFkZERpcmVjdG9yeV8oIGRpciwgcHJlZml4LCBudWxsLCBudWxsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoIEZpbGUgZGlyLCBTdHJpbmdbXSBpbmNsdWRlcywgU3RyaW5nW10gZXhjbHVkZXMgKSB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQWRkIGRpciAzIiApOwotICAgICAgICAgICAgYWRkRGlyZWN0b3J5XyggZGlyLCBudWxsLCBpbmNsdWRlcywgZXhjbHVkZXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggRmlsZSBkaXIsIFN0cmluZyBwcmVmaXgsIFN0cmluZ1tdIGluY2x1ZGVzLCBTdHJpbmdbXSBleGNsdWRlcyApIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJBZGQgZGlyIDMiICk7Ci0gICAgICAgICAgICBhZGREaXJlY3RvcnlfKCBkaXIsIHByZWZpeCwgaW5jbHVkZXMsIGV4Y2x1ZGVzICk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgdm9pZCBhZGREaXJlY3RvcnlfKCBGaWxlIGRpciwgU3RyaW5nIHByZWZpeCwgU3RyaW5nW10gaW5jbHVkZXMsIFN0cmluZ1tdIGV4Y2x1ZGVzICkgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZyBpbmNsdWRlID0gU3RyaW5nVXRpbHMuam9pbiggaW5jbHVkZXMsICIsIiApOwotICAgICAgICAgICAgICAgIFN0cmluZyBleGNsdWRlID0gU3RyaW5nVXRpbHMuam9pbiggZXhjbHVkZXMsICIsIiApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIFN0cmluZyBwcmVwZW5kID0gcHJlZml4OwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICggcHJlcGVuZCAhPSBudWxsICYmICFwcmVwZW5kLmVuZHNXaXRoKCAiLyIgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBwcmVwZW5kICs9ICIvIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiU2Nhbm5pbmc6ICIgKyBkaXIgKyAiXG53aXRoIGluY2x1ZGVzOiAiICsgaW5jbHVkZSArICJcbmFuZCBleGNsdWRlczogIiArIGV4Y2x1ZGUgKyAiXG5hbmQgcHJlcGVuZGluZyBkaXIgcHJlZml4OiAiICsgcHJlcGVuZCApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIExpc3QgZmlsZU5hbWVzID0gRmlsZVV0aWxzLmdldEZpbGVOYW1lcyggZGlyLCBpbmNsdWRlLCBleGNsdWRlLCBmYWxzZSApOwotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGZvciAoIEl0ZXJhdG9yIGl0ID0gZmlsZU5hbWVzLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAoU3RyaW5nKSBpdC5uZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZm4gPSBwcmVwZW5kICsgZGlyLmdldFBhdGgoKSArICIvIiArIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgIGZuLnJlcGxhY2UoICdcXCcsICcvJyApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQWRkaW5nOiAiICsgZm4gKTsKLSAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGZpbGVzLmFkZCggZm4gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbiggIkVycm9yIHNjYW5uaW5nIGZvciBmaWxlIG5hbWVzLiIsIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVHdvRGVwZW5kZW5jeVJlYWN0b3JQcm9qZWN0U3R1YgotICAgICAgICBleHRlbmRzIE1hdmVuUHJvamVjdFN0dWIKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwSWQgPSAib3JnLnRlc3QucHJvamVjdCI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFydGlmYWN0SWQgPSAidGVzdC1wcm9qZWN0IjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbiA9ICIxIjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnaW5nID0gImphciI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIHNjb3BlID0gImNvbXBpbGUiOwotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVwT25lQXJ0aWZhY3RJZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVwT25lR3JvdXBJZDsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVwT25lVmVyc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVwT25lVHlwZSA9ICJqYXIiOwotICAgICAgICBwcml2YXRlIFN0cmluZyBkZXBPbmVTY29wZSA9ICJjb21waWxlIjsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIGRlcE9uZUZpbGU7Ci0gICAgICAgIAotICAgICAgICBwcml2YXRlIFN0cmluZyBkZXBUd29BcnRpZmFjdElkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBkZXBUd29Hcm91cElkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBkZXBUd29WZXJzaW9uOwotICAgICAgICBwcml2YXRlIFN0cmluZyBkZXBUd29UeXBlID0gImphciI7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIGRlcFR3b1Njb3BlID0gImNvbXBpbGUiOwotICAgICAgICBwcml2YXRlIEZpbGUgZGVwVHdvRmlsZTsKLSAgICAgICAgcHJpdmF0ZSBMaW5rZWRIYXNoU2V0IGFydGlmYWN0czsKLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBTZXQgZ2V0QXJ0aWZhY3RzKCkKLSAgICAgICAgewotICAgICAgICAgICAgYXJ0aWZhY3RzID0gbmV3IExpbmtlZEhhc2hTZXQoKTsKLQotICAgICAgICAgICAgYWRkQXJ0aWZhY3QoIGRlcE9uZUdyb3VwSWQsIGRlcE9uZUFydGlmYWN0SWQsIGRlcE9uZVZlcnNpb24sIGRlcE9uZVR5cGUsIGRlcE9uZVNjb3BlLCBkZXBPbmVGaWxlICk7Ci0gICAgICAgICAgICBhZGRBcnRpZmFjdCggZGVwVHdvR3JvdXBJZCwgZGVwVHdvQXJ0aWZhY3RJZCwgZGVwVHdvVmVyc2lvbiwgZGVwVHdvVHlwZSwgZGVwVHdvU2NvcGUsIGRlcFR3b0ZpbGUgKTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgcmV0dXJuIGFydGlmYWN0czsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZEFydGlmYWN0KCBTdHJpbmcgZ3JvdXBJZCwgU3RyaW5nIGFydGlmYWN0SWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHNjb3BlLCBGaWxlIGZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnRpZmFjdCBhcnRpZmFjdCA9IG5ldyBIYW5kbGVyRXF1aXBwZWRBcnRpZmFjdFN0dWIoIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHR5cGUsIHNjb3BlICk7Ci0gICAgICAgICAgICBhcnRpZmFjdC5zZXRGaWxlKCBmaWxlICk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIGFydGlmYWN0cyAuYWRkKCBhcnRpZmFjdCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFydGlmYWN0IGdldEFydGlmYWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGVyRXF1aXBwZWRBcnRpZmFjdFN0dWIoIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHBhY2thZ2luZywgc2NvcGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHVibGljIFR3b0RlcGVuZGVuY3lSZWFjdG9yUHJvamVjdFN0dWIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBNb2RlbCBtb2RlbCA9IGdldE1vZGVsKCk7Ci0gICAgICAgICAgICBpZiggIG1vZGVsID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICAgICAgICBzZXRNb2RlbCggbW9kZWwgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG1vZGVsLmdldFByb3BlcnRpZXMoKTsKLSAgICAgICAgICAgIGlmICggcHJvcHMgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgICAgIG1vZGVsLnNldFByb3BlcnRpZXMoIHByb3BzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBIYW5kbGVyRXF1aXBwZWRBcnRpZmFjdFN0dWIgaW1wbGVtZW50cyBBcnRpZmFjdAotICAgIHsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyB0eXBlOwotICAgICAgICBwcml2YXRlIFN0cmluZyBhcnRpZmFjdElkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBncm91cElkOwotICAgICAgICBwcml2YXRlIFN0cmluZyB2ZXJzaW9uOwotICAgICAgICBwcml2YXRlIFN0cmluZyBjbGFzc2lmaWVyOwotICAgICAgICBwcml2YXRlIFN0cmluZyBzY29wZTsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIGZpbGU7Ci0KLSAgICAgICAgcHVibGljIEhhbmRsZXJFcXVpcHBlZEFydGlmYWN0U3R1YiggU3RyaW5nIGdyb3VwSWQsIFN0cmluZyBhcnRpZmFjdElkLCBTdHJpbmcgdmVyc2lvbiwgU3RyaW5nIHR5cGUsIFN0cmluZyBzY29wZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZ3JvdXBJZCA9IGdyb3VwSWQ7Ci0gICAgICAgICAgICB0aGlzLmFydGlmYWN0SWQgPSBhcnRpZmFjdElkOwotICAgICAgICAgICAgdGhpcy52ZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICB0aGlzLnNjb3BlID0gc2NvcGU7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHB1YmxpYyBIYW5kbGVyRXF1aXBwZWRBcnRpZmFjdFN0dWIoKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQXJ0aWZhY3RIYW5kbGVyIGdldEFydGlmYWN0SGFuZGxlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0SGFuZGxlciBoYW5kbGVyID0gbmV3IEFydGlmYWN0SGFuZGxlcigpCi0gICAgICAgICAgICB7Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzaWZpZXIoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzaWZpZXI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREaXJlY3RvcnkoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRFeHRlbnNpb24oKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImphdmEiOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnaW5nKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWRkZWRUb0NsYXNzcGF0aCgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGVzRGVwZW5kZW5jaWVzKCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIHJldHVybiBoYW5kbGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkTWV0YWRhdGEoIEFydGlmYWN0TWV0YWRhdGEgYXJnMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWIKLSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRBcnRpZmFjdElkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGFydGlmYWN0SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdCBnZXRBdmFpbGFibGVWZXJzaW9ucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCB2ZXJzaW9uICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhc2VWZXJzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHZlcnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzaWZpZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gY2xhc3NpZmllcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ3JvdXBJZCArICI6IiArIGFydGlmYWN0SWQgKyAiOiIgKyB0eXBlICsgIjoiICsgdmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBcnRpZmFjdEZpbHRlciBnZXREZXBlbmRlbmN5RmlsdGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdCBnZXREZXBlbmRlbmN5VHJhaWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RG93bmxvYWRVcmwoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBJZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBncm91cElkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBnZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpICsgIjoiICsgc2NvcGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbiBnZXRNZXRhZGF0YUxpc3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0UmVwb3NpdG9yeSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRTY29wZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzY29wZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBcnRpZmFjdFZlcnNpb24gZ2V0U2VsZWN0ZWRWZXJzaW9uKCkgdGhyb3dzIE92ZXJDb25zdHJhaW5lZFZlcnNpb25FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFZlcnNpb25SYW5nZSBnZXRWZXJzaW9uUmFuZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVmVyc2lvblJhbmdlLmNyZWF0ZUZyb21WZXJzaW9uKCB2ZXJzaW9uICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDbGFzc2lmaWVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNsYXNzaWZpZXIgIT0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzT3B0aW9uYWwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbGVhc2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc29sdmVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkVmVyc2lvbktub3duKCkgdGhyb3dzIE92ZXJDb25zdHJhaW5lZFZlcnNpb25FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NuYXBzaG90KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0VmVyc2lvbiggU3RyaW5nIGFyZzAgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdEhhbmRsZXIoIEFydGlmYWN0SGFuZGxlciBhcmcwICkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXJ0aWZhY3RJZCggU3RyaW5nIGFydGlmYWN0SWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmFydGlmYWN0SWQgPSBhcnRpZmFjdElkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXZhaWxhYmxlVmVyc2lvbnMoIExpc3QgYXJnMCApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEJhc2VWZXJzaW9uKCBTdHJpbmcgdmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZXBlbmRlbmN5RmlsdGVyKCBBcnRpZmFjdEZpbHRlciBhcmcwICkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGVwZW5kZW5jeVRyYWlsKCBMaXN0IGFyZzAgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREb3dubG9hZFVybCggU3RyaW5nIGFyZzAgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKCBGaWxlIGZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIGZpbGUuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoIGZpbGUgKTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKCAidGVzdCBhcnRpZmFjdCIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlcnJvciA9IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJDYW5ub3Qgd3JpdGUgdGVzdCBmaWxlOiAiICsgZmlsZSArICIuIFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yLmluaXRDYXVzZSggZSApOwotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIElPVXRpbC5jbG9zZSggd3JpdGVyICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0R3JvdXBJZCggU3RyaW5nIGdyb3VwSWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmdyb3VwSWQgPSBncm91cElkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVsZWFzZSggYm9vbGVhbiBhcmcwICkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVwb3NpdG9yeSggQXJ0aWZhY3RSZXBvc2l0b3J5IGFyZzAgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXNvbHZlZCggYm9vbGVhbiBhcmcwICkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZWRWZXJzaW9uKCBTdHJpbmcgdmVyc2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTY29wZSggU3RyaW5nIHNjb3BlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvbiggU3RyaW5nIHZlcnNpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmVyc2lvblJhbmdlKCBWZXJzaW9uUmFuZ2UgYXJnMCApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZlcnNpb24oIFN0cmluZyBhcmcwLCBBcnRpZmFjdFJlcG9zaXRvcnkgYXJnMSApCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKCBPYmplY3QgbyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T3B0aW9uYWwoIGJvb2xlYW4gb3B0aW9uYWwgKQotICAgICAgICB7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvRGlyZWN0b3J5SW5saW5lTW9qb1Rlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9EaXJlY3RvcnlJbmxpbmVNb2pvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2JiN2U2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9EaXJlY3RvcnlJbmxpbmVNb2pvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vam9zLkRpcmVjdG9yeUlubGluZU1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi50ZXN0aW5nLkFic3RyYWN0TW9qb1Rlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlJbmxpbmVNb2pvVGVzdAotZXh0ZW5kcyBBYnN0cmFjdE1vam9UZXN0Q2FzZQotewotICAgIHB1YmxpYyB2b2lkIHRlc3RBc3NlbWJseURpcmVjdG9yeSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgdGVzdFBvbSA9IG5ldyBGaWxlKCBnZXRCYXNlZGlyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL3Rlc3QvcGx1Z2luLWNvbmZpZ3MvZGlyZWN0b3J5LWlubGluZS9taW4tcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgRGlyZWN0b3J5SW5saW5lTW9qbyBtb2pvID0gKCBEaXJlY3RvcnlJbmxpbmVNb2pvICkgbG9va3VwTW9qbyggImRpcmVjdG9yeS1pbmxpbmUiLCB0ZXN0UG9tICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggbW9qbyApOwotCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOwotCi0gICAgICAgIE1hcCBmaWxlc0FyY2hpdmVkID0gQXJjaGl2ZXJNYW5hZ2VyU3R1Yi5hcmNoaXZlclN0dWIuZ2V0RmlsZXMoKTsKLQotICAgICAgICBTZXQgZmlsZXMgPSBmaWxlc0FyY2hpdmVkLmtleVNldCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggMSwgZmlsZXMuc2l6ZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlcGVuZGVuY3lTZXQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZSggZ2V0QmFzZWRpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy90ZXN0L3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS1pbmxpbmUvZGVwZW5kZW5jeS1zZXQtcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgRGlyZWN0b3J5SW5saW5lTW9qbyBtb2pvID0gKCBEaXJlY3RvcnlJbmxpbmVNb2pvICkgbG9va3VwTW9qbyggImRpcmVjdG9yeS1pbmxpbmUiLCB0ZXN0UG9tICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggbW9qbyApOwotCi0gICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gKCBNYXZlblByb2plY3QgKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgInByb2plY3QiICk7Ci0KLSAgICAgICAgU2V0IGFydGlmYWN0cyA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgTWFwIGZpbGVzQXJjaGl2ZWQgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIFNldCBmaWxlcyA9IGZpbGVzQXJjaGl2ZWQua2V5U2V0KCk7Ci0KLSAgICAgICAgZm9yKCBJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKCBBcnRpZmFjdCApIGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCBmaWxlcy5jb250YWlucyggYXJ0aWZhY3QuZ2V0RmlsZSgpICkgKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIGFydGlmYWN0LmdldEZpbGUoKS5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBwcm9qZWN0IGlzIGluIGFyY2hpdmUiLCBmaWxlcy5jb250YWlucyggcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSApICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L0RpcmVjdG9yeU1vam9UZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvRGlyZWN0b3J5TW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E3MWI4ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvRGlyZWN0b3J5TW9qb1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5OwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2pvcy5EaXJlY3RvcnlNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5BYnN0cmFjdE1vam9UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBAYXV0aG9yIEFsbGFuIFEuIFJhbWlyZXoKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeU1vam9UZXN0Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vam9UZXN0Q2FzZQotewotICAgIHB1YmxpYyB2b2lkIHRlc3RFbnZpcm9ubWVudCgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgdGVzdFBvbSA9IG5ldyBGaWxlKCBnZXRCYXNlZGlyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3JjL3Rlc3QvcGx1Z2luLWNvbmZpZ3MvZGlyZWN0b3J5L21pbi1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBEaXJlY3RvcnlNb2pvIG1vam8gPSAoIERpcmVjdG9yeU1vam8gKSBsb29rdXBNb2pvKCAiZGlyZWN0b3J5IiwgdGVzdFBvbSApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIG1vam8gKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzZW1ibHlEaXJlY3RvcnkoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZSggZ2V0QmFzZWRpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy90ZXN0L3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS9taW4tcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgRGlyZWN0b3J5TW9qbyBtb2pvID0gKCBEaXJlY3RvcnlNb2pvICkgbG9va3VwTW9qbyggImRpcmVjdG9yeSIsIHRlc3RQb20gKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCBtb2pvICk7Ci0KLSAgICAgICAgQXNzZW1ibHlNb2pvVGVzdC5nZW5lcmF0ZVRlc3RGaWxlU2V0cyhnZXRCYXNlZGlyKCksICJcbiIpOwotICAgICAgICAKLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgTWFwIGZpbGVzQXJjaGl2ZWQgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIFNldCBmaWxlcyA9IGZpbGVzQXJjaGl2ZWQua2V5U2V0KCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBmaWxlcy5zaXplKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXNzZW1ibHlEaXJlY3RvcnlXaXRoQXBwZW5kQXNzZW1ibHlJZEFzRmFsc2UoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZSggZ2V0QmFzZWRpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy90ZXN0L3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS9hcHBlbmRBc3NlbWJseUlkLWZhbHNlLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgIERpcmVjdG9yeU1vam8gbW9qbyA9ICggRGlyZWN0b3J5TW9qbyApIGxvb2t1cE1vam8oICJkaXJlY3RvcnkiLCB0ZXN0UG9tICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggbW9qbyApOwotCi0gICAgICAgIFN0cmluZyBjbGFzc2lmaWVyID0gKCBTdHJpbmcgKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgImNsYXNzaWZpZXIiICk7Ci0KLSAgICAgICAgU3RyaW5nIGZpbmFsTmFtZSA9ICggU3RyaW5nICkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJmaW5hbE5hbWUiICk7Ci0KLSAgICAgICAgRmlsZSBvdXRwdXREaXIgPSAoIEZpbGUgKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgIm91dHB1dERpcmVjdG9yeSIgKTsKLQotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9ICggTWF2ZW5Qcm9qZWN0ICkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJleGVjdXRlZFByb2plY3QiICk7Ci0KLSAgICAgICAgU2V0IGFydGlmYWN0cyA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgRmlsZSBkaXIgPSBuZXcgRmlsZSggb3V0cHV0RGlyLCBmaW5hbE5hbWUgKyAiLSIgKyBjbGFzc2lmaWVyICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggZGlyLmV4aXN0cygpICk7Ci0KLSAgICAgICAgTWFwIGZpbGVzQXJjaGl2ZWQgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIFNldCBmaWxlcyA9IGZpbGVzQXJjaGl2ZWQua2V5U2V0KCk7Ci0KLSAgICAgICAgZm9yKCBJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKCBBcnRpZmFjdCApIGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCBmaWxlcy5jb250YWlucyggYXJ0aWZhY3QuZ2V0RmlsZSgpICkgKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIGFydGlmYWN0LmdldEZpbGUoKS5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBwcm9qZWN0IGlzIGluIGFyY2hpdmUiLCBmaWxlcy5jb250YWlucyggcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc2VtYmx5RGlyZWN0b3J5V2l0aERlcGVuZGVuY3lTZXQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHRlc3RQb20gPSBuZXcgRmlsZSggZ2V0QmFzZWRpcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNyYy90ZXN0L3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS9kZXBlbmRlbmN5LXNldC1wbHVnaW4tY29uZmlnLnhtbCIgKTsKLQotICAgICAgICBEaXJlY3RvcnlNb2pvIG1vam8gPSAoIERpcmVjdG9yeU1vam8gKSBsb29rdXBNb2pvKCAiZGlyZWN0b3J5IiwgdGVzdFBvbSApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIG1vam8gKTsKLQotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9ICggTWF2ZW5Qcm9qZWN0ICkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJleGVjdXRlZFByb2plY3QiICk7Ci0KLSAgICAgICAgU2V0IGFydGlmYWN0cyA9IHByb2plY3QuZ2V0QXJ0aWZhY3RzKCk7Ci0KLSAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgTWFwIGZpbGVzQXJjaGl2ZWQgPSBBcmNoaXZlck1hbmFnZXJTdHViLmFyY2hpdmVyU3R1Yi5nZXRGaWxlcygpOwotCi0gICAgICAgIFNldCBmaWxlcyA9IGZpbGVzQXJjaGl2ZWQua2V5U2V0KCk7Ci0KLSAgICAgICAgZm9yKCBJdGVyYXRvciBpdGVyID0gYXJ0aWZhY3RzLml0ZXJhdG9yKCk7IGl0ZXIuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKCBBcnRpZmFjdCApIGl0ZXIubmV4dCgpOwotCi0gICAgICAgICAgICBhc3NlcnRUcnVlKCBmaWxlcy5jb250YWlucyggYXJ0aWZhY3QuZ2V0RmlsZSgpICkgKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIGFydGlmYWN0LmdldEZpbGUoKS5nZXROYW1lKCkuZW5kc1dpdGgoICIuamFyIiApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBwcm9qZWN0IGlzIGluIGFyY2hpdmUiLCBmaWxlcy5jb250YWlucyggcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFzc2VtYmx5RGlyZWN0b3J5VG9UaHJvd05vU3VjaEFyY2hpdmVyRXhjZXB0aW9uKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSB0ZXN0UG9tID0gbmV3IEZpbGUoIGdldEJhc2VkaXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcmMvdGVzdC9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnkvbWluLXBsdWdpbi1jb25maWctd2l0aC1leGNlcHRpb25zLnhtbCIgKTsKLQotICAgICAgICBEaXJlY3RvcnlNb2pvIG1vam8gPSAoIERpcmVjdG9yeU1vam8gKSBsb29rdXBNb2pvKCAiZGlyZWN0b3J5IiwgdGVzdFBvbSApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIG1vam8gKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbW9qby5leGVjdXRlKCk7Ci0KLSAgICAgICAgICAgIGZhaWwoICJGYWlsdXJlIEV4cGVjdGVkIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoKCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vZXhwZWN0ZWQKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9VbnBhY2tNb2pvVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L1VucGFja01vam9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YTNmODAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L1VucGFja01vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseTsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2pvcy5VbnBhY2tNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuVW5BcmNoaXZlcldpdGhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5BYnN0cmFjdE1vam9UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuUGxleHVzVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLk5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEBhdXRob3IgRWR3aW4gUHVuemFsYW4KLSAqLwotcHVibGljIGNsYXNzIFVucGFja01vam9UZXN0Ci0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vam9UZXN0Q2FzZQotewotICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5Db25maWd1cmF0aW9uKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZXhlY3V0ZU1vam8oICJtaW4tcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1pbkNvbmZpZ3VyYXRpb25BZ2FpbldpdGhvdXRDbGVhbigpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGV4ZWN1dGVNb2pvKCAibWluLXBsdWdpbi1jb25maWcueG1sIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNaW5Db25maWd1cmF0aW9uV2l0aFJlYWN0b3JQcm9qZWN0cygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGV4ZWN1dGVNb2pvKCAid2l0aC1yZWFjdG9yLXByb2plY3RzLXBsdWdpbi1jb25maWcueG1sIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBcmNoaXZlck1hbmFnZXJFeGNlcHRpb24oKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVW5wYWNrTW9qbyBtb2pvID0gZ2V0TW9qbyggImFyY2hpdmVyLW1hbmFnZXItZXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sIiApOwotCi0gICAgICAgICAgICBtb2pvLmV4ZWN1dGUoKTsKLQotICAgICAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgInByb2plY3QiICk7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpLmdldE5hbWUoKTsKLSAgICAgICAgICAgIFN0cmluZyBkaXIgPSBmaWxlbmFtZS5zdWJzdHJpbmcoIDAsIGZpbGVuYW1lLmxhc3RJbmRleE9mKCAnLicgKSApOwotICAgICAgICAgICAgRmlsZSB3b3JrRGlyID0gKEZpbGUpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAid29ya0RpcmVjdG9yeSIgKTsKLSAgICAgICAgICAgIEZpbGUgdW5wYWNrRGlyID0gbmV3IEZpbGUoIHdvcmtEaXIsIGRpciApOwotICAgICAgICAgICAgRmlsZSB1bnBhY2tlZCA9IG5ldyBGaWxlKCB1bnBhY2tEaXIsIGZpbGVuYW1lICsgIi5leHRyYWN0ZWQiICk7Ci0KLSAgICAgICAgICAgIGFzc2VydEZhbHNlKCAiVGVzdCBleHRyYWN0ZWQgcHJvamVjdCBhcnRpZmFjdCIsIHVucGFja2VkLmV4aXN0cygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIGV4Y2VwdGlvbiBpbiBBcmNoaXZlck1hbmFnZXIgc2hvdWxkIG5vdCBmYWlsIHRoZSBidWlsZCIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RVbnBhY2tFeGNlcHRpb24oKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVW5wYWNrTW9qbyBtb2pvID0gZ2V0TW9qbyggInVucGFjay1leGNlcHRpb24tcGx1Z2luLWNvbmZpZy54bWwiICk7Ci0KLSAgICAgICAgICAgIEFyY2hpdmVyTWFuYWdlclN0dWIgYXJjaGl2ZXJNYW5hZ2VyID0gKEFyY2hpdmVyTWFuYWdlclN0dWIpIGdldFZhcmlhYmxlVmFsdWVGcm9tT2JqZWN0KCBtb2pvLCAiYXJjaGl2ZXJNYW5hZ2VyIiApOwotICAgICAgICAgICAgYXJjaGl2ZXJNYW5hZ2VyLnNldFVuQXJjaGl2ZXIoIG5ldyBVbkFyY2hpdmVyV2l0aEV4Y2VwdGlvbigpICk7Ci0KLSAgICAgICAgICAgIG1vam8uZXhlY3V0ZSgpOwotCi0gICAgICAgICAgICBmYWlsKCAiRXhwZWN0ZWQgZXhjZXB0aW9uIG5vdCB0aHJvd24iICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvL2V4cGVjdGVkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVW5wYWNrTW9qbyBnZXRNb2pvKCBTdHJpbmcgcGx1Z2luWG1sICkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIChVbnBhY2tNb2pvKSBsb29rdXBNb2pvKCAidW5wYWNrIiwgUGxleHVzVGVzdENhc2UuZ2V0QmFzZWRpcigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvc3JjL3Rlc3QvcGx1Z2luLWNvbmZpZ3MvdW5wYWNrLyIgKyBwbHVnaW5YbWwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlTW9qbyggU3RyaW5nIHBsdWdpblhtbCApCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFVucGFja01vam8gbW9qbyA9IGdldE1vam8oIHBsdWdpblhtbCApOwotCi0gICAgICAgIG1vam8uZXhlY3V0ZSgpOwotCi0gICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgZ2V0VmFyaWFibGVWYWx1ZUZyb21PYmplY3QoIG1vam8sICJwcm9qZWN0IiApOwotICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpLmdldE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGRpciA9IGZpbGVuYW1lLnN1YnN0cmluZyggMCwgZmlsZW5hbWUubGFzdEluZGV4T2YoICcuJyApICk7Ci0gICAgICAgIEZpbGUgd29ya0RpciA9IChGaWxlKSBnZXRWYXJpYWJsZVZhbHVlRnJvbU9iamVjdCggbW9qbywgIndvcmtEaXJlY3RvcnkiICk7Ci0gICAgICAgIEZpbGUgdW5wYWNrRGlyID0gbmV3IEZpbGUoIHdvcmtEaXIsIGRpciApOwotICAgICAgICBGaWxlIHVucGFja2VkID0gbmV3IEZpbGUoIHVucGFja0RpciwgZmlsZW5hbWUgKyAiLmV4dHJhY3RlZCIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCAiVGVzdCBleHRyYWN0ZWQgcHJvamVjdCBhcnRpZmFjdCIsIHVucGFja2VkLmV4aXN0cygpICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ludGVycG9sYXRpb24vQXNzZW1ibHlJbnRlcnBvbGF0b3IyVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ludGVycG9sYXRpb24vQXNzZW1ibHlJbnRlcnBvbGF0b3IyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGE5NTcyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pbnRlcnBvbGF0aW9uL0Fzc2VtYmx5SW50ZXJwb2xhdG9yMlRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuaW50ZXJwb2xhdGlvbjsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmlvLkRlZmF1bHRBc3NlbWJseVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5JbnRlcnBvbGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYXNzZW1ibHkubW9kZWwuRGVwZW5kZW5jeVNldDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5pbW11dGFibGUuRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3I7Ci0KLXB1YmxpYyBjbGFzcyBBc3NlbWJseUludGVycG9sYXRvcjJUZXN0Ci0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gICAgcHVibGljIHZvaWQgdGVzdERlcGVuZGVuY3lPdXRwdXRGaWxlTmFtZU1hcHBpbmdzQXJlTm90SW50ZXJwb2xhdGVkKCkgCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlJbnRlcnBvbGF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlbWJseUludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPSBuZXcgQXNzZW1ibHlJbnRlcnBvbGF0b3IoKTsKLQotICAgICAgICBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QtaWQiICk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cC5pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0VmVyc2lvbiggIjEiICk7Ci0KLSAgICAgICAgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLQotICAgICAgICBEZXBlbmRlbmN5U2V0IHNldCA9IG5ldyBEZXBlbmRlbmN5U2V0KCk7Ci0gICAgICAgIHNldC5zZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoICIke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufSIgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGREZXBlbmRlbmN5U2V0KCBzZXQgKTsKLQotICAgICAgICBBc3NlbWJseSBvdXRwdXRBc3NlbWJseSA9IGludGVycG9sYXRvci5pbnRlcnBvbGF0ZSggYXNzZW1ibHksIG1vZGVsLCBDb2xsZWN0aW9ucy5FTVBUWV9NQVAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0QXNzZW1ibHlSZWFkZXIuY3JlYXRlKG1vZGVsKSk7Ci0gICAgICAgIAotICAgICAgICBMaXN0IG91dHB1dERlcGVuZGVuY3lTZXRzID0gb3V0cHV0QXNzZW1ibHkuZ2V0RGVwZW5kZW5jeVNldHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBvdXRwdXREZXBlbmRlbmN5U2V0cy5zaXplKCkgKTsKLSAgICAgICAgCi0gICAgICAgIERlcGVuZGVuY3lTZXQgb3V0cHV0U2V0ID0gKERlcGVuZGVuY3lTZXQpIG91dHB1dERlcGVuZGVuY3lTZXRzLmdldCggMCApOwotICAgICAgICAKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBzZXQuZ2V0T3V0cHV0RmlsZU5hbWVNYXBwaW5nKCksIG91dHB1dFNldC5nZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoKSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL0FyY2hpdmVyTWFuYWdlclN0dWIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9BcmNoaXZlck1hbmFnZXJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDQ2YmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL0FyY2hpdmVyTWFuYWdlclN0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzOwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuVW5BcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuQXJjaGl2ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIubWFuYWdlci5Ob1N1Y2hBcmNoaXZlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIEVkd2luIFB1bnphbGFuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlck1hbmFnZXJTdHViCi0gICAgaW1wbGVtZW50cyBBcmNoaXZlck1hbmFnZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIEFyY2hpdmVyIGFyY2hpdmVyU3R1YjsKLQotICAgIHB1YmxpYyBzdGF0aWMgVW5BcmNoaXZlclN0dWIgdW5BcmNoaXZlclN0dWI7Ci0KLSAgICBwdWJsaWMgQXJjaGl2ZXJNYW5hZ2VyU3R1YigpCi0gICAgewotICAgICAgICBhcmNoaXZlclN0dWIgPSBudWxsOwotCi0gICAgICAgIHVuQXJjaGl2ZXJTdHViID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJjaGl2ZXIgZ2V0QXJjaGl2ZXIoIFN0cmluZyBzdHJpbmcgKQotICAgICAgICB0aHJvd3MgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggYXJjaGl2ZXJTdHViID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiggImRpciIuZXF1YWxzKCBzdHJpbmcgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZXJTdHViID0gbmV3IERpcmVjdG9yeUFyY2hpdmVyU3R1YigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoICJ0YXIiLmVxdWFscyggc3RyaW5nICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyU3R1YiA9IG5ldyBUYXJBcmNoaXZlclN0dWIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAid2FyIi5lcXVhbHMoIHN0cmluZyApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcmNoaXZlclN0dWIgPSBuZXcgV2FyQXJjaGl2ZXJTdHViKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggInppcCIuZXF1YWxzKCBzdHJpbmcgKSB8fAotICAgICAgICAgICAgICAgICAgICAgICJqYXIiLmVxdWFscyggc3RyaW5nICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyU3R1YiA9IG5ldyBKYXJBcmNoaXZlclN0dWIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24oIHN0cmluZyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFyY2hpdmVyU3R1YjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmNoaXZlciggSmFyQXJjaGl2ZXJTdHViIGFyY2hpdmVyICkKLSAgICB7Ci0gICAgICAgIGFyY2hpdmVyU3R1YiA9IGFyY2hpdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyBVbkFyY2hpdmVyIGdldFVuQXJjaGl2ZXIoIFN0cmluZyBzdHJpbmcgKQotICAgICAgICB0aHJvd3MgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggdW5BcmNoaXZlclN0dWIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggImphciIuZXF1YWxzKCBzdHJpbmcgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5BcmNoaXZlclN0dWIgPSBuZXcgU2lnbmVkVW5BcmNoaXZlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVuQXJjaGl2ZXJTdHViID0gbmV3IFVuQXJjaGl2ZXJTdHViKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdW5BcmNoaXZlclN0dWI7Ci0gICAgfQotCi0gICAgcHVibGljIFVuQXJjaGl2ZXIgZ2V0VW5BcmNoaXZlciggRmlsZSBmaWxlICkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIHVuQXJjaGl2ZXJTdHViID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgZmlsZW5hbWUgPSBmaWxlLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgdW5BcmNoaXZlclN0dWIgPSAoVW5BcmNoaXZlclN0dWIpIGdldFVuQXJjaGl2ZXIoIGZpbGVuYW1lLnN1YnN0cmluZyggZmlsZW5hbWUubGFzdEluZGV4T2YoICcuJyApICsgMSApICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdW5BcmNoaXZlclN0dWI7Ci0gICAgfSAgICAKLSAgICAKLSAgICBwdWJsaWMgQXJjaGl2ZXIgZ2V0QXJjaGl2ZXIoIEZpbGUgc3RyaW5nICkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIGFyY2hpdmVyU3R1YiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgYXJjaGl2ZXJTdHViID0gbmV3IEphckFyY2hpdmVyU3R1YigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGFyY2hpdmVyU3R1YjsKLSAgICB9ICAgICAgICAKLSAgICBwdWJsaWMgdm9pZCBzZXRVbkFyY2hpdmVyKCBVbkFyY2hpdmVyU3R1YiB1bkFyY2hpdmVyICkKLSAgICB7Ci0gICAgICAgIHVuQXJjaGl2ZXJTdHViID0gdW5BcmNoaXZlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvQXJjaGl2ZXJNYW5hZ2VyV2l0aEV4Y2VwdGlvblN0dWIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9BcmNoaXZlck1hbmFnZXJXaXRoRXhjZXB0aW9uU3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDZjNTE2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9BcmNoaXZlck1hbmFnZXJXaXRoRXhjZXB0aW9uU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHViczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5VbkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIubWFuYWdlci5Ob1N1Y2hBcmNoaXZlckV4Y2VwdGlvbjsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBhdXRob3IgRWR3aW4gUHVuemFsYW4KLSAqLwotcHVibGljIGNsYXNzIEFyY2hpdmVyTWFuYWdlcldpdGhFeGNlcHRpb25TdHViCi0gICAgZXh0ZW5kcyBBcmNoaXZlck1hbmFnZXJTdHViCi17Ci0gICAgcHVibGljIFVuQXJjaGl2ZXIgZ2V0VW5BcmNoaXZlciggU3RyaW5nIHN0cmluZyApCi0gICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uKCAiRXhwZWN0ZWQgZXhjZXB0aW9uIiApOwotICAgIH0KLQotICAgIHB1YmxpYyBBcmNoaXZlciBnZXRBcmNoaXZlciggU3RyaW5nIHN0cmluZyApCi0gICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uKCAiRXhwZWN0ZWQgZXhjZXB0aW9uIiApOwotICAgIH0KLQotICAgIHB1YmxpYyBVbkFyY2hpdmVyIGdldFVuQXJjaGl2ZXIoIEZpbGUgc3RyaW5nICkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24oICJFeHBlY3RlZCBleGNlcHRpb24iICk7Ci0gICAgfQotCi0gICAgcHVibGljIEFyY2hpdmVyIGdldEFyY2hpdmVyKCBGaWxlIHN0cmluZyApCi0gICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uKCAiRXhwZWN0ZWQgZXhjZXB0aW9uIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9BcnRpZmFjdFN0dWIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9BcnRpZmFjdFN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhlMTYzYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvQXJ0aWZhY3RTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzOwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkRlZmF1bHRBcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LmhhbmRsZXIuRGVmYXVsdEFydGlmYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnZlcnNpb25pbmcuVmVyc2lvblJhbmdlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuUGxleHVzVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogQGF1dGhvciBFZHdpbiBQdW56YWxhbgotICovCi1wdWJsaWMgY2xhc3MgQXJ0aWZhY3RTdHViCi0gICAgZXh0ZW5kcyBEZWZhdWx0QXJ0aWZhY3QKLXsKLSAgICBwdWJsaWMgQXJ0aWZhY3RTdHViKCBTdHJpbmcgZ3JvdXBJZCwgU3RyaW5nIGFydGlmYWN0SWQsIFN0cmluZyB2ZXJzaW9uLCBTdHJpbmcgcGFja2FnaW5nLCBTdHJpbmcgc2NvcGUgKQotICAgIHsKLSAgICAgICAgdGhpcyggZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgdmVyc2lvbiwgcGFja2FnaW5nLCBudWxsLCBzY29wZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnRpZmFjdFN0dWIoIFN0cmluZyBncm91cElkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgU3RyaW5nIHZlcnNpb24sIFN0cmluZyBwYWNrYWdpbmcsIFN0cmluZyBjbGFzc2lmaWVyLCBTdHJpbmcgc2NvcGUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIGdyb3VwSWQsIGFydGlmYWN0SWQsIFZlcnNpb25SYW5nZS5jcmVhdGVGcm9tVmVyc2lvbiggdmVyc2lvbiApLCBzY29wZSwgcGFja2FnaW5nLAotICAgICAgICAgICAgICAgY2xhc3NpZmllciwgbmV3IERlZmF1bHRBcnRpZmFjdEhhbmRsZXIoIHBhY2thZ2luZyApLCBmYWxzZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKCBQbGV4dXNUZXN0Q2FzZS5nZXRCYXNlZGlyKCkgKyAiL3RhcmdldC9sb2NhbC1yZXBvIiwgZ2V0QXJ0aWZhY3RJZCgpICsgIi0iICsgZ2V0VmVyc2lvbigpICsgIi4iICsgZ2V0VHlwZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIGxvbmcgbGFzdE1vZGlmaWVkKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL0Fzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1Yi5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL0Fzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzdmMjEwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzOwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi50ZXN0aW5nLnN0dWJzLk1hdmVuUHJvamVjdFN0dWI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkRlZmF1bHRBcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuRGVmYXVsdEFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5sYXlvdXQuRGVmYXVsdFJlcG9zaXRvcnlMYXlvdXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkRlZmF1bHRBcnRpZmFjdEhhbmRsZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC52ZXJzaW9uaW5nLlZlcnNpb25SYW5nZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuQnVpbGQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5QbGV4dXNUZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAYXV0aG9yIEVkd2luIFB1bnphbGFuCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlbWJseU1hdmVuUHJvamVjdFN0dWIKLSAgICBleHRlbmRzIE1hdmVuUHJvamVjdFN0dWIKLXsKLSAgICBwcml2YXRlIFN0cmluZyBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uOwotCi0gICAgcHJpdmF0ZSBBcnRpZmFjdCBhcnRpZmFjdDsKLQotICAgIHByaXZhdGUgU2V0IGFydGlmYWN0czsKLQotICAgIHByaXZhdGUgTW9kZWwgbW9kZWw7Ci0KLSAgICBwcml2YXRlIEZpbGUgYmFzZWRpcjsKLQotICAgIHB1YmxpYyBCdWlsZCBnZXRCdWlsZCgpCi0gICAgewotICAgICAgICByZXR1cm4gbW9kZWwuZ2V0QnVpbGQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdCBnZXRSZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllcygpCi0gICAgewotICAgICAgICBBcnRpZmFjdFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG5ldyBEZWZhdWx0QXJ0aWZhY3RSZXBvc2l0b3J5KCAiY2VudHJhbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZTovLyIgKyBQbGV4dXNUZXN0Q2FzZS5nZXRCYXNlZGlyKCkgKyAiL3NyYy90ZXN0L3JlbW90ZS1yZXBvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBEZWZhdWx0UmVwb3NpdG9yeUxheW91dCgpICk7Ci0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIHJlcG9zaXRvcnkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXNzZW1ibHlNYXZlblByb2plY3RTdHViKCkKLSAgICB7Ci0gICAgICAgIGdyb3VwSWQgPSAiYXNzZW1ibHkiOwotICAgICAgICBhcnRpZmFjdElkID0gInRlc3QtcHJvamVjdCI7Ci0gICAgICAgIHZlcnNpb24gPSAiMS4wIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2V0IGdldERlcGVuZGVuY3lBcnRpZmFjdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbigKLSAgICAgICAgICAgIG5ldyBEZWZhdWx0QXJ0aWZhY3QoICJhc3NlbWJseSIsICJkZXBlbmRlbmN5LWFydGlmYWN0IiwgVmVyc2lvblJhbmdlLmNyZWF0ZUZyb21WZXJzaW9uKCAiMS4wIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJ0aWZhY3QuU0NPUEVfQ09NUElMRSwgImphciIsIG51bGwsIG5ldyBEZWZhdWx0QXJ0aWZhY3RIYW5kbGVyKCAiamFyIiApLCBmYWxzZSApCi0gICAgICAgICAgICApOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEJhc2VkaXIoKQotICAgIHsKLSAgICAgICAgaWYgKCBiYXNlZGlyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlZGlyID0gbmV3IEZpbGUoIFBsZXh1c1Rlc3RDYXNlLmdldEJhc2VkaXIoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGJhc2VkaXI7Ci0gICAgfQotCi0gICAgcHVibGljIEFydGlmYWN0IGdldEFydGlmYWN0KCkKLSAgICB7Ci0gICAgICAgIGlmICggYXJ0aWZhY3QgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFydGlmYWN0ID0gbmV3IEFydGlmYWN0U3R1YiggZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgdmVyc2lvbiwgImphciIsIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhcnRpZmFjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTW9kZWwgZ2V0TW9kZWwoKQotICAgIHsKLSAgICAgICAgaWYgKCBtb2RlbCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0UHJvcGVydGllcyggbmV3IFByb3BlcnRpZXMoKSApOwotCi0gICAgICAgICAgICBtb2RlbC5zZXRHcm91cElkKCBnZXRHcm91cElkKCkgKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggZ2V0QXJ0aWZhY3RJZCgpICk7Ci0KLSAgICAgICAgICAgIG1vZGVsLnNldFZlcnNpb24oIGdldFZlcnNpb24oKSApOwotCi0gICAgICAgICAgICBCdWlsZCBidWlsZCA9IG5ldyBCdWlsZCgpOwotICAgICAgICAgICAgYnVpbGQuc2V0RmluYWxOYW1lKCBnZXRBcnRpZmFjdElkKCkgKyAiLSIgKyBnZXRWZXJzaW9uKCkgKTsKLSAgICAgICAgICAgIG1vZGVsLnNldEJ1aWxkKCBidWlsZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZ2V0QXJ0aWZhY3RzKCkKLSAgICB7Ci0gICAgICAgIGlmICggYXJ0aWZhY3RzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcnRpZmFjdHMgPSBDb2xsZWN0aW9ucy5FTVBUWV9TRVQ7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gYXJ0aWZhY3RzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFydGlmYWN0cyggU2V0IGFydGlmYWN0cyApCi0gICAgewotICAgICAgICB0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUHJvcGVydGllcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZ3JvdXBJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRHcm91cElkKCBTdHJpbmcgZ3JvdXBJZCApCi0gICAgewotICAgICAgICB0aGlzLmdyb3VwSWQgPSBncm91cElkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJ0aWZhY3RJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gYXJ0aWZhY3RJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcnRpZmFjdElkKCBTdHJpbmcgYXJ0aWZhY3RJZCApCi0gICAgewotICAgICAgICB0aGlzLmFydGlmYWN0SWQgPSBhcnRpZmFjdElkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpCi0gICAgewotICAgICAgICByZXR1cm4gdmVyc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKCBTdHJpbmcgdmVyc2lvbiApCi0gICAgewotICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9EaXJlY3RvcnlBcmNoaXZlclN0dWIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9EaXJlY3RvcnlBcmNoaXZlclN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdhYTEwZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvRGlyZWN0b3J5QXJjaGl2ZXJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIEFsbGFuIFJhbWlyZXoKLSAqLwotcHVibGljIGNsYXNzIERpcmVjdG9yeUFyY2hpdmVyU3R1YgotICAgIGV4dGVuZHMgSmFyQXJjaGl2ZXJTdHViCi17Ci0gICAgcHVibGljIHZvaWQgY3JlYXRlQXJjaGl2ZSgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGdldERlc3RGaWxlKCkubWtkaXJzKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL0phckFyY2hpdmVyU3R1Yi5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL0phckFyY2hpdmVyU3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNGFhMmEyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9KYXJBcmNoaXZlclN0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzOwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLkphckFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLk1hbmlmZXN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLk1hbmlmZXN0RXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBAYXV0aG9yIEVkd2luIFB1bnphbGFuCi0gKi8KLXB1YmxpYyBjbGFzcyBKYXJBcmNoaXZlclN0dWIKLSAgICBleHRlbmRzIEphckFyY2hpdmVyCi17Ci0gICAgcHJpdmF0ZSBNYXAgZmlsZXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgcHJpdmF0ZSBGaWxlIGRlc3RGaWxlOwotCi0gICAgcHJpdmF0ZSBpbnQgZmlsZU1vZGUgPSAwOwotCi0gICAgcHJpdmF0ZSBpbnQgZGlyTW9kZSA9IDA7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZUVtcHR5RGlycyA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBNYW5pZmVzdCBtYW5pZmVzdDsKLQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUFyY2hpdmUoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBkZXN0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgIGRlc3RGaWxlLmRlbGV0ZSgpOwotCi0gICAgICAgIGlmICggIWRlc3RGaWxlLmNyZWF0ZU5ld0ZpbGUoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbiggIlVuYWJsZSB0byBjcmVhdGUgYXJjaGl2ZSBmaWxlOiAiICsgZGVzdEZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggRmlsZSBmaWxlICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhZGREaXJlY3RvcnkoIGZpbGUsICIiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBGaWxlIGZpbGUsIFN0cmluZyBzdHJpbmcgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFkZERpcmVjdG9yeSggZmlsZSwgc3RyaW5nLCBudWxsLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBGaWxlIGZpbGUsIFN0cmluZ1tdIHN0cmluZ3MsIFN0cmluZ1tdIHN0cmluZ3MxICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhZGREaXJlY3RvcnkoIGZpbGUsIGZpbGUuZ2V0TmFtZSgpLCBzdHJpbmdzLCBzdHJpbmdzMSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggRmlsZSBmaWxlLCBTdHJpbmcgc3RyaW5nLCBTdHJpbmdbXSBpbmNsdWRlcywgU3RyaW5nW10gZXhjbHVkZXMgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkFkZGluZyBkaXIgIiArIGZpbGUuZ2V0UGF0aCgpICk7Ci0KLSAgICAgICAgZmlsZXMucHV0KCBmaWxlLCBuZXcgQXJjaGl2ZXJGaWxlKCBmaWxlLCBzdHJpbmcsIGluY2x1ZGVzLCBleGNsdWRlcyApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZSggRmlsZSBmaWxlLCBTdHJpbmcgc3RyaW5nICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhZGRGaWxlKCBmaWxlLCBzdHJpbmcsIDAgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlKCBGaWxlIGZpbGUsIFN0cmluZyBzdHJpbmcsIGludCBpICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJBZGRpbmcgZmlsZSAiICsgZmlsZS5nZXRQYXRoKCkgKTsKLQotICAgICAgICBBcmNoaXZlckZpbGUgYXJjaGl2ZXJGaWxlID0gbmV3IEFyY2hpdmVyRmlsZSggZmlsZSwgc3RyaW5nLCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgYXJjaGl2ZXJGaWxlLnNldEZpbGVNb2RlKCBpICk7Ci0KLSAgICAgICAgZmlsZXMucHV0KCBmaWxlLCBhcmNoaXZlckZpbGUgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXREZXN0RmlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzdEZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzdEZpbGUoIEZpbGUgZmlsZSApCi0gICAgewotICAgICAgICBkZXN0RmlsZSA9IGZpbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEZpbGVNb2RlKCBpbnQgaSApCi0gICAgewotICAgICAgICBmaWxlTW9kZSA9IGk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXREZWZhdWx0RmlsZU1vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHREaXJlY3RvcnlNb2RlKCBpbnQgaSApCi0gICAgewotICAgICAgICBkaXJNb2RlID0gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlZmF1bHREaXJlY3RvcnlNb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkaXJNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldEluY2x1ZGVFbXB0eURpcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGluY2x1ZGVFbXB0eURpcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZUVtcHR5RGlycyggYm9vbGVhbiBiICkKLSAgICB7Ci0gICAgICAgIGluY2x1ZGVFbXB0eURpcnMgPSBiOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXAgZ2V0RmlsZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZENvbmZpZ3VyZWRNYW5pZmVzdCggTWFuaWZlc3QgbmV3TWFuaWZlc3QgKQotICAgICAgICB0aHJvd3MgTWFuaWZlc3RFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1hbmlmZXN0ID0gbmV3TWFuaWZlc3Q7Ci0gICAgfQotCi0gICAgcHVibGljIE1hbmlmZXN0IGdldE1hbmlmZXN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYW5pZmVzdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgY2xhc3MgQXJjaGl2ZXJGaWxlCi0gICAgewotICAgICAgICBwcml2YXRlIEZpbGUgZmlsZTsKLQotICAgICAgICBwcml2YXRlIFN0cmluZyBvdXRwdXROYW1lOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nW10gaW5jbHVkZXMsIGV4Y2x1ZGVzOwotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbGVNb2RlOwotCi0gICAgICAgIHByaXZhdGUgQXJjaGl2ZXJGaWxlKCBGaWxlIGZpbGUsIFN0cmluZyBvdXRwdXROYW1lLCBTdHJpbmdbXSBpbmNsdWRlcywgU3RyaW5nW10gZXhjbHVkZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICAgICAgdGhpcy5vdXRwdXROYW1lID0gb3V0cHV0TmFtZTsKLSAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSBpbmNsdWRlczsKLSAgICAgICAgICAgIHRoaXMuZXhjbHVkZXMgPSBleGNsdWRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBGaWxlIGdldEZpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbGUoIEZpbGUgZmlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE91dHB1dE5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gb3V0cHV0TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dE5hbWUoIFN0cmluZyBvdXRwdXROYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5vdXRwdXROYW1lID0gb3V0cHV0TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRJbmNsdWRlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbmNsdWRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVzKCBTdHJpbmdbXSBpbmNsdWRlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuaW5jbHVkZXMgPSBpbmNsdWRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBleGNsdWRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEV4Y2x1ZGVzKCBTdHJpbmdbXSBleGNsdWRlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZXhjbHVkZXMgPSBleGNsdWRlczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RmlsZU1vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmlsZU1vZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTW9kZSggaW50IGZpbGVNb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5maWxlTW9kZSA9IGZpbGVNb2RlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL01hdmVuUHJvamVjdFdpdGhBcnRpZmFjdHNTdHViLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvTWF2ZW5Qcm9qZWN0V2l0aEFydGlmYWN0c1N0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmIzY2Q5Mi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvTWF2ZW5Qcm9qZWN0V2l0aEFydGlmYWN0c1N0dWIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBhdXRob3IgRWR3aW4gUHVuemFsYW4KLSAqLwotcHVibGljIGNsYXNzIE1hdmVuUHJvamVjdFdpdGhBcnRpZmFjdHNTdHViCi0gICAgZXh0ZW5kcyBBc3NlbWJseU1hdmVuUHJvamVjdFN0dWIKLXsKLSAgICBwdWJsaWMgTWF2ZW5Qcm9qZWN0V2l0aEFydGlmYWN0c1N0dWIoKQotICAgIHsKLSAgICAgICAgU2V0IGFydGlmYWN0cyA9IG5ldyBIYXNoU2V0KCk7Ci0KLSAgICAgICAgYXJ0aWZhY3RzLmFkZCggbmV3IEFydGlmYWN0U3R1YiggImFzc2VtYmx5IiwgImRlcGVuZGVuY3ktYXJ0aWZhY3QxIiwgIjEuMCIsICJqYXIiLCBBcnRpZmFjdC5TQ09QRV9DT01QSUxFICkgKTsKLSAgICAgICAgYXJ0aWZhY3RzLmFkZCggbmV3IEFydGlmYWN0U3R1YiggImFzc2VtYmx5IiwgImRlcGVuZGVuY3ktYXJ0aWZhY3QyIiwgIjEuMCIsICJqYXIiLCBBcnRpZmFjdC5TQ09QRV9SVU5USU1FICkgKTsKLSAgICAgICAgYXJ0aWZhY3RzLmFkZCggbmV3IEFydGlmYWN0U3R1YiggImFzc2VtYmx5IiwgImRlcGVuZGVuY3ktYXJ0aWZhY3QzIiwgIjEuMCIsICJqYXIiLCBBcnRpZmFjdC5TQ09QRV9URVNUICkgKTsKLQotICAgICAgICBzZXRBcnRpZmFjdHMoIGFydGlmYWN0cyApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9NYXZlblByb2plY3RXaXRoRGVwZW5kZW5jeUNsYXNzaWZpZXJTdHViLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvTWF2ZW5Qcm9qZWN0V2l0aERlcGVuZGVuY3lDbGFzc2lmaWVyU3R1Yi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjhmZGY4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9NYXZlblByb2plY3RXaXRoRGVwZW5kZW5jeUNsYXNzaWZpZXJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAYXV0aG9yIEVkd2luIFB1bnphbGFuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXZlblByb2plY3RXaXRoRGVwZW5kZW5jeUNsYXNzaWZpZXJTdHViCi0gICAgZXh0ZW5kcyBNYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YgotewotICAgIHB1YmxpYyBNYXZlblByb2plY3RXaXRoRGVwZW5kZW5jeUNsYXNzaWZpZXJTdHViKCkKLSAgICB7Ci0gICAgICAgIFNldCBhcnRpZmFjdHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIGFydGlmYWN0cy5hZGQoIG5ldyBBcnRpZmFjdFN0dWIoICJhc3NlbWJseSIsICJkZXBlbmRlbmN5LWFydGlmYWN0MSIsICIxLjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiamFyIiwgImNsYXNzaWZpZXIiLCBBcnRpZmFjdC5TQ09QRV9DT01QSUxFICkgKTsKLSAgICAgICAgYXJ0aWZhY3RzLmFkZCggbmV3IEFydGlmYWN0U3R1YiggImFzc2VtYmx5IiwgImRlcGVuZGVuY3ktYXJ0aWZhY3QyIiwgIjEuMCIsICJqYXIiLCBBcnRpZmFjdC5TQ09QRV9SVU5USU1FICkgKTsKLSAgICAgICAgYXJ0aWZhY3RzLmFkZCggbmV3IEFydGlmYWN0U3R1YiggImFzc2VtYmx5IiwgImRlcGVuZGVuY3ktYXJ0aWZhY3QzIiwgIjEuMCIsICJqYXIiLCBBcnRpZmFjdC5TQ09QRV9URVNUICkgKTsKLQotICAgICAgICBzZXRBcnRpZmFjdHMoIGFydGlmYWN0cyApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9SZWFjdG9yTWF2ZW5Qcm9qZWN0U3R1Yi5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL1JlYWN0b3JNYXZlblByb2plY3RTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1Yzk5OTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL1JlYWN0b3JNYXZlblByb2plY3RTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHViczsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLkJ1aWxkOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5SZXBvcnRpbmc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5zdHVicy5NYXZlblByb2plY3RTdHViOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQGF1dGhvciBFZHdpbiBQdW56YWxhbgotICovCi1wdWJsaWMgY2xhc3MgUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIKLSAgICBleHRlbmRzIE1hdmVuUHJvamVjdFN0dWIKLXsKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgcmVhY3RvclByb2plY3RzID0gbmV3IEFycmF5TGlzdCgpOwotCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcGFyZW50OwotCi0gICAgcHJpdmF0ZSBNb2RlbCBtb2RlbDsKLQotICAgIHByaXZhdGUgRmlsZSBiYXNlZGlyOwotCi0gICAgcHVibGljIFJlYWN0b3JNYXZlblByb2plY3RTdHViKCkKLSAgICB7Ci0gICAgICAgIHRoaXMoICJqYXIiICk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlYWN0b3JNYXZlblByb2plY3RTdHViKCBTdHJpbmcgcGFja2FnaW5nICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgcmVhY3RvclByb2plY3RzLmFkZCggdGhpcyApOwotCi0gICAgICAgIHNldEdyb3VwSWQoICJhc3NlbWJseSIgKTsKLSAgICAgICAgc2V0QXJ0aWZhY3RJZCggInJlYWN0b3ItcHJvamVjdC0iICsgcmVhY3RvclByb2plY3RzLnNpemUoKSApOwotICAgICAgICBzZXRWZXJzaW9uKCAiMS4wIiApOwotICAgICAgICBzZXRQYWNrYWdpbmcoIHBhY2thZ2luZyApOwotCi0gICAgICAgIHNldEFydGlmYWN0KCBuZXcgQXJ0aWZhY3RTdHViKCBnZXRHcm91cElkKCksIGdldEFydGlmYWN0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFZlcnNpb24oKSwgZ2V0UGFja2FnaW5nKCksIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEdyb3VwSWQoKSArICI6IiArIGdldEFydGlmYWN0SWQoKSArICI6IiArIGdldFZlcnNpb24oKSArICI6IiArIGdldFBhY2thZ2luZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBTZXQgZ2V0QXJ0aWZhY3RzKCkKLSAgICB7Ci0gICAgICAgIFNldCBhcnRpZmFjdHMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgICAgIGFydGlmYWN0cy5hZGQoIG5ldyBBcnRpZmFjdFN0dWIoICJhc3NlbWJseSIsICJyZWFjdG9yLWRlcGVuZGVuY3kiLCAiMS4wIiwgImphciIsIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKSApOwotCi0gICAgICAgIHJldHVybiBhcnRpZmFjdHM7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0QmFzZWRpcigpCi0gICAgewotICAgICAgICBGaWxlIGJhc2VkaXIgPSAgc3VwZXIuZ2V0QmFzZWRpcigpOwotCi0gICAgICAgIGlmICggcGFyZW50ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBiYXNlZGlyID0gcGFyZW50LmdldEJhc2VkaXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBuZXcgRmlsZSggYmFzZWRpciwgZ2V0QXJ0aWZhY3RJZCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIFJlcG9ydGluZyBnZXRSZXBvcnRpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1vZGVsLmdldFJlcG9ydGluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2RlbCBnZXRNb2RlbCgpCi0gICAgewotICAgICAgICBpZiAoIG1vZGVsID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2RlbCA9IG5ldyBNb2RlbCgpOwotCi0gICAgICAgICAgICBtb2RlbC5zZXRHcm91cElkKCBnZXRHcm91cElkKCkgKTsKLQotICAgICAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggZ2V0QXJ0aWZhY3RJZCgpICk7Ci0KLSAgICAgICAgICAgIG1vZGVsLnNldFZlcnNpb24oIGdldFZlcnNpb24oKSApOwotCi0gICAgICAgICAgICBtb2RlbC5zZXRQYWNrYWdpbmcoIGdldFBhY2thZ2luZygpICk7Ci0KLSAgICAgICAgICAgIG1vZGVsLnNldFByb3BlcnRpZXMoIG5ldyBQcm9wZXJ0aWVzKCkgKTsKLQotICAgICAgICAgICAgQnVpbGQgYnVpbGQgPSBuZXcgQnVpbGQoKTsKLSAgICAgICAgICAgIGJ1aWxkLnNldEZpbmFsTmFtZSggZ2V0QXJ0aWZhY3RJZCgpICsgIi0iICsgZ2V0VmVyc2lvbigpICsgIi4iICsgZ2V0UGFja2FnaW5nKCkgKTsKLQotICAgICAgICAgICAgaWYgKCBwYXJlbnQgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVpbGQuc2V0RGlyZWN0b3J5KCBwYXJlbnQuZ2V0QmFzZWRpcigpLmdldEFic29sdXRlUGF0aCgpICsgIi8iICsgZ2V0QXJ0aWZhY3RJZCgpICsgIi90YXJnZXQiICk7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLm1rZGlyKCBidWlsZC5nZXREaXJlY3RvcnkoKSApOwotCi0gICAgICAgICAgICAgICAgYnVpbGQuc2V0T3V0cHV0RGlyZWN0b3J5KCBwYXJlbnQuZ2V0QmFzZWRpcigpLmdldEFic29sdXRlUGF0aCgpICsgIi8iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFydGlmYWN0SWQoKSArICIvdGFyZ2V0L2NsYXNzZXMiICk7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLm1rZGlyKCBidWlsZC5nZXRPdXRwdXREaXJlY3RvcnkoKSApOwotCi0gICAgICAgICAgICAgICAgYnVpbGQuc2V0VGVzdE91dHB1dERpcmVjdG9yeSggcGFyZW50LmdldEJhc2VkaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBcnRpZmFjdElkKCkgKyAiL3RhcmdldC90ZXN0LWNsYXNzZXMiICk7Ci0gICAgICAgICAgICAgICAgRmlsZVV0aWxzLm1rZGlyKCBidWlsZC5nZXRUZXN0T3V0cHV0RGlyZWN0b3J5KCkgKTsKLQotICAgICAgICAgICAgICAgIFJlcG9ydGluZyByZXBvcnRpbmcgPSBuZXcgUmVwb3J0aW5nKCk7Ci0gICAgICAgICAgICAgICAgcmVwb3J0aW5nLnNldE91dHB1dERpcmVjdG9yeSggcGFyZW50LmdldEJhc2VkaXIoKS5nZXRBYnNvbHV0ZVBhdGgoKSArICIvIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRBcnRpZmFjdElkKCkgKyAiL3RhcmdldC9zaXRlIiApOwotICAgICAgICAgICAgICAgIEZpbGVVdGlscy5ta2RpciggcmVwb3J0aW5nLmdldE91dHB1dERpcmVjdG9yeSgpICk7Ci0KLSAgICAgICAgICAgICAgICBtb2RlbC5zZXRSZXBvcnRpbmcoIHJlcG9ydGluZyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtb2RlbC5zZXRCdWlsZCggYnVpbGQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBtb2RlbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGQgZ2V0QnVpbGQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE1vZGVsKCkuZ2V0QnVpbGQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoIE1hdmVuUHJvamVjdCBwYXJlbnQgKQotICAgIHsKLSAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgfQotCi0gICAgcHVibGljIE1hdmVuUHJvamVjdCBnZXRQYXJlbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvU2lnbmVkVW5BcmNoaXZlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL1NpZ25lZFVuQXJjaGl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMThhZDg2ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvU2lnbmVkVW5BcmNoaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHViczsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEBhdXRob3IgRWR3aW4gUHVuemFsYW4KLSAqLwotcHVibGljIGNsYXNzIFNpZ25lZFVuQXJjaGl2ZXIKLSAgICBleHRlbmRzIFVuQXJjaGl2ZXJTdHViCi17Ci0gICAgcHVibGljIHZvaWQgZXh0cmFjdCgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLmV4dHJhY3QoKTsKLQotICAgICAgICBGaWxlIHNpZ25hdHVyZURpciA9IG5ldyBGaWxlKCBnZXREZXN0RGlyZWN0b3J5KCksICJNRVRBLUlORiIgKTsKLSAgICAgICAgc2lnbmF0dXJlRGlyLm1rZGlycygpOwotCi0gICAgICAgIEZpbGUgc2lnbmF0dXJlRmlsZSA9IG5ldyBGaWxlKCBzaWduYXR1cmVEaXIsICJzZWN1cml0eS1maWxlLlJTQSIgKTsKLSAgICAgICAgc2lnbmF0dXJlRmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLSAgICAgICAgc2lnbmF0dXJlRmlsZSA9IG5ldyBGaWxlKCBzaWduYXR1cmVEaXIsICJzZWN1cml0eS1maWxlLkRTQSIgKTsKLSAgICAgICAgc2lnbmF0dXJlRmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0KLSAgICAgICAgc2lnbmF0dXJlRmlsZSA9IG5ldyBGaWxlKCBzaWduYXR1cmVEaXIsICJzZWN1cml0eS1maWxlLlNGIiApOwotICAgICAgICBzaWduYXR1cmVGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotICAgICAgICBzaWduYXR1cmVGaWxlID0gbmV3IEZpbGUoIHNpZ25hdHVyZURpciwgInNlY3VyaXR5LWZpbGUucnNhIiApOwotICAgICAgICBzaWduYXR1cmVGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotICAgICAgICBzaWduYXR1cmVGaWxlID0gbmV3IEZpbGUoIHNpZ25hdHVyZURpciwgInNlY3VyaXR5LWZpbGUuZHNhIiApOwotICAgICAgICBzaWduYXR1cmVGaWxlLmNyZWF0ZU5ld0ZpbGUoKTsKLQotICAgICAgICBzaWduYXR1cmVGaWxlID0gbmV3IEZpbGUoIHNpZ25hdHVyZURpciwgInNlY3VyaXR5LWZpbGUuc2YiICk7Ci0gICAgICAgIHNpZ25hdHVyZUZpbGUuY3JlYXRlTmV3RmlsZSgpOwotCi0gICAgICAgIHNpZ25hdHVyZUZpbGUgPSBuZXcgRmlsZSggc2lnbmF0dXJlRGlyLCAibm9uLXNlY3VyaXR5LWZpbGUiICk7Ci0gICAgICAgIHNpZ25hdHVyZUZpbGUuY3JlYXRlTmV3RmlsZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9UYXJBcmNoaXZlclN0dWIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9UYXJBcmNoaXZlclN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4ZWM2OC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvVGFyQXJjaGl2ZXJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHViczsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci50YXIuVGFyQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci50YXIuVGFyTG9uZ0ZpbGVNb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgRWR3aW4gUHVuemFsYW4KLSAqLwotcHVibGljIGNsYXNzIFRhckFyY2hpdmVyU3R1YgotICAgIGV4dGVuZHMgVGFyQXJjaGl2ZXIKLXsKLSAgICBwcml2YXRlIE1hcCBmaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIEZpbGUgZGVzdEZpbGU7Ci0KLSAgICBwcml2YXRlIGludCBmaWxlTW9kZSA9IDA7Ci0KLSAgICBwcml2YXRlIGludCBkaXJNb2RlID0gMDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlRW1wdHlEaXJzID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIFRhckNvbXByZXNzaW9uTWV0aG9kIHRhckNvbXByZXNzaW9uTWV0aG9kOwotCi0gICAgcHJpdmF0ZSBUYXJMb25nRmlsZU1vZGUgbG9uZ0ZpbGVNb2RlOwotCi0gICAgcHVibGljIHZvaWQgc2V0TG9uZ2ZpbGUoIFRhckxvbmdGaWxlTW9kZSBtb2RlICkKLSAgICB7Ci0gICAgICAgIHRoaXMubG9uZ0ZpbGVNb2RlID0gbW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvbiggVGFyQ29tcHJlc3Npb25NZXRob2QgbW9kZSApCi0gICAgewotICAgICAgICB0YXJDb21wcmVzc2lvbk1ldGhvZCA9IG1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgY3JlYXRlQXJjaGl2ZSgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGRlc3RGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgZGVzdEZpbGUuZGVsZXRlKCk7Ci0KLSAgICAgICAgaWYgKCAhZGVzdEZpbGUuY3JlYXRlTmV3RmlsZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVyRXhjZXB0aW9uKCAiVW5hYmxlIHRvIGNyZWF0ZSBhcmNoaXZlIGZpbGU6ICIgKyBkZXN0RmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBGaWxlIGZpbGUgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFkZERpcmVjdG9yeSggZmlsZSwgIiIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoIEZpbGUgZmlsZSwgU3RyaW5nIHN0cmluZyApCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYWRkRGlyZWN0b3J5KCBmaWxlLCBzdHJpbmcsIG51bGwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoIEZpbGUgZmlsZSwgU3RyaW5nW10gc3RyaW5ncywgU3RyaW5nW10gc3RyaW5nczEgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFkZERpcmVjdG9yeSggZmlsZSwgZmlsZS5nZXROYW1lKCksIHN0cmluZ3MsIHN0cmluZ3MxICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBGaWxlIGZpbGUsIFN0cmluZyBzdHJpbmcsIFN0cmluZ1tdIGluY2x1ZGVzLCBTdHJpbmdbXSBleGNsdWRlcyApCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQWRkaW5nIGRpciAiICsgZmlsZS5nZXRQYXRoKCkgKTsKLQotICAgICAgICBmaWxlcy5wdXQoIGZpbGUsIG5ldyBBcmNoaXZlckZpbGUoIGZpbGUsIHN0cmluZywgaW5jbHVkZXMsIGV4Y2x1ZGVzICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlKCBGaWxlIGZpbGUsIFN0cmluZyBzdHJpbmcgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFkZEZpbGUoIGZpbGUsIHN0cmluZywgMCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoIEZpbGUgZmlsZSwgU3RyaW5nIHN0cmluZywgaW50IGkgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkFkZGluZyBmaWxlICIgKyBmaWxlLmdldFBhdGgoKSApOwotCi0gICAgICAgIEFyY2hpdmVyRmlsZSBhcmNoaXZlckZpbGUgPSBuZXcgQXJjaGl2ZXJGaWxlKCBmaWxlLCBzdHJpbmcsIG51bGwsIG51bGwgKTsKLQotICAgICAgICBhcmNoaXZlckZpbGUuc2V0RmlsZU1vZGUoIGkgKTsKLQotICAgICAgICBmaWxlcy5wdXQoIGZpbGUsIGFyY2hpdmVyRmlsZSApOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldERlc3RGaWxlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZXN0RmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0RmlsZSggRmlsZSBmaWxlICkKLSAgICB7Ci0gICAgICAgIGRlc3RGaWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmlsZU1vZGUoIGludCBpICkKLSAgICB7Ci0gICAgICAgIGZpbGVNb2RlID0gaTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldERlZmF1bHRGaWxlTW9kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlsZU1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdERpcmVjdG9yeU1vZGUoIGludCBpICkKLSAgICB7Ci0gICAgICAgIGRpck1vZGUgPSBpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdERpcmVjdG9yeU1vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRpck1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZUVtcHR5RGlycygpCi0gICAgewotICAgICAgICByZXR1cm4gaW5jbHVkZUVtcHR5RGlyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlRW1wdHlEaXJzKCBib29sZWFuIGIgKQotICAgIHsKLSAgICAgICAgaW5jbHVkZUVtcHR5RGlycyA9IGI7Ci0gICAgfQotCi0gICAgcHVibGljIE1hcCBnZXRGaWxlcygpCi0gICAgewotICAgICAgICByZXR1cm4gZmlsZXM7Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIEFyY2hpdmVyRmlsZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBGaWxlIGZpbGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0TmFtZTsKLQotICAgICAgICBwcml2YXRlIFN0cmluZ1tdIGluY2x1ZGVzLCBleGNsdWRlczsKLQotICAgICAgICBwcml2YXRlIGludCBmaWxlTW9kZTsKLQotICAgICAgICBwcml2YXRlIEFyY2hpdmVyRmlsZSggRmlsZSBmaWxlLCBTdHJpbmcgb3V0cHV0TmFtZSwgU3RyaW5nW10gaW5jbHVkZXMsIFN0cmluZ1tdIGV4Y2x1ZGVzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0TmFtZSA9IG91dHB1dE5hbWU7Ci0gICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gaW5jbHVkZXM7Ci0gICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gZXhjbHVkZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZSBnZXRGaWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWxlKCBGaWxlIGZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG91dHB1dE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXROYW1lKCBTdHJpbmcgb3V0cHV0TmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0TmFtZSA9IG91dHB1dE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5jbHVkZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyggU3RyaW5nW10gaW5jbHVkZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmluY2x1ZGVzID0gaW5jbHVkZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXhjbHVkZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyggU3RyaW5nW10gZXhjbHVkZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gZXhjbHVkZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEZpbGVNb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZpbGVNb2RlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZU1vZGUoIGludCBmaWxlTW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmlsZU1vZGUgPSBmaWxlTW9kZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9VbkFyY2hpdmVyU3R1Yi5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL1VuQXJjaGl2ZXJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMGZiNWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL1VuQXJjaGl2ZXJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHViczsKLQotLyoKLSAqIENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlVuQXJjaGl2ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAYXV0aG9yIEVkd2luIFB1bnphbGFuCi0gKi8KLXB1YmxpYyBjbGFzcyBVbkFyY2hpdmVyU3R1YgotICAgIGltcGxlbWVudHMgVW5BcmNoaXZlcgotewotICAgIHByaXZhdGUgRmlsZSBzb3VyY2VGaWxlLCBkZXN0RGlyOwotCi0gICAgcHVibGljIHZvaWQgZXh0cmFjdCgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgZXh0cmFjdGVkRmlsZSA9IG5ldyBGaWxlKCBnZXREZXN0RGlyZWN0b3J5KCksIGdldFNvdXJjZUZpbGUoKS5nZXROYW1lKCkgKyAiLmV4dHJhY3RlZCIgKTsKLQotICAgICAgICBpZiAoICFleHRyYWN0ZWRGaWxlLmV4aXN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0cmFjdGVkRmlsZS5jcmVhdGVOZXdGaWxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXREZXN0RGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZXN0RGlyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc3REaXJlY3RvcnkoIEZpbGUgZmlsZSApCi0gICAgewotICAgICAgICBkZXN0RGlyID0gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXREZXN0RmlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0RmlsZSggRmlsZSBmaWxlICkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZSgpCi0gICAgewotICAgICAgICByZXR1cm4gc291cmNlRmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTb3VyY2VGaWxlKCBGaWxlIGZpbGUgKQotICAgIHsKLSAgICAgICAgdGhpcy5zb3VyY2VGaWxlID0gZmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdmVyd3JpdGUoIGJvb2xlYW4gYiApCi0gICAgewotICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgTGlzdCBnZXRVbnBhY2tlZEZpbGVzKCkKLS8vICAgIHsKLS8vICAgICAgICByZXR1cm4gdW5wYWNrZWRGaWxlczsKLS8vICAgIH0KLS8vCi0vLyAgICBwdWJsaWMgY2xhc3MgVW5wYWNrZWRBcmNoaXZlCi0vLyAgICB7Ci0vLyAgICAgICAgcHJpdmF0ZSBGaWxlIHNvdXJjZUZpbGUsIGRlc3REaXJlY3Rvcnk7Ci0vLwotLy8gICAgICAgIHByaXZhdGUgVW5wYWNrZWRBcmNoaXZlKCBGaWxlIHNvdXJjZUZpbGUsIEZpbGUgZGVzdERpcmVjdG9yeSApCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICB0aGlzLnNvdXJjZUZpbGUgPSBzb3VyY2VGaWxlOwotLy8gICAgICAgICAgICB0aGlzLmRlc3REaXJlY3RvcnkgPSBkZXN0RGlyZWN0b3J5OwotLy8gICAgICAgIH0KLS8vCi0vLyAgICAgICAgcHVibGljIEZpbGUgZ2V0U291cmNlRmlsZSgpCi0vLyAgICAgICAgewotLy8gICAgICAgICAgICByZXR1cm4gc291cmNlRmlsZTsKLS8vICAgICAgICB9Ci0vLwotLy8gICAgICAgIHB1YmxpYyBGaWxlIGdldERlc3REaXJlY3RvcnkoKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgcmV0dXJuIGRlc3REaXJlY3Rvcnk7Ci0vLyAgICAgICAgfQotLy8KLS8vICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoIE9iamVjdCBvYmogKQotLy8gICAgICAgIHsKLS8vICAgICAgICAgICAgYm9vbGVhbiBlcXVhbCA9IGZhbHNlOwotLy8KLS8vICAgICAgICAgICAgaWYgKCBvYmogaW5zdGFuY2VvZiBVbnBhY2tlZEFyY2hpdmUgKQotLy8gICAgICAgICAgICB7Ci0vLyAgICAgICAgICAgICAgICBVbnBhY2tlZEFyY2hpdmUgdW5wYWNrZWQgPSAoVW5wYWNrZWRBcmNoaXZlKSBvYmo7Ci0vLyAgICAgICAgICAgICAgICBpZiAoIHVucGFja2VkLmdldFNvdXJjZUZpbGUoKS5lcXVhbHMoIGdldFNvdXJjZUZpbGUoKSApICYmCi0vLyAgICAgICAgICAgICAgICAgICAgIHVucGFja2VkLmdldERlc3REaXJlY3RvcnkoKS5lcXVhbHMoIGdldERlc3REaXJlY3RvcnkoKSApICkKLS8vICAgICAgICAgICAgICAgIHsKLS8vICAgICAgICAgICAgICAgICAgICBlcXVhbCA9IHRydWU7Ci0vLyAgICAgICAgICAgICAgICB9Ci0vLyAgICAgICAgICAgIH0KLS8vCi0vLyAgICAgICAgICAgIHJldHVybiBlcXVhbDsKLS8vICAgICAgICB9Ci0vLyAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvVW5BcmNoaXZlcldpdGhFeGNlcHRpb24uamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9VbkFyY2hpdmVyV2l0aEV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQyM2MzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9zdHVicy9VbkFyY2hpdmVyV2l0aEV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHViczsKLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKgotICogQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQGF1dGhvciBFZHdpbiBQdW56YWxhbgotICovCi1wdWJsaWMgY2xhc3MgVW5BcmNoaXZlcldpdGhFeGNlcHRpb24KLSAgICBleHRlbmRzIFVuQXJjaGl2ZXJTdHViCi17Ci0gICAgcHVibGljIHZvaWQgZXh0cmFjdCgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbiggImV4Y2VwdGlvbiBleHBsaWNpdGx5IHRocm93biBmb3IgdGVzdGluZyIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvV2FyQXJjaGl2ZXJTdHViLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvc3R1YnMvV2FyQXJjaGl2ZXJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NjhiOTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3N0dWJzL1dhckFyY2hpdmVyU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnM7Ci0KLS8qCi0gKiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIud2FyLldhckFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIEBhdXRob3IgRWR3aW4gUHVuemFsYW4KLSAqLwotcHVibGljIGNsYXNzIFdhckFyY2hpdmVyU3R1YgotICAgIGV4dGVuZHMgV2FyQXJjaGl2ZXIKLXsKLSAgICBwcml2YXRlIE1hcCBmaWxlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICBwcml2YXRlIEZpbGUgZGVzdEZpbGU7Ci0KLSAgICBwcml2YXRlIGludCBmaWxlTW9kZSA9IDA7Ci0KLSAgICBwcml2YXRlIGludCBkaXJNb2RlID0gMDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpbmNsdWRlRW1wdHlEaXJzID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlV2VieG1sID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgdm9pZCBjcmVhdGVBcmNoaXZlKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZGVzdEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICBkZXN0RmlsZS5kZWxldGUoKTsKLQotICAgICAgICBpZiAoICFkZXN0RmlsZS5jcmVhdGVOZXdGaWxlKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZXJFeGNlcHRpb24oICJVbmFibGUgdG8gY3JlYXRlIGFyY2hpdmUgZmlsZTogIiArIGRlc3RGaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoIEZpbGUgZmlsZSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYWRkRGlyZWN0b3J5KCBmaWxlLCAiIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggRmlsZSBmaWxlLCBTdHJpbmcgc3RyaW5nICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhZGREaXJlY3RvcnkoIGZpbGUsIHN0cmluZywgbnVsbCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggRmlsZSBmaWxlLCBTdHJpbmdbXSBzdHJpbmdzLCBTdHJpbmdbXSBzdHJpbmdzMSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYWRkRGlyZWN0b3J5KCBmaWxlLCBmaWxlLmdldE5hbWUoKSwgc3RyaW5ncywgc3RyaW5nczEgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoIEZpbGUgZmlsZSwgU3RyaW5nIHN0cmluZywgU3RyaW5nW10gaW5jbHVkZXMsIFN0cmluZ1tdIGV4Y2x1ZGVzICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJBZGRpbmcgZGlyICIgKyBmaWxlLmdldFBhdGgoKSApOwotCi0gICAgICAgIGZpbGVzLnB1dCggZmlsZSwgbmV3IEFyY2hpdmVyRmlsZSggZmlsZSwgc3RyaW5nLCBpbmNsdWRlcywgZXhjbHVkZXMgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoIEZpbGUgZmlsZSwgU3RyaW5nIHN0cmluZyApCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYWRkRmlsZSggZmlsZSwgc3RyaW5nLCAwICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZSggRmlsZSBmaWxlLCBTdHJpbmcgc3RyaW5nLCBpbnQgaSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQWRkaW5nIGZpbGUgIiArIGZpbGUuZ2V0UGF0aCgpICk7Ci0KLSAgICAgICAgQXJjaGl2ZXJGaWxlIGFyY2hpdmVyRmlsZSA9IG5ldyBBcmNoaXZlckZpbGUoIGZpbGUsIHN0cmluZywgbnVsbCwgbnVsbCApOwotCi0gICAgICAgIGFyY2hpdmVyRmlsZS5zZXRGaWxlTW9kZSggaSApOwotCi0gICAgICAgIGZpbGVzLnB1dCggZmlsZSwgYXJjaGl2ZXJGaWxlICk7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0RGVzdEZpbGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc3RGaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc3RGaWxlKCBGaWxlIGZpbGUgKQotICAgIHsKLSAgICAgICAgZGVzdEZpbGUgPSBmaWxlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRGaWxlTW9kZSggaW50IGkgKQotICAgIHsKLSAgICAgICAgZmlsZU1vZGUgPSBpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEZpbGVNb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RGlyZWN0b3J5TW9kZSggaW50IGkgKQotICAgIHsKLSAgICAgICAgZGlyTW9kZSA9IGk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXREZWZhdWx0RGlyZWN0b3J5TW9kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGlyTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlRW1wdHlEaXJzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpbmNsdWRlRW1wdHlEaXJzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVFbXB0eURpcnMoIGJvb2xlYW4gYiApCi0gICAgewotICAgICAgICBpbmNsdWRlRW1wdHlEaXJzID0gYjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwIGdldEZpbGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVXZWJ4bWwoIGJvb2xlYW4gaWdub3JlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaWdub3JlV2VieG1sID0gaWdub3JlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGdldElnbm9yZVdlYnhtbCgpCi0gICAgewotICAgICAgICByZXR1cm4gaWdub3JlV2VieG1sOwotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBBcmNoaXZlckZpbGUKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRmlsZSBmaWxlOwotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIG91dHB1dE5hbWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmdbXSBpbmNsdWRlcywgZXhjbHVkZXM7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmlsZU1vZGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBBcmNoaXZlckZpbGUoIEZpbGUgZmlsZSwgU3RyaW5nIG91dHB1dE5hbWUsIFN0cmluZ1tdIGluY2x1ZGVzLCBTdHJpbmdbXSBleGNsdWRlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICAgICAgICB0aGlzLm91dHB1dE5hbWUgPSBvdXRwdXROYW1lOwotICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IGluY2x1ZGVzOwotICAgICAgICAgICAgdGhpcy5leGNsdWRlcyA9IGV4Y2x1ZGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0RmlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RmlsZSggRmlsZSBmaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0TmFtZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvdXRwdXROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0TmFtZSggU3RyaW5nIG91dHB1dE5hbWUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm91dHB1dE5hbWUgPSBvdXRwdXROYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoIFN0cmluZ1tdIGluY2x1ZGVzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pbmNsdWRlcyA9IGluY2x1ZGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldEV4Y2x1ZGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGV4Y2x1ZGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoIFN0cmluZ1tdIGV4Y2x1ZGVzICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5leGNsdWRlcyA9IGV4Y2x1ZGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRGaWxlTW9kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmaWxlTW9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbGVNb2RlKCBpbnQgZmlsZU1vZGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZpbGVNb2RlID0gZmlsZU1vZGU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L01BU1NFTUJMWS05OC1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvTUFTU0VNQkxZLTk4LXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTNlYmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvTUFTU0VNQkxZLTk4LXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L01BU1NFTUJMWS05OC90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L01BU1NFTUJMWS05OC93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5NQVNTRU1CTFktOTg8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvTUFTU0VNQkxZLTk4L2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvTUFTU0VNQkxZLTk4L3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L05vU3VjaEFyY2hpdmVyRXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9Ob1N1Y2hBcmNoaXZlckV4Y2VwdGlvbi1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0N2M1Zi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L05vU3VjaEFyY2hpdmVyRXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L05vU3VjaEFyY2hpdmVyRXhjZXB0aW9uL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9Ob1N1Y2hBcmNoaXZlckV4Y2VwdGlvbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L05vU3VjaEFyY2hpdmVyRXhjZXB0aW9uL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24vc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2NsYXNzaWZpZXItcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2NsYXNzaWZpZXItcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzNjIzYTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9jbGFzc2lmaWVyLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2NsYXNzaWZpZXIvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9jbGFzc2lmaWVyL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+dGVzdC1oYXJuZXNzPC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9ySWQ+c2ltcGxlPC9kZXNjcmlwdG9ySWQ+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2NsYXNzaWZpZXIvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9jbGFzc2lmaWVyL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9jb21wb25lbnQtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2NvbXBvbmVudC1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzc0NmM5NC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2NvbXBvbmVudC1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9jb21wb25lbnQvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9jb21wb25lbnQvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+ZW1wdHk8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvY29tcG9uZW50L2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvY29tcG9uZW50L3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1kZWZhdWx0LXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtZGVmYXVsdC1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNlMTBkMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1kZWZhdWx0LXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtZGVmYXVsdC90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2RlcFNldC1kZWZhdWx0L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5NYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5NYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5kZXBlbmRlbmN5U2V0LWRlZmF1bHQ8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LWRlZmF1bHQvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtZGVmYXVsdC9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtZXhjbHVkZXMtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1leGNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2YTI0MC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1leGNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtZXhjbHVkZXMvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtZXhjbHVkZXMvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLk1hdmVuUHJvamVjdFdpdGhBcnRpZmFjdHNTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLk1hdmVuUHJvamVjdFdpdGhBcnRpZmFjdHNTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmRlcGVuZGVuY3lTZXQtZXhjbHVkZXM8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LWV4Y2x1ZGVzL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LWV4Y2x1ZGVzL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1maWxlbmFtZS1tYXBwaW5nLWFuZC1jbGFzc2lmaWVyLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtZmlsZW5hbWUtbWFwcGluZy1hbmQtY2xhc3NpZmllci1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTQ3YjdjMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1maWxlbmFtZS1tYXBwaW5nLWFuZC1jbGFzc2lmaWVyLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2RlcFNldC1maWxlbmFtZS1tYXBwaW5nLWFuZC1jbGFzc2lmaWVyL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LWZpbGVuYW1lLW1hcHBpbmctYW5kLWNsYXNzaWZpZXIvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLk1hdmVuUHJvamVjdFdpdGhEZXBlbmRlbmN5Q2xhc3NpZmllclN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuTWF2ZW5Qcm9qZWN0V2l0aERlcGVuZGVuY3lDbGFzc2lmaWVyU3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5kZXBlbmRlbmN5U2V0LWZpbGVuYW1lLW1hcHBpbmctYW5kLWNsYXNzaWZpZXI8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LWZpbGVuYW1lLW1hcHBpbmctYW5kLWNsYXNzaWZpZXIvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtZmlsZW5hbWUtbWFwcGluZy1hbmQtY2xhc3NpZmllci9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtZmlsZW5hbWUtbWFwcGluZy1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZGVwU2V0LWZpbGVuYW1lLW1hcHBpbmctcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDIzN2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtZmlsZW5hbWUtbWFwcGluZy1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtZmlsZW5hbWUtbWFwcGluZy90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2RlcFNldC1maWxlbmFtZS1tYXBwaW5nL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5NYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5NYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5kZXBlbmRlbmN5U2V0LWZpbGVuYW1lLW1hcHBpbmc8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LWZpbGVuYW1lLW1hcHBpbmcvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtZmlsZW5hbWUtbWFwcGluZy9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtaW5jbHVkZXMtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1pbmNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTNjMDc1YS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1pbmNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtaW5jbHVkZXMvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtaW5jbHVkZXMvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLk1hdmVuUHJvamVjdFdpdGhBcnRpZmFjdHNTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLk1hdmVuUHJvamVjdFdpdGhBcnRpZmFjdHNTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmRlcGVuZGVuY3lTZXQtaW5jbHVkZXM8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LWluY2x1ZGVzL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LWluY2x1ZGVzL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1zY29wZWQtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2RlcFNldC1zY29wZWQtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYjIyMjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtc2NvcGVkLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2RlcFNldC1zY29wZWQvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtc2NvcGVkL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5NYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5NYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5kZXBlbmRlbmN5U2V0LXNjb3BlZDwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtc2NvcGVkL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LXNjb3BlZC9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtdW5wYWNrLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9kZXBTZXQtdW5wYWNrLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTM5Yjg5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZGVwU2V0LXVucGFjay1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXBTZXQtdW5wYWNrL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LXVucGFjay93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuTWF2ZW5Qcm9qZWN0V2l0aEFydGlmYWN0c1N0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuTWF2ZW5Qcm9qZWN0V2l0aEFydGlmYWN0c1N0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+ZGVwZW5kZW5jeVNldC11bnBhY2s8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVwU2V0LXVucGFjay9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2RlcFNldC11bnBhY2svc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeS1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeS1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc1Y2JkYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2Rlc2NyaXB0b3JTb3VyY2VEaXJlY3RvcnktcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeS90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2Rlc2NyaXB0b3JTb3VyY2VEaXJlY3Rvcnkvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JTb3VyY2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5PC9kZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5PgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5L2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeS9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZUl0ZW0tZmlsZU1vZGUtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVJdGVtLWZpbGVNb2RlLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzQwNjE2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZUl0ZW0tZmlsZU1vZGUtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZUl0ZW0tZmlsZU1vZGUvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlSXRlbS1maWxlTW9kZS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5maWxlSXRlbS1maWxlTW9kZTwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlSXRlbS1maWxlTW9kZS9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVJdGVtLWZpbGVNb2RlL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVJdGVtLWZpbHRlci1maWxlLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlSXRlbS1maWx0ZXItZmlsZS1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTkyNjMxNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVJdGVtLWZpbHRlci1maWxlLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVJdGVtLWZpbHRlci1maWxlL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZUl0ZW0tZmlsdGVyLWZpbGUvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+ZmlsZUl0ZW0tZmlsdGVyLWZpbGU8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8ZmlsdGVycz4KLSAgICAgICAgICAgIDxmaWx0ZXI+dGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0L2ZpbHRlckZpbGUucHJvcGVydGllczwvZmlsdGVyPgotICAgICAgICAgIDwvZmlsdGVycz4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZUl0ZW0tZmlsdGVyLWZpbGUvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlSXRlbS1maWx0ZXItZmlsZS9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlSXRlbS1maWx0ZXJlZC1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZUl0ZW0tZmlsdGVyZWQtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNGY4NjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlSXRlbS1maWx0ZXJlZC1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlSXRlbS1maWx0ZXJlZC90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVJdGVtLWZpbHRlcmVkL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmZpbGVJdGVtLWZpbHRlcmVkPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVJdGVtLWZpbHRlcmVkL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZUl0ZW0tZmlsdGVyZWQvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZUl0ZW0tbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVJdGVtLWxpbmVFbmRpbmdzLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzBmMGY0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZUl0ZW0tbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZUl0ZW0tbGluZUVuZGluZ3MvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlSXRlbS1saW5lRW5kaW5ncy93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5maWxlSXRlbS1saW5lRW5kaW5nczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlSXRlbS1saW5lRW5kaW5ncy9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVJdGVtLWxpbmVFbmRpbmdzL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVJdGVtLW91dHB1dC1uYW1lLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlSXRlbS1vdXRwdXQtbmFtZS1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwOTIxZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVJdGVtLW91dHB1dC1uYW1lLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVJdGVtLW91dHB1dC1uYW1lL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZUl0ZW0tb3V0cHV0LW5hbWUvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+ZmlsZUl0ZW0tb3V0cHV0LW5hbWU8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZUl0ZW0tb3V0cHV0LW5hbWUvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlSXRlbS1vdXRwdXQtbmFtZS9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlSXRlbS1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZUl0ZW0tcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MWNhYjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlSXRlbS1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlSXRlbS90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVJdGVtL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmZpbGVJdGVtPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVJdGVtL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZUl0ZW0vc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1hcmNoaXZlQmFzZURpci1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1hcmNoaXZlQmFzZURpci1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5MGViYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtYXJjaGl2ZUJhc2VEaXItcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC1hcmNoaXZlQmFzZURpci90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtYXJjaGl2ZUJhc2VEaXIvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+ZmlsZVNldC1hcmNoaXZlQmFzZURpcmVjdG9yeTwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWFyY2hpdmVCYXNlRGlyL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC1hcmNoaXZlQmFzZURpci9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICA8YXJjaGl2ZUJhc2VEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1jbGFzc2VzPC9hcmNoaXZlQmFzZURpcmVjdG9yeT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlU2V0LWNybGYtbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtY3JsZi1saW5lRW5kaW5ncy1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwZDA3NC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtY3JsZi1saW5lRW5kaW5ncy1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWNybGYtbGluZUVuZGluZ3MvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWNybGYtbGluZUVuZGluZ3Mvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIi8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIi8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIi8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+ZmlsZVNldC1jcmxmLWxpbmVFbmRpbmdzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtY3JsZi1saW5lRW5kaW5ncy9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtY3JsZi1saW5lRW5kaW5ncy9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlU2V0LWRvZXNudC1leGlzdC1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1kb2VzbnQtZXhpc3QtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZTNmMWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlU2V0LWRvZXNudC1leGlzdC1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA1IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWRvZXNudC1leGlzdC90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtZG9lc250LWV4aXN0L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmZpbGVTZXQtZG9lc250LWV4aXN0PC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtZG9lc250LWV4aXN0L2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC1kb2VzbnQtZXhpc3Qvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgPGFyY2hpdmVCYXNlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtY2xhc3NlczwvYXJjaGl2ZUJhc2VEaXJlY3Rvcnk+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1kb3MtbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtZG9zLWxpbmVFbmRpbmdzLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzdkZmFiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1kb3MtbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC1kb3MtbGluZUVuZGluZ3MvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWRvcy1saW5lRW5kaW5ncy93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5maWxlU2V0LWRvcy1saW5lRW5kaW5nczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWRvcy1saW5lRW5kaW5ncy9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtZG9zLWxpbmVFbmRpbmdzL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtaW5jbHVkZXMtZXhjbHVkZXMtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtaW5jbHVkZXMtZXhjbHVkZXMtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2MGNlZjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlU2V0LWluY2x1ZGVzLWV4Y2x1ZGVzLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtaW5jbHVkZS1leGNsdWRlL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC1pbmNsdWRlLWV4Y2x1ZGUvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+ZmlsZVNldC1pbmNsdWRlcy1leGNsdWRlczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWluY2x1ZGUtZXhjbHVkZS9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtaW5jbHVkZS1leGNsdWRlL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtbGYtbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtbGYtbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZGMwNTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlU2V0LWxmLWxpbmVFbmRpbmdzLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtbGYtbGluZUVuZGluZ3MvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWxmLWxpbmVFbmRpbmdzL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmZpbGVTZXQtbGYtbGluZUVuZGluZ3M8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC1sZi1saW5lRW5kaW5ncy9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtbGYtbGluZUVuZGluZ3Mvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1saW5lRW5kaW5ncy1leGNlcHRpb24tcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtbGluZUVuZGluZ3MtZXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDljMzUwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1saW5lRW5kaW5ncy1leGNlcHRpb24tcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LWxpbmVFbmRpbmdzLWV4Y2VwdGlvbi90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtbGluZUVuZGluZ3MtZXhjZXB0aW9uL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmZpbGVTZXQtbGluZUVuZGluZ3MtZXhjZXB0aW9uPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtbGluZUVuZGluZ3MtZXhjZXB0aW9uL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC1saW5lRW5kaW5ncy1leGNlcHRpb24vc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1uby1kaXJlY3RvcnktcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtbm8tZGlyZWN0b3J5LXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTVlODdjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC1uby1kaXJlY3RvcnktcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC1uby1kaXJlY3RvcnkvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LW5vLWRpcmVjdG9yeS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5maWxlU2V0LW5vLWRpcmVjdG9yeTwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LW5vLWRpcmVjdG9yeS9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQtbm8tZGlyZWN0b3J5L3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2ZpbGVTZXQtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZjI4ZTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlU2V0LXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmZpbGVTZXQ8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2ZpbGVTZXQvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvZmlsZVNldC11bml4LWxpbmVFbmRpbmdzLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlU2V0LXVuaXgtbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZTAyYTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9maWxlU2V0LXVuaXgtbGluZUVuZGluZ3MtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC11bml4LWxpbmVFbmRpbmdzL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvZmlsZVNldC11bml4LWxpbmVFbmRpbmdzL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmZpbGVTZXQtdW5peC1saW5lRW5kaW5nczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LXVuaXgtbGluZUVuZGluZ3MvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9maWxlU2V0LXVuaXgtbGluZUVuZGluZ3Mvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvaW5jbHVkZVNpdGUtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L2luY2x1ZGVTaXRlLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzk3YzU4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvaW5jbHVkZVNpdGUtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvaW5jbHVkZVNpdGUvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9pbmNsdWRlU2l0ZS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsaWVzL3NpbXBsZS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L2luY2x1ZGVTaXRlL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvaW5jbHVkZVNpdGUvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+dHJ1ZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbWFuaWZlc3QtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21hbmlmZXN0LXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTFlOTljLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbWFuaWZlc3QtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvc2ltcGxlLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuYXBhY2hlLnNhbXBsZS5tYWluPC9tYWluQ2xhc3M+Ci0gICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9tYW5pZmVzdEZpbGUtRmlsZU5vdEZvdW5kRXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9tYW5pZmVzdEZpbGUtRmlsZU5vdEZvdW5kRXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODA4YmUyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlLUZpbGVOb3RGb3VuZEV4Y2VwdGlvbi1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tYW5pZmVzdEZpbGUtTm9TdWNoRmlsZUV4Y2VwdGlvbi90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21hbmlmZXN0RmlsZS1Ob1N1Y2hGaWxlRXhjZXB0aW9uL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvc2ltcGxlLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlLU5vU3VjaEZpbGVFeGNlcHRpb24vYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tYW5pZmVzdEZpbGUtTm9TdWNoRmlsZUV4Y2VwdGlvbi9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICA8bWFuaWZlc3RGaWxlPiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tYW5pZmVzdEZpbGUvbm8tc3VjaC1tYW5pZmVzdC5maWxlPC9tYW5pZmVzdEZpbGU+Ci0gICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21hbmlmZXN0RmlsZS1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDE1NGYwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbWFuaWZlc3RGaWxlLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21hbmlmZXN0RmlsZS90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21hbmlmZXN0RmlsZS93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsaWVzL3NpbXBsZS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21hbmlmZXN0RmlsZS9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21hbmlmZXN0RmlsZS9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICA8bWFuaWZlc3RGaWxlPiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tYW5pZmVzdEZpbGUvdGVzdC1tYW5pZmVzdC5maWxlPC9tYW5pZmVzdEZpbGU+Ci0gICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21pbi1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbWluLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjVjNjMyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbWluLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9taW4vdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9taW4vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9zaW1wbGUueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9taW4vYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9taW4vc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21vZHVsZVNldC1leGNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbW9kdWxlU2V0LWV4Y2x1ZGVzLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWRiNTIyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbW9kdWxlU2V0LWV4Y2x1ZGVzLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1leGNsdWRlcy90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1leGNsdWRlcy93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPgotICAgICAgICAgICAgPHJlYWN0b3JQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5SZWFjdG9yTWF2ZW5Qcm9qZWN0U3R1YiIvPgotICAgICAgICAgICAgPHJlYWN0b3JQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5SZWFjdG9yTWF2ZW5Qcm9qZWN0U3R1YiIvPgotICAgICAgICAgIDwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiI+Ci0gICAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0LWV4Y2x1ZGVzPC9iYXNlZGlyPgotICAgICAgICAgIDwvZXhlY3V0ZWRQcm9qZWN0PgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPm1vZHVsZVNldC1leGNsdWRlczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQtZXhjbHVkZXMvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQtZXhjbHVkZXMvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbW9kdWxlU2V0LWluY2x1ZGUtZGVwZW5kZW5jaWVzLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9tb2R1bGVTZXQtaW5jbHVkZS1kZXBlbmRlbmNpZXMtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyYzc0MGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9tb2R1bGVTZXQtaW5jbHVkZS1kZXBlbmRlbmNpZXMtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0LWluY2x1ZGUtZGVwZW5kZW5jaWVzL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0LWluY2x1ZGUtZGVwZW5kZW5jaWVzL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgICA8cmVhY3RvclByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLlJlYWN0b3JNYXZlblByb2plY3RTdHViIi8+Ci0gICAgICAgICAgICA8cmVhY3RvclByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLlJlYWN0b3JNYXZlblByb2plY3RTdHViIi8+Ci0gICAgICAgICAgPC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIj4KLSAgICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQtaW5jbHVkZS1kZXBlbmRlbmNpZXM8L2Jhc2VkaXI+Ci0gICAgICAgICAgPC9leGVjdXRlZFByb2plY3Q+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+bW9kdWxlU2V0LWluY2x1ZGUtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1pbmNsdWRlLWRlcGVuZGVuY2llcy9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1pbmNsdWRlLWRlcGVuZGVuY2llcy9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9tb2R1bGVTZXQtaW5jbHVkZXMtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21vZHVsZVNldC1pbmNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0NmJhNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21vZHVsZVNldC1pbmNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQtaW5jbHVkZXMvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQtaW5jbHVkZXMvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICAgIDxyZWFjdG9yUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIiLz4KLSAgICAgICAgICAgIDxyZWFjdG9yUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIiLz4KLSAgICAgICAgICA8L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiPgotICAgICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1pbmNsdWRlczwvYmFzZWRpcj4KLSAgICAgICAgICA8L2V4ZWN1dGVkUHJvamVjdD4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5tb2R1bGVTZXQtaW5jbHVkZXM8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0LWluY2x1ZGVzL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0LWluY2x1ZGVzL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21vZHVsZVNldC1wYWNrZWQtaW5jbHVkaW5nLWRlcGVuZGVuY2llcy1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbW9kdWxlU2V0LXBhY2tlZC1pbmNsdWRpbmctZGVwZW5kZW5jaWVzLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDI2Y2E0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbW9kdWxlU2V0LXBhY2tlZC1pbmNsdWRpbmctZGVwZW5kZW5jaWVzLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1wYWNrZWQtaW5jbHVkaW5nLWRlcGVuZGVuY2llcy90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1wYWNrZWQtaW5jbHVkaW5nLWRlcGVuZGVuY2llcy93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPgotICAgICAgICAgICAgPHJlYWN0b3JQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5SZWFjdG9yTWF2ZW5Qcm9qZWN0U3R1YiIvPgotICAgICAgICAgIDwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiI+Ci0gICAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0LXBhY2tlZC1pbmNsdWRpbmctZGVwZW5kZW5jaWVzPC9iYXNlZGlyPgotICAgICAgICAgIDwvZXhlY3V0ZWRQcm9qZWN0PgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPm1vZHVsZVNldC1wYWNrZWQtaW5jbHVkaW5nLWRlcGVuZGVuY2llczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQtcGFja2VkLWluY2x1ZGluZy1kZXBlbmRlbmNpZXMvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQtcGFja2VkLWluY2x1ZGluZy1kZXBlbmRlbmNpZXMvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbW9kdWxlU2V0LXBhY2tlZC1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvbW9kdWxlU2V0LXBhY2tlZC1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY1NzJlMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21vZHVsZVNldC1wYWNrZWQtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0LXBhY2tlZC90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1wYWNrZWQvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICAgIDxyZWFjdG9yUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIiLz4KLSAgICAgICAgICAgIDxyZWFjdG9yUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIiLz4KLSAgICAgICAgICA8L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiPgotICAgICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldC1wYWNrZWQ8L2Jhc2VkaXI+Ci0gICAgICAgICAgPC9leGVjdXRlZFByb2plY3Q+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+bW9kdWxlU2V0LXBhY2tlZDwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQtcGFja2VkL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0LXBhY2tlZC9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9tb2R1bGVTZXQtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21vZHVsZVNldC1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY2NTE2My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L21vZHVsZVNldC1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9tb2R1bGVTZXQvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICAgIDxyZWFjdG9yUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIiLz4KLSAgICAgICAgICAgIDxyZWFjdG9yUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIiLz4KLSAgICAgICAgICA8L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiPgotICAgICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L21vZHVsZVNldDwvYmFzZWRpcj4KLSAgICAgICAgICA8L2V4ZWN1dGVkUHJvamVjdD4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5tb2R1bGVTZXQ8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0L2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbW9kdWxlU2V0L3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3BsZXh1cy1jb21wb25lbnRzLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9wbGV4dXMtY29tcG9uZW50cy1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMwMTFlOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3BsZXh1cy1jb21wb25lbnRzLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3BsZXh1cy1jb21wb25lbnRzL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcGxleHVzLWNvbXBvbmVudHMvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9wbGV4dXMtY29tcG9uZW50cy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3BsZXh1cy1jb21wb25lbnRzL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcGxleHVzLWNvbXBvbmVudHMvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LWV4Y2x1ZGVzLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1leGNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI4NTAxNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LWV4Y2x1ZGVzLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LWV4Y2x1ZGVzL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtZXhjbHVkZXMvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+cmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtZXhjbHVkZXM8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtZXhjbHVkZXMvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1leGNsdWRlcy9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+dHJ1ZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1pbmNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtaW5jbHVkZXMtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGRkNTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1pbmNsdWRlcy1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1pbmNsdWRlcy90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LWluY2x1ZGVzL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPnJlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LWluY2x1ZGVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LWluY2x1ZGVzL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtaW5jbHVkZXMvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDllODNhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudDwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50L3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3JlcG9zaXRvcnktcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3JlcG9zaXRvcnktcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDA2M2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9yZXBvc2l0b3J5LXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3JlcG9zaXRvcnkvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9yZXBvc2l0b3J5L3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcmVwb3NpdG9yeS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcmVwb3NpdG9yeS9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3JlcG9zaXRvcnkvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvcmVwb3NpdG9yeS13aXRoLW1ldGFkYXRhLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9yZXBvc2l0b3J5LXdpdGgtbWV0YWRhdGEtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZDhjODAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS9yZXBvc2l0b3J5LXdpdGgtbWV0YWRhdGEtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcmVwb3NpdG9yeS13aXRoLW1ldGFkYXRhL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvcmVwb3NpdG9yeS13aXRoLW1ldGFkYXRhL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPnJlcG9zaXRvcnktd2l0aC1tZXRhZGF0YTwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9yZXBvc2l0b3J5LXdpdGgtbWV0YWRhdGEvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9yZXBvc2l0b3J5LXdpdGgtbWV0YWRhdGEvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvdGFyLWJ6Mi1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvdGFyLWJ6Mi1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiYjhlMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3Rhci1iejItcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvdGFyLWJ6Mi90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rhci1iejIvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy90YXItYnoyLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPmZhaWw8L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvdGFyLWJ6Mi9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rhci1iejIvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3Rhci1nei1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvdGFyLWd6LXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjZiZjc4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvdGFyLWd6LXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rhci1nei90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rhci1nei93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsaWVzL3Rhci1nei54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rhci1nei9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rhci1nei9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvdGJ6Mi1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvdGJ6Mi1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWI0Y2E3Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3RiejItcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvdGJ6Mi90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3RiejIvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy90YnoyLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPmZhaWw8L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvdGJ6Mi9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3RiejIvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvdGJ6Mi90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3RiejIvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy90YnoyLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPmZhaWw8L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvdGJ6Mi9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3RiejIvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Fzc2VtYmx5L3Rnei1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvdGd6LXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjExOGU2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvdGd6LXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rnei90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rnei93b3JrPC93b3JrRGlyZWN0b3J5PgotICAgICAgICAgIDxhcmNoaXZlck1hbmFnZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPjwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxleGVjdXRlZFByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsaWVzL3Rnei54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT53YXJuPC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8dGVtcFJvb3Q+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rnei9hcmNoaXZlLXRtcDwvdGVtcFJvb3Q+Ci0gICAgICAgICAgPHNpdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3Rnei9zaXRlPC9zaXRlRGlyZWN0b3J5PgotICAgICAgICAgIDxpbmNsdWRlU2l0ZT5mYWxzZTwvaW5jbHVkZVNpdGU+Ci0gICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXNzZW1ibHkvd2FyLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS93YXItcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTI1NGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hc3NlbWJseS93YXItcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvd2FyL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvd2FyL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvd2FyLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPndhcm48L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDx0ZW1wUm9vdD4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvd2FyL2FyY2hpdmUtdG1wPC90ZW1wUm9vdD4KLSAgICAgICAgICA8c2l0ZURpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvd2FyL3NpdGU8L3NpdGVEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVTaXRlPmZhbHNlPC9pbmNsdWRlU2l0ZT4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hdHRhY2hlZC9kZXBTZXQtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2F0dGFjaGVkL2RlcFNldC1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0NzFlMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2F0dGFjaGVkL2RlcFNldC1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hdHRhY2hlZC9kZXBTZXQvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5hc3NlbWJseTwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hdHRhY2hlZC9kZXBTZXQvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLk1hdmVuUHJvamVjdFdpdGhBcnRpZmFjdHNTdHViIiAvPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmRlcGVuZGVuY3lTZXQtZGVmYXVsdDwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hdHRhY2hlZC9kZXBTZXQvYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hdHRhY2hlZC9kZXBTZXQvc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvYXR0YWNoZWQvbWluLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hdHRhY2hlZC9taW4tcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjBlYzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9hdHRhY2hlZC9taW4tcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXR0YWNoZWQvbWluL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYXR0YWNoZWQvbWluL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9zaW1wbGUueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+d2FybjwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHRlbXBSb290PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hdHRhY2hlZC9taW4vYXJjaGl2ZS10bXA8L3RlbXBSb290PgotICAgICAgICAgIDxzaXRlRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9hdHRhY2hlZC9taW4vc2l0ZTwvc2l0ZURpcmVjdG9yeT4KLSAgICAgICAgICA8aW5jbHVkZVNpdGU+ZmFsc2U8L2luY2x1ZGVTaXRlPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Jhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3Qvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXBsdWdpbkNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2Jhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3Qvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXBsdWdpbkNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzMzI1MjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9iYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0L291dHB1dEZpbGVOYW1lTWFwcGluZy1wbHVnaW5Db25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5CYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0JFR3b0RlcGVuZGVuY3lSZWFjdG9yUHJvamVjdFN0dWIiPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGFja2FnZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZGVwT25lQXJ0aWZhY3RJZD50ZXN0PC9kZXBPbmVBcnRpZmFjdElkPgotICAgICAgICAgICAgPGRlcE9uZUdyb3VwSWQ+b3JnLnRlc3Q8L2RlcE9uZUdyb3VwSWQ+Ci0gICAgICAgICAgICA8ZGVwT25lVmVyc2lvbj4xPC9kZXBPbmVWZXJzaW9uPgotICAgICAgICAgICAgPGRlcE9uZUZpbGU+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Jhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3Qvb3V0cHV0RmlsZU5hbWVNYXBwaW5nL2RlcGVuZGVuY2llcy90ZXN0LmphcjwvZGVwT25lRmlsZT4KLSAgICAgICAgICAgIDxkZXBUd29BcnRpZmFjdElkPnRlc3QyPC9kZXBUd29BcnRpZmFjdElkPgotICAgICAgICAgICAgPGRlcFR3b0dyb3VwSWQ+b3JnLnRlc3QuMjwvZGVwVHdvR3JvdXBJZD4KLSAgICAgICAgICAgIDxkZXBUd29WZXJzaW9uPjI8L2RlcFR3b1ZlcnNpb24+Ci0gICAgICAgICAgICA8ZGVwVHdvRmlsZT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYmFzaWNBYnN0cmFjdEFzc2VtYmx5TW9qb0ZlYXR1cmVzVGVzdC9vdXRwdXRGaWxlTmFtZU1hcHBpbmcvZGVwZW5kZW5jaWVzL3Rlc3QyLmphcjwvZGVwVHdvRmlsZT4KLSAgICAgICAgICA8L3Byb2plY3Q+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5CYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0JFR3b0RlcGVuZGVuY3lSZWFjdG9yUHJvamVjdFN0dWIiPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGFja2FnZXI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZGVwT25lQXJ0aWZhY3RJZD50ZXN0PC9kZXBPbmVBcnRpZmFjdElkPgotICAgICAgICAgICAgPGRlcE9uZUdyb3VwSWQ+b3JnLnRlc3Q8L2RlcE9uZUdyb3VwSWQ+Ci0gICAgICAgICAgICA8ZGVwT25lVmVyc2lvbj4xPC9kZXBPbmVWZXJzaW9uPgotICAgICAgICAgICAgPGRlcE9uZUZpbGU+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Jhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3Qvb3V0cHV0RmlsZU5hbWVNYXBwaW5nL2RlcGVuZGVuY2llcy90ZXN0LmphcjwvZGVwT25lRmlsZT4KLSAgICAgICAgICAgIDxkZXBUd29BcnRpZmFjdElkPnRlc3QyPC9kZXBUd29BcnRpZmFjdElkPgotICAgICAgICAgICAgPGRlcFR3b0dyb3VwSWQ+b3JnLnRlc3QuMjwvZGVwVHdvR3JvdXBJZD4KLSAgICAgICAgICAgIDxkZXBUd29WZXJzaW9uPjI8L2RlcFR3b1ZlcnNpb24+Ci0gICAgICAgICAgICA8ZGVwVHdvRmlsZT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYmFzaWNBYnN0cmFjdEFzc2VtYmx5TW9qb0ZlYXR1cmVzVGVzdC9vdXRwdXRGaWxlTmFtZU1hcHBpbmcvZGVwZW5kZW5jaWVzL3Rlc3QyLmphcjwvZGVwVHdvRmlsZT4KLSAgICAgICAgICA8L2V4ZWN1dGVkUHJvamVjdD4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9iYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0L291dHB1dEZpbGVOYW1lTWFwcGluZy1hc3NlbWJseURlc2NyaXB0b3IueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYmFzaWNBYnN0cmFjdEFzc2VtYmx5TW9qb0ZlYXR1cmVzVGVzdC9vdXRwdXRGaWxlTmFtZU1hcHBpbmcvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5iYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0LW91cHV0RmlsZU5hbWVNYXBwaW5nPC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Jhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3Qvb3V0cHV0RmlsZU5hbWVNYXBwaW5nL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQmFzaWNBYnN0cmFjdEFzc2VtYmx5TW9qb0ZlYXR1cmVzVGVzdCRGaWxlTG9nZ2luZ0FyY2hpdmVyTWFuYWdlclN0dWIiIC8+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeT4ke2xvY2FsUmVwb3NpdG9yeX08L2xvY2FsUmVwb3NpdG9yeT4KLSAgICAgICAgICA8cmVhY3RvclByb2plY3RzPgotICAgICAgICAgICAgPHJlYWN0b3JQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5CYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0JFR3b0RlcGVuZGVuY3lSZWFjdG9yUHJvamVjdFN0dWIiPgotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYWNrYWdlcjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgIDx2ZXJzaW9uPjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgIDxkZXBPbmVBcnRpZmFjdElkPnRlc3Q8L2RlcE9uZUFydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgIDxkZXBPbmVHcm91cElkPm9yZy50ZXN0PC9kZXBPbmVHcm91cElkPgotICAgICAgICAgICAgICA8ZGVwT25lVmVyc2lvbj4xPC9kZXBPbmVWZXJzaW9uPgotICAgICAgICAgICAgICA8ZGVwT25lRmlsZT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvYmFzaWNBYnN0cmFjdEFzc2VtYmx5TW9qb0ZlYXR1cmVzVGVzdC9vdXRwdXRGaWxlTmFtZU1hcHBpbmcvZGVwZW5kZW5jaWVzL3Rlc3QuamFyPC9kZXBPbmVGaWxlPgotICAgICAgICAgICAgICA8ZGVwVHdvQXJ0aWZhY3RJZD50ZXN0MjwvZGVwVHdvQXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPGRlcFR3b0dyb3VwSWQ+b3JnLnRlc3QuMjwvZGVwVHdvR3JvdXBJZD4KLSAgICAgICAgICAgICAgPGRlcFR3b1ZlcnNpb24+MjwvZGVwVHdvVmVyc2lvbj4KLSAgICAgICAgICAgICAgPGRlcFR3b0ZpbGU+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2Jhc2ljQWJzdHJhY3RBc3NlbWJseU1vam9GZWF0dXJlc1Rlc3Qvb3V0cHV0RmlsZU5hbWVNYXBwaW5nL2RlcGVuZGVuY2llcy90ZXN0Mi5qYXI8L2RlcFR3b0ZpbGU+Ci0gICAgICAgICAgICA8L3JlYWN0b3JQcm9qZWN0PgotICAgICAgICAgIDwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvZGlyZWN0b3J5LWlubGluZS9kZXBlbmRlbmN5LXNldC1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvZGlyZWN0b3J5LWlubGluZS9kZXBlbmRlbmN5LXNldC1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2ZjA1MC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS1pbmxpbmUvZGVwZW5kZW5jeS1zZXQtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LWRlZmF1bHQueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLk1hdmVuUHJvamVjdFdpdGhBcnRpZmFjdHNTdHViIiAvPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2RpcmVjdG9yeS1pbmxpbmNlL2RlcGVuZGVuY3ktc2V0L3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+ZGlyZWN0b3J5LWRlcGVuZGVuY3ktc2V0PC9maW5hbE5hbWU+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnktaW5saW5lL21pbi1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvZGlyZWN0b3J5LWlubGluZS9taW4tcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMjk3NzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnktaW5saW5lL21pbi1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9zaW1wbGUueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9kaXJlY3RvcnktaW5saW5lL21pbi90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmRpcmVjdG9yeS1pbmxpbmUtbWluPC9maW5hbE5hbWU+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnkvYXBwZW5kQXNzZW1ibHlJZC1mYWxzZS1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvZGlyZWN0b3J5L2FwcGVuZEFzc2VtYmx5SWQtZmFsc2UtcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjAwNDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnkvYXBwZW5kQXNzZW1ibHlJZC1mYWxzZS1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LWRlZmF1bHQueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5NYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YiIgLz4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9kaXJlY3RvcnkvYXBwZW5kQXNzZW1ibHlJZC1mYWxzZS90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPmRpcmVjdG9yeS1hcHBlbmRBc3NlbWJseUlkLWZhbHNlPC9maW5hbE5hbWU+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICA8Y2xhc3NpZmllcj5jbGFzc2lmaWVyPC9jbGFzc2lmaWVyPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnkvZGVwZW5kZW5jeS1zZXQtcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS9kZXBlbmRlbmN5LXNldC1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY1ZjEyYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS9kZXBlbmRlbmN5LXNldC1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LWRlZmF1bHQueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDxiYXNlZGlyPiR7YmFzZWRpcn08L2Jhc2VkaXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgICA8ZXhlY3V0ZWRQcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5NYXZlblByb2plY3RXaXRoQXJ0aWZhY3RzU3R1YiIgLz4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy9kaXJlY3RvcnkvZGVwZW5kZW5jeS1zZXQvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5kaXJlY3RvcnktZGVwZW5kZW5jeS1zZXQ8L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPnRydWU8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS9taW4tcGx1Z2luLWNvbmZpZy13aXRoLWV4Y2VwdGlvbnMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnkvbWluLXBsdWdpbi1jb25maWctd2l0aC1leGNlcHRpb25zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVkNWNhZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL2RpcmVjdG9yeS9taW4tcGx1Z2luLWNvbmZpZy13aXRoLWV4Y2VwdGlvbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcj4ke2Jhc2VkaXJ9L3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsaWVzL3NpbXBsZS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPGJhc2VkaXI+JHtiYXNlZGlyfTwvYmFzZWRpcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2RpcmVjdG9yeS1pbmxpbmUvbWluL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+ZGlyZWN0b3J5LWlubGluZS1taW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJXaXRoRXhjZXB0aW9uU3R1YiIgLz4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnkvbWluLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy9kaXJlY3RvcnkvbWluLXBsdWdpbi1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzJlNmM2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvZGlyZWN0b3J5L21pbi1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8YmFzZWRpcj4ke2Jhc2VkaXJ9PC9iYXNlZGlyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgPGV4ZWN1dGVkUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL2RpcmVjdG9yeS9taW4vdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT5kaXJlY3RvcnktbWluPC9maW5hbE5hbWU+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD50cnVlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy91bnBhY2svYXJjaGl2ZXItbWFuYWdlci1leGNlcHRpb24tcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL3VucGFjay9hcmNoaXZlci1tYW5hZ2VyLWV4Y2VwdGlvbi1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTM5ZjViMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL3VucGFjay9hcmNoaXZlci1tYW5hZ2VyLWV4Y2VwdGlvbi1wbHVnaW4tY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotPHByb2plY3Q+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvdW5wYWNrL2FyY2hpdmVyLW1hbmFnZXItZXhjZXB0aW9uL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+dW5wYWNrLW1pbjwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy91bnBhY2svYXJjaGl2ZXItbWFuYWdlci1leGNlcHRpb24vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJXaXRoRXhjZXB0aW9uU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL3VucGFjay9taW4tcGx1Z2luLWNvbmZpZy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL3VucGFjay9taW4tcGx1Z2luLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3NTg3ZDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy91bnBhY2svbWluLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy91bnBhY2svbWluL3RhcmdldDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDxmaW5hbE5hbWU+dW5wYWNrLW1pbjwvZmluYWxOYW1lPgotICAgICAgICAgIDx3b3JrRGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy91bnBhY2svbWluL3dvcms8L3dvcmtEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGFyY2hpdmVyTWFuYWdlciBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXJjaGl2ZXJNYW5hZ2VyU3R1YiIgLz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5PiR7bG9jYWxSZXBvc2l0b3J5fTwvbG9jYWxSZXBvc2l0b3J5PgotICAgICAgICAgIDxyZWFjdG9yUHJvamVjdHM+PC9yZWFjdG9yUHJvamVjdHM+Ci0gICAgICAgICAgPGNsYXNzaWZpZXI+PC9jbGFzc2lmaWVyPgotICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5Bc3NlbWJseU1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL3VucGFjay91bnBhY2stZXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9wbHVnaW4tY29uZmlncy91bnBhY2svdW5wYWNrLWV4Y2VwdGlvbi1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc1MzlkYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL3VucGFjay91bnBhY2stZXhjZXB0aW9uLXBsdWdpbi1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci08cHJvamVjdD4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YmFzZWRpcn0vdGFyZ2V0L3Rlc3QtaGFybmVzcy91bnBhY2svdW5wYWNrLWV4Y2VwdGlvbi90YXJnZXQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICA8ZmluYWxOYW1lPnVucGFjay1taW48L2ZpbmFsTmFtZT4KLSAgICAgICAgICA8d29ya0RpcmVjdG9yeT4ke2Jhc2VkaXJ9L3RhcmdldC90ZXN0LWhhcm5lc3MvdW5wYWNrL3VucGFjay1leGNlcHRpb24vd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz48L3JlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICA8Y2xhc3NpZmllcj48L2NsYXNzaWZpZXI+Ci0gICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLkFzc2VtYmx5TWF2ZW5Qcm9qZWN0U3R1YiIgLz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvdW5wYWNrL3dpdGgtcmVhY3Rvci1wcm9qZWN0cy1wbHVnaW4tY29uZmlnLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcGx1Z2luLWNvbmZpZ3MvdW5wYWNrL3dpdGgtcmVhY3Rvci1wcm9qZWN0cy1wbHVnaW4tY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk4ZjA0ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3BsdWdpbi1jb25maWdzL3VucGFjay93aXRoLXJlYWN0b3ItcHJvamVjdHMtcGx1Z2luLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLTxwcm9qZWN0PgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL3VucGFjay93aXRoLXJlYWN0b3ItcHJvamVjdHMvdGFyZ2V0PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgPGZpbmFsTmFtZT51bnBhY2stbWluPC9maW5hbE5hbWU+Ci0gICAgICAgICAgPHdvcmtEaXJlY3Rvcnk+JHtiYXNlZGlyfS90YXJnZXQvdGVzdC1oYXJuZXNzL3VucGFjay93aXRoLXJlYWN0b3ItcHJvamVjdHMvd29yazwvd29ya0RpcmVjdG9yeT4KLSAgICAgICAgICA8YXJjaGl2ZXJNYW5hZ2VyIGltcGxlbWVudGF0aW9uPSJvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5zdHVicy5BcmNoaXZlck1hbmFnZXJTdHViIiAvPgotICAgICAgICAgIDxsb2NhbFJlcG9zaXRvcnk+JHtsb2NhbFJlcG9zaXRvcnl9PC9sb2NhbFJlcG9zaXRvcnk+Ci0gICAgICAgICAgPHJlYWN0b3JQcm9qZWN0cz4KLSAgICAgICAgICAgIDxyZWFjdG9yUHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuUmVhY3Rvck1hdmVuUHJvamVjdFN0dWIiIC8+Ci0gICAgICAgICAgICA8cmVhY3RvclByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnN0dWJzLlJlYWN0b3JNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICAgIDwvcmVhY3RvclByb2plY3RzPgotICAgICAgICAgIDxjbGFzc2lmaWVyPjwvY2xhc3NpZmllcj4KLSAgICAgICAgICA8cHJvamVjdCBpbXBsZW1lbnRhdGlvbj0ib3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuc3R1YnMuQXNzZW1ibHlNYXZlblByb2plY3RTdHViIiAvPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3JlbW90ZS1yZXBvL2Fzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4wL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4wLmphciBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVtb3RlLXJlcG8vYXNzZW1ibHkvZGVwZW5kZW5jeS1hcnRpZmFjdC8xLjAvZGVwZW5kZW5jeS1hcnRpZmFjdC0xLjAuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE2NDk2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVtb3RlLXJlcG8vYXNzZW1ibHkvZGVwZW5kZW5jeS1hcnRpZmFjdC8xLjAvZGVwZW5kZW5jeS1hcnRpZmFjdC0xLjAuamFyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamFyIGNvbnRlbnRzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZW1vdGUtcmVwby9hc3NlbWJseS9kZXBlbmRlbmN5LWFydGlmYWN0LzEuMC9kZXBlbmRlbmN5LWFydGlmYWN0LTEuMC5wb20gYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3JlbW90ZS1yZXBvL2Fzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4wL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4wLnBvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0MGJkNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3JlbW90ZS1yZXBvL2Fzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4wL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4wLnBvbQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPHByb2plY3Q+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+YXNzZW1ibHk8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3JlbW90ZS1yZXBvL2Fzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4xL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4xLmphciBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVtb3RlLXJlcG8vYXNzZW1ibHkvZGVwZW5kZW5jeS1hcnRpZmFjdC8xLjEvZGVwZW5kZW5jeS1hcnRpZmFjdC0xLjEuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE2NDk2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVtb3RlLXJlcG8vYXNzZW1ibHkvZGVwZW5kZW5jeS1hcnRpZmFjdC8xLjEvZGVwZW5kZW5jeS1hcnRpZmFjdC0xLjEuamFyCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotamFyIGNvbnRlbnRzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZW1vdGUtcmVwby9hc3NlbWJseS9kZXBlbmRlbmN5LWFydGlmYWN0LzEuMS9kZXBlbmRlbmN5LWFydGlmYWN0LTEuMS5wb20gYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3JlbW90ZS1yZXBvL2Fzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4xL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4xLnBvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUzNmRiOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3JlbW90ZS1yZXBvL2Fzc2VtYmx5L2RlcGVuZGVuY3ktYXJ0aWZhY3QvMS4xL2RlcGVuZGVuY3ktYXJ0aWZhY3QtMS4xLnBvbQorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPHByb2plY3Q+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+YXNzZW1ibHk8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmRlcGVuZGVuY3ktYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL01BU1NFTUJMWS05OC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL01BU1NFTUJMWS05OC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmZDYxOTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9NQVNTRU1CTFktOTgueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+cmVwb3NpdG9yaWVzPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8cmVwb3NpdG9yaWVzPgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5yZXBvc2l0b3J5PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8Z3JvdXBWZXJzaW9uQWxpZ25tZW50cz4KLSAgICAgICAgPGdyb3VwVmVyc2lvbkFsaWdubWVudD4KLSAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KLSAgICAgICAgPC9ncm91cFZlcnNpb25BbGlnbm1lbnQ+Ci0gICAgICAgIDxncm91cFZlcnNpb25BbGlnbm1lbnQ+Ci0gICAgICAgICAgPGlkPmFzc2VtYmx5MjwvaWQ+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgIDxleGNsdWRlPmRlcGVuZGVuY3ktYXJ0aWZhY3Q8L2V4Y2x1ZGU+Ci0gICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9ncm91cFZlcnNpb25BbGlnbm1lbnQ+Ci0gICAgICA8L2dyb3VwVmVyc2lvbkFsaWdubWVudHM+Ci0gICAgPC9yZXBvc2l0b3J5PgotICA8L3JlcG9zaXRvcmllcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL05vU3VjaEFyY2hpdmVyRXhjZXB0aW9uLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjA5MzEzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c2ltcGxlPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50eHQ8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC90ZXN0LWhhcm5lc3MvYXNzZW1ibHkvbWluL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvY29tcG9uZW50cy9GaWxlSXRlbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2NvbXBvbmVudHMvRmlsZUl0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDliMWVhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvY29tcG9uZW50cy9GaWxlSXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNvbXBvbmVudD4KLSAgPGZpbGVzPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT50YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQvUkVBRE1FLnR4dDwvc291cmNlPgotICAgIDwvZmlsZT4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+dGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0L0xJQ0VOU0UudHh0PC9zb3VyY2U+Ci0gICAgPC9maWxlPgotICA8L2ZpbGVzPgotPC9jb21wb25lbnQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9jb21wb25lbnRzL0ZpbGVTZXQueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9jb21wb25lbnRzL0ZpbGVTZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTczMjBkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvY29tcG9uZW50cy9GaWxlU2V0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08Y29tcG9uZW50PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldDwvZGlyZWN0b3J5PgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvY29tcG9uZW50PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvY29tcG9uZW50cy9kZXBlbmRlbmN5U2V0LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvY29tcG9uZW50cy9kZXBlbmRlbmN5U2V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNmY2I0OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2NvbXBvbmVudHMvZGVwZW5kZW5jeVNldC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGNvbXBvbmVudD4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2NvbXBvbmVudD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtZGVmYXVsdC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtZGVmYXVsdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjZDZkYjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LWRlZmF1bHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZGVwZW5kZW5jeVNldC1kZWZhdWx0PC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtZXhjbHVkZXMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LWV4Y2x1ZGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU0ZDk0Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtZXhjbHVkZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZGVwZW5kZW5jeVNldC1leGNsdWRlczwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+YXNzZW1ibHk6ZGVwZW5kZW5jeS1hcnRpZmFjdDE8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtZmlsZW5hbWUtbWFwcGluZy1hbmQtY2xhc3NpZmllci54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtZmlsZW5hbWUtbWFwcGluZy1hbmQtY2xhc3NpZmllci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YWM2YTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LWZpbGVuYW1lLW1hcHBpbmctYW5kLWNsYXNzaWZpZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZGVwZW5kZW5jeVNldC1maWxlbmFtZS1tYXBwaW5nPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7dmVyc2lvbn0uJHthcnRpZmFjdElkfS4ke2dyb3VwSWR9PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYnM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LWZpbGVuYW1lLW1hcHBpbmcueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LWZpbGVuYW1lLW1hcHBpbmcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOGE0YTQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZGVwZW5kZW5jeVNldC1maWxlbmFtZS1tYXBwaW5nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmRlcGVuZGVuY3lTZXQtZmlsZW5hbWUtbWFwcGluZzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke3ZlcnNpb259LSR7YXJ0aWZhY3RJZH0tJHtncm91cElkfTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWJzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZGVwZW5kZW5jeVNldC1pbmNsdWRlcy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtaW5jbHVkZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmJiMzFlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZGVwZW5kZW5jeVNldC1pbmNsdWRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5kZXBlbmRlbmN5U2V0LWluY2x1ZGVzPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5hc3NlbWJseTpkZXBlbmRlbmN5LWFydGlmYWN0MTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZGVwZW5kZW5jeVNldC1zY29wZWQueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LXNjb3BlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzOWZmNzIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LXNjb3BlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5kZXBlbmRlbmN5U2V0LXNjb3BlZDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXBlbmRlbmN5U2V0LXVucGFjay54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtdW5wYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczNzcxZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2RlcGVuZGVuY3lTZXQtdW5wYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmRlcGVuZGVuY3lTZXQtdW5wYWNrPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8dW5wYWNrPnRydWU8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeS9zaW1wbGUueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5L3NpbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMjMzYjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9kZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5L3NpbXBsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zaW1wbGU8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9kZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5L3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZW1wdHkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9lbXB0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NTE1NzIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9lbXB0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5lbXB0eTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGNvbXBvbmVudERlc2NyaXB0b3JzPgotICAgIDxjb21wb25lbnREZXNjcmlwdG9yPnNyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsaWVzL2NvbXBvbmVudHMvZGVwZW5kZW5jeVNldC54bWw8L2NvbXBvbmVudERlc2NyaXB0b3I+Ci0gICAgPGNvbXBvbmVudERlc2NyaXB0b3I+c3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvY29tcG9uZW50cy9GaWxlSXRlbS54bWw8L2NvbXBvbmVudERlc2NyaXB0b3I+Ci0gICAgPGNvbXBvbmVudERlc2NyaXB0b3I+c3JjL3Rlc3QvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvY29tcG9uZW50cy9GaWxlU2V0LnhtbDwvY29tcG9uZW50RGVzY3JpcHRvcj4KLSAgPC9jb21wb25lbnREZXNjcmlwdG9ycz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVJdGVtLWZpbGVNb2RlLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZUl0ZW0tZmlsZU1vZGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDY5OWRmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZUl0ZW0tZmlsZU1vZGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZmlsZUl0ZW08L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlcz4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+dGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0L1JFQURNRS50eHQ8L3NvdXJjZT4KLSAgICAgIDxmaWxlTW9kZT43Nzc8L2ZpbGVNb2RlPgotICAgIDwvZmlsZT4KLSAgPC9maWxlcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVJdGVtLWZpbHRlci1maWxlLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZUl0ZW0tZmlsdGVyLWZpbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMWZhNzlmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZUl0ZW0tZmlsdGVyLWZpbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZmlsZUl0ZW08L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlcz4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+dGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0L1JFQURNRS50eHQ8L3NvdXJjZT4KLSAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICA8L2ZpbGU+Ci0gIDwvZmlsZXM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlSXRlbS1maWx0ZXJlZC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVJdGVtLWZpbHRlcmVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYTc5Zi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVJdGVtLWZpbHRlcmVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmZpbGVJdGVtPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZXM+Ci0gICAgPGZpbGU+Ci0gICAgICA8c291cmNlPnRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldC9SRUFETUUudHh0PC9zb3VyY2U+Ci0gICAgICA8ZmlsdGVyZWQ+dHJ1ZTwvZmlsdGVyZWQ+Ci0gICAgPC9maWxlPgotICA8L2ZpbGVzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZUl0ZW0tbGluZUVuZGluZ3MueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlSXRlbS1saW5lRW5kaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Yzk2ZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlSXRlbS1saW5lRW5kaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5maWxlSXRlbTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGZpbGVzPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT50YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQvUkVBRE1FLnR4dDwvc291cmNlPgotICAgICAgPGxpbmVFbmRpbmc+dW5peDwvbGluZUVuZGluZz4KLSAgICA8L2ZpbGU+Ci0gIDwvZmlsZXM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlSXRlbS1vdXRwdXQtbmFtZS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVJdGVtLW91dHB1dC1uYW1lLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBjYWZhNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVJdGVtLW91dHB1dC1uYW1lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmZpbGVJdGVtPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZXM+Ci0gICAgPGZpbGU+Ci0gICAgICA8c291cmNlPnRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldC9SRUFETUUudHh0PC9zb3VyY2U+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pm91dHB1dDwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGRlc3ROYW1lPlJFQURUSElTLnR4dDwvZGVzdE5hbWU+Ci0gICAgPC9maWxlPgotICA8L2ZpbGVzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZUl0ZW0ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlSXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhZTU1NWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlSXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5maWxlSXRlbTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGZpbGVzPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT50YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQvUkVBRE1FLnR4dDwvc291cmNlPgotICAgIDwvZmlsZT4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+dGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0L0xJQ0VOU0UudHh0PC9zb3VyY2U+Ci0gICAgPC9maWxlPgotICA8L2ZpbGVzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1hcmNoaXZlQmFzZURpcmVjdG9yeS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQtYXJjaGl2ZUJhc2VEaXJlY3RvcnkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjIyZGI5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1hcmNoaXZlQmFzZURpcmVjdG9yeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5maWxlU2V0PC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PmZpbGVTZXQ8L2RpcmVjdG9yeT4KLSAgICAgIDxsaW5lRW5kaW5nPmtlZXA8L2xpbmVFbmRpbmc+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1jcmxmLWxpbmVFbmRpbmdzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1jcmxmLWxpbmVFbmRpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjE4YTk3My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQtY3JsZi1saW5lRW5kaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5maWxlU2V0PC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnRhcmdldC90ZXN0LWNsYXNzZXMvZmlsZVNldDwvZGlyZWN0b3J5PgotICAgICAgPGxpbmVFbmRpbmc+Y3JsZjwvbGluZUVuZGluZz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LWRvZXNudC1leGlzdC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQtZG9lc250LWV4aXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWRiNjYzNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQtZG9lc250LWV4aXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmZpbGVTZXQ8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+ZG9ua2V5PC9kaXJlY3Rvcnk+Ci0gICAgICA8bGluZUVuZGluZz51bml4PC9saW5lRW5kaW5nPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQtZG9zLWxpbmVFbmRpbmdzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1kb3MtbGluZUVuZGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjgwOTk0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1kb3MtbGluZUVuZGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZmlsZVNldDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQ8L2RpcmVjdG9yeT4KLSAgICAgIDxsaW5lRW5kaW5nPmRvczwvbGluZUVuZGluZz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LWluY2x1ZGVzLWV4Y2x1ZGVzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1pbmNsdWRlcy1leGNsdWRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNjg4YzguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LWluY2x1ZGVzLWV4Y2x1ZGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmZpbGVTZXQ8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0PC9kaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPioqLyoudHh0PC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+KiovKi54bWw8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQtbGYtbGluZUVuZGluZ3MueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LWxmLWxpbmVFbmRpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4N2M3MS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQtbGYtbGluZUVuZGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZmlsZVNldDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQ8L2RpcmVjdG9yeT4KLSAgICAgIDxsaW5lRW5kaW5nPmxmPC9saW5lRW5kaW5nPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQtbGluZUVuZGluZ3MtZXhjZXB0aW9uLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1saW5lRW5kaW5ncy1leGNlcHRpb24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDQ0ZDY2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1saW5lRW5kaW5ncy1leGNlcHRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZmlsZVNldDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQ8L2RpcmVjdG9yeT4KLSAgICAgIDxsaW5lRW5kaW5nPmludmFsaWQ8L2xpbmVFbmRpbmc+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC1uby1kaXJlY3RvcnkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LW5vLWRpcmVjdG9yeS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYmFhYjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LW5vLWRpcmVjdG9yeS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5maWxlU2V0PC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LXVuaXgtbGluZUVuZGluZ3MueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LXVuaXgtbGluZUVuZGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDUwOTAzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZmlsZVNldC11bml4LWxpbmVFbmRpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmZpbGVTZXQ8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0PC9kaXJlY3Rvcnk+Ci0gICAgICA8bGluZUVuZGluZz51bml4PC9saW5lRW5kaW5nPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9maWxlU2V0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjNTI4OC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL2ZpbGVTZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZmlsZVNldDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdGVzdC1jbGFzc2VzL2ZpbGVTZXQ8L2RpcmVjdG9yeT4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9tb2R1bGVTZXQtZXhjbHVkZXMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9tb2R1bGVTZXQtZXhjbHVkZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmMxZjk1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvbW9kdWxlU2V0LWV4Y2x1ZGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPm1vZHVsZVNldDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+YXNzZW1ibHk6cmVhY3Rvci1wcm9qZWN0LTE8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgICAgPHNvdXJjZXMvPgotICAgICAgPGJpbmFyaWVzLz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvbW9kdWxlU2V0LWluY2x1ZGUtZGVwZW5kZW5jaWVzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvbW9kdWxlU2V0LWluY2x1ZGUtZGVwZW5kZW5jaWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxMjk0OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL21vZHVsZVNldC1pbmNsdWRlLWRlcGVuZGVuY2llcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5tb2R1bGVTZXQ8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxtb2R1bGVTZXRzPgotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICA8c291cmNlcy8+Ci0gICAgICA8YmluYXJpZXM+Ci0gICAgICAgIDxpbmNsdWRlRGVwZW5kZW5jaWVzPnRydWU8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICA8L2JpbmFyaWVzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9tb2R1bGVTZXQtaW5jbHVkZXMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9tb2R1bGVTZXQtaW5jbHVkZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGFiMGU0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvbW9kdWxlU2V0LWluY2x1ZGVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPm1vZHVsZVNldDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+YXNzZW1ibHk6cmVhY3Rvci1wcm9qZWN0LTE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPHNvdXJjZXMvPgotICAgICAgPGJpbmFyaWVzLz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvbW9kdWxlU2V0LXBhY2tlZC1pbmNsdWRpbmctZGVwZW5kZW5jaWVzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvbW9kdWxlU2V0LXBhY2tlZC1pbmNsdWRpbmctZGVwZW5kZW5jaWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY5ZGIwZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL21vZHVsZVNldC1wYWNrZWQtaW5jbHVkaW5nLWRlcGVuZGVuY2llcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5tb2R1bGVTZXQ8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxtb2R1bGVTZXRzPgotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICA8YmluYXJpZXM+Ci0gICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+dHJ1ZTwvaW5jbHVkZURlcGVuZGVuY2llcz4KLSAgICAgIDwvYmluYXJpZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL21vZHVsZVNldC1wYWNrZWQueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9tb2R1bGVTZXQtcGFja2VkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDMyOGE3MC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL21vZHVsZVNldC1wYWNrZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+bW9kdWxlU2V0PC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8L2JpbmFyaWVzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9tb2R1bGVTZXQueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9tb2R1bGVTZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjRhMzNiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvbW9kdWxlU2V0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPm1vZHVsZVNldDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDxzb3VyY2VzLz4KLSAgICAgIDxiaW5hcmllcy8+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3BsZXh1cy1jb21wb25lbnRzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcGxleHVzLWNvbXBvbmVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2NiZjVlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcGxleHVzLWNvbXBvbmVudHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+cGxleHVzLWNvbXBvbmVudHM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtY2xhc3Nlcy9maWxlU2V0PC9kaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtZXhjbHVkZXMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1leGNsdWRlcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZWQ2MjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC1leGNsdWRlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5yZXBvc2l0b3JpZXM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxyZXBvc2l0b3JpZXM+Ci0gICAgPHJlcG9zaXRvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PnJlcG9zaXRvcnk8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxncm91cFZlcnNpb25BbGlnbm1lbnRzPgotICAgICAgICA8Z3JvdXBWZXJzaW9uQWxpZ25tZW50PgotICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xPC92ZXJzaW9uPgotICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgIDxleGNsdWRlPmRlcGVuZGVuY3ktYXJ0aWZhY3Q8L2V4Y2x1ZGU+Ci0gICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgPC9ncm91cFZlcnNpb25BbGlnbm1lbnQ+Ci0gICAgICA8L2dyb3VwVmVyc2lvbkFsaWdubWVudHM+Ci0gICAgPC9yZXBvc2l0b3J5PgotICA8L3JlcG9zaXRvcmllcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LWluY2x1ZGVzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtaW5jbHVkZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmM1ODMwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcmVwb3NpdG9yeS1ncm91cFZlcnNpb25BbGlnbm1lbnQtaW5jbHVkZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+cmVwb3NpdG9yaWVzPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8cmVwb3NpdG9yaWVzPgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5yZXBvc2l0b3J5PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8Z3JvdXBWZXJzaW9uQWxpZ25tZW50cz4KLSAgICAgICAgPGdyb3VwVmVyc2lvbkFsaWdubWVudD4KLSAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8aW5jbHVkZT5kZXBlbmRlbmN5LWFydGlmYWN0PC9pbmNsdWRlPgotICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZ3JvdXBWZXJzaW9uQWxpZ25tZW50PgotICAgICAgPC9ncm91cFZlcnNpb25BbGlnbm1lbnRzPgotICAgIDwvcmVwb3NpdG9yeT4KLSAgPC9yZXBvc2l0b3JpZXM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9yZXBvc2l0b3J5LWdyb3VwVmVyc2lvbkFsaWdubWVudC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QzMWZjMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3JlcG9zaXRvcnktZ3JvdXBWZXJzaW9uQWxpZ25tZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnJlcG9zaXRvcmllczwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPHJlcG9zaXRvcmllcz4KLSAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cmVwb3NpdG9yeTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGdyb3VwVmVyc2lvbkFsaWdubWVudHM+Ci0gICAgICAgIDxncm91cFZlcnNpb25BbGlnbm1lbnQ+Ci0gICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICA8dmVyc2lvbj4xLjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvZ3JvdXBWZXJzaW9uQWxpZ25tZW50PgotICAgICAgPC9ncm91cFZlcnNpb25BbGlnbm1lbnRzPgotICAgIDwvcmVwb3NpdG9yeT4KLSAgPC9yZXBvc2l0b3JpZXM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9yZXBvc2l0b3J5LXdpdGgtbWV0YWRhdGEueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9yZXBvc2l0b3J5LXdpdGgtbWV0YWRhdGEueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODE3YWJlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcmVwb3NpdG9yeS13aXRoLW1ldGFkYXRhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnJlcG9zaXRvcmllczwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPHJlcG9zaXRvcmllcz4KLSAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cmVwb3NpdG9yeTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVNZXRhZGF0YT50cnVlPC9pbmNsdWRlTWV0YWRhdGE+Ci0gICAgPC9yZXBvc2l0b3J5PgotICA8L3JlcG9zaXRvcmllcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3JlcG9zaXRvcnkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9yZXBvc2l0b3J5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYzZTE5Ni4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3JlcG9zaXRvcnkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+cmVwb3NpdG9yaWVzPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8cmVwb3NpdG9yaWVzPgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5yZXBvc2l0b3J5PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgPC9yZXBvc2l0b3J5PgotICA8L3JlcG9zaXRvcmllcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3NpbXBsZS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3NpbXBsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZjljMGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy9zaW1wbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotICB+IENvcHlyaWdodCAyMDAxLTIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c2ltcGxlPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8IS0taW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5LS0+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS9taW4vdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy90YXItYnoyLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvdGFyLWJ6Mi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZWI5NTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy90YXItYnoyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNpbXBsZTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmJ6MjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS90YXItYnoyL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvdGFyLWd6LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvdGFyLWd6LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4MWUzMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3Rhci1nei54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zaW1wbGU8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS90YXItZ3ovdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy90YnoyLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvdGJ6Mi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MDhkM2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy90YnoyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNpbXBsZTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGJ6MjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS90YnoyL3RhcmdldDwvZGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvdGd6LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvdGd6LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJjYzZjOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9hc3NlbWJsaWVzL3Rnei54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDEtMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gIH4KLSAgfiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgfiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIH4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gIH4KLSAgfiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICB+Ci0gIH4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICB+IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIH4gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIH4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICB+IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICAtLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zaW1wbGU8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRnejwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L3Rlc3QtaGFybmVzcy9hc3NlbWJseS90Z3ovdGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPiouamFyPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy93YXIueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYXNzZW1ibGllcy93YXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFjMjkwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2Z1bmN0aW9uYWwtdGVzdHMvcmVzb3VyY2VzL2Fzc2VtYmxpZXMvd2FyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTwhLS0KLSAgfiBDb3B5cmlnaHQgMjAwMS0yMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gIC0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNpbXBsZTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+d2FyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT50YXJnZXQvdGVzdC1oYXJuZXNzL2Fzc2VtYmx5L3dhci90YXJnZXQ8L2RpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Ki5qYXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9iYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0L291dHB1dEZpbGVOYW1lTWFwcGluZy1hc3NlbWJseURlc2NyaXB0b3IueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvZnVuY3Rpb25hbC10ZXN0cy9yZXNvdXJjZXMvYmFzaWNBYnN0cmFjdEFzc2VtYmx5TW9qb0ZlYXR1cmVzVGVzdC9vdXRwdXRGaWxlTmFtZU1hcHBpbmctYXNzZW1ibHlEZXNjcmlwdG9yLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY4NjNiZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9mdW5jdGlvbmFsLXRlc3RzL3Jlc291cmNlcy9iYXNpY0Fic3RyYWN0QXNzZW1ibHlNb2pvRmVhdHVyZXNUZXN0L291dHB1dEZpbGVOYW1lTWFwcGluZy1hc3NlbWJseURlc2NyaXB0b3IueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5vdXRwdXRGaWxlTmFtZU1hcHBpbmc8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+b3JnLnRlc3Q6dGVzdDwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+b3JnLnRlc3QuMjp0ZXN0MjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9kZXBlbmRlbmNpZXMvPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L2l0LXByb2plY3QtcGFyZW50L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9pdC1wcm9qZWN0LXBhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2FjODllLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L2l0LXByb2plY3QtcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIAotICA8cHJvZmlsZXM+Ci0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+dGVzdGluZzwvaWQ+Ci0gICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+Ci0gICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAKLSAgICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgPGlkPm1haW4ubG9jYWwuYXMucmVtb3RlPC9pZD4KLSAgICAgICAgICA8dXJsPmZpbGU6Ly8ke2xvY2FsLnJlcG8ucGF0aH08L3VybD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICAtLT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgPGlkPmludGVncmF0aW9uLnRlc3QucmVwbzwvaWQ+Ci0gICAgICAgICAgPHVybD5AdGVzdC5yZW1vdGUucmVwby51cmxAPC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgIDwvcmVwb3NpdG9yaWVzPgotCi0gICAgICA8cGx1Z2luUmVwb3NpdG9yaWVzPgotICAgICAgICA8IS0tCi0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICAgIDxpZD5tYWluLmxvY2FsLmFzLnJlbW90ZTwvaWQ+Ci0gICAgICAgICAgPHVybD5maWxlOi8vJHtsb2NhbC5yZXBvLnBhdGh9PC91cmw+Ci0gICAgICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgICAgLS0+Ci0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICAgIDxpZD5pbnRlZ3JhdGlvbi50ZXN0LnJlcG88L2lkPgotICAgICAgICAgIDx1cmw+QHRlc3QucmVtb3RlLnJlcG8udXJsQDwvdXJsPgotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gICAgICA8L3BsdWdpblJlcG9zaXRvcmllcz4KLQotICAgICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgIDxpZD5pbnRlZ3JhdGlvbi50ZXN0LnJlcG88L2lkPgotICAgICAgICAgIDx1cmw+QHRlc3QucmVtb3RlLnJlcG8udXJsQDwvdXJsPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0KLSAgICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPiR7dGVzdFZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgPC9idWlsZD4KLSAgICA8L3Byb2ZpbGU+Ci0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+bGl2ZTwvaWQ+Ci0gICAgICAKLSAgICAgIDwhLS0ganVzdCBhdm9pZHMgdGhlIGluZm9ybWF0aW9uIGluamVjdGVkIGJ5IHRoZSB0ZXN0aW5nIHByb2ZpbGUsIGFib3ZlLiAtLT4KLSAgICA8L3Byb2ZpbGU+Ci0gIDwvcHJvZmlsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9FeGVjdXRpb25Sb290L2NoaWxkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9FeGVjdXRpb25Sb290L2NoaWxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDliMjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvRXhlY3V0aW9uUm9vdC9jaGlsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLQ0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPg0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgPHBhcmVudD4NCi0gICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4NCi0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgPC9wYXJlbnQ+DQotICA8bmFtZT5DaGlsZDwvbmFtZT4NCi0gICAgPGFydGlmYWN0SWQ+Y2hpbGQ8L2FydGlmYWN0SWQ+DQotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL0V4ZWN1dGlvblJvb3QvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvRXhlY3V0aW9uUm9vdC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzYTNjZjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvRXhlY3V0aW9uUm9vdC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotaW52b2tlci5nb2Fscz1jbGVhbiB2YWxpZGF0ZQ0KLSNpbnZva2VyLm1hdmVuT3B0cz0tWGRlYnVnIC1Ybm9hZ2VudCAtRGphdmEuY29tcGlsZXI9Tk9ORSAtWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz04MDAwDQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvRXhlY3V0aW9uUm9vdC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvRXhlY3V0aW9uUm9vdC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTY0YTZkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL0V4ZWN1dGlvblJvb3QvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gIDxwYXJlbnQ+DQotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPg0KLSAgPC9wYXJlbnQ+DQotICANCi0gIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPg0KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPg0KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gIA0KLSAgPG5hbWU+UGFyZW50PC9uYW1lPg0KLSAgPG1vZHVsZXM+DQotICAgIDxtb2R1bGU+Y2hpbGQ8L21vZHVsZT4NCi0gIDwvbW9kdWxlcz4NCi0NCi0gIDxidWlsZD4NCi0gICAgPHBsdWdpbnM+DQotICAgICAgPHBsdWdpbj4NCi0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8cnVuT25seUF0RXhlY3V0aW9uUm9vdD50cnVlPC9ydW5Pbmx5QXRFeGVjdXRpb25Sb290Pg0KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+DQotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL3NyYy54bWw8L2Rlc2NyaXB0b3I+DQotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+DQotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+DQotICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICA8cGhhc2U+dmFsaWRhdGU8L3BoYXNlPg0KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICA8L3BsdWdpbj4NCi0gICAgPC9wbHVnaW5zPg0KLSAgPC9idWlsZD4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvRXhlY3V0aW9uUm9vdC9zcmMvYXNzZW1ibGUvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL0V4ZWN1dGlvblJvb3Qvc3JjL2Fzc2VtYmxlL3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYTEyYjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvRXhlY3V0aW9uUm9vdC9zcmMvYXNzZW1ibGUvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPioqLyoubG9nPC9leGNsdWRlPgotICAgICAgICA8ZXhjbHVkZT50YXJnZXQvKio8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9FeGVjdXRpb25Sb290L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9FeGVjdXRpb25Sb290L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNGEwMWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvRXhlY3V0aW9uUm9vdC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIHJlc3VsdCA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtc3JjLnppcCIgKS5leGlzdHMoKSAmJiAhbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZC90YXJnZXQvY2hpbGQtMS4wLXNyYy56aXAiICkuZXhpc3RzKCk7ICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2FkZC1jbGFzc3BhdGgvYXNzZW1ibHkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvYWRkLWNsYXNzcGF0aC9hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0YTM1MjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvYWRkLWNsYXNzcGF0aC9hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxhc3NlbWJseT4KLSAgPGlkPmZ1bGw8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmphcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWIvPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5vdXRwdXREaXJlY3Rvcnl9PC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2FkZC1jbGFzc3BhdGgvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvYWRkLWNsYXNzcGF0aC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODA3OWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvYWRkLWNsYXNzcGF0aC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpzaW5nbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2FkZC1jbGFzc3BhdGgvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2FkZC1jbGFzc3BhdGgvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiMjg5OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9hZGQtY2xhc3NwYXRoL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD50ZXN0PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIAotICA8bmFtZT5UZXN0PC9uYW1lPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4zPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPmFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgPG1hbmlmZXN0PgotICAgICAgICAgICAgICA8bWFpbkNsYXNzPmNvbS5leGFtcGxlLk1haW48L21haW5DbGFzcz4KLSAgICAgICAgICAgICAgPGFkZENsYXNzcGF0aD50cnVlPC9hZGRDbGFzc3BhdGg+Ci0gICAgICAgICAgICAgIDxjbGFzc3BhdGhQcmVmaXg+bGliLzwvY2xhc3NwYXRoUHJlZml4PgotICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICA8L2FyY2hpdmU+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2FkZC1jbGFzc3BhdGgvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2FkZC1jbGFzc3BhdGgvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3YmM2MC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9hZGQtY2xhc3NwYXRoL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLUZpbGUgZmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Rlc3QtMS4wLWZ1bGwuamFyIiApOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oICJmaWxlOiAiICsgZmlsZSArICIgZXhpc3RzPyAiICsgZmlsZS5leGlzdHMoKSApOwotCi1KYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZSggZmlsZSApOwotCi1NYW5pZmVzdCBtZiA9IGphckZpbGUuZ2V0TWFuaWZlc3QoKTsKLQotQXR0cmlidXRlcyBhdHRycyA9IG1mLmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0KLVN0cmluZyBjbGFzc1BhdGggPSAoU3RyaW5nKSBhdHRycy5nZXQoIEF0dHJpYnV0ZXMuTmFtZS5DTEFTU19QQVRIICk7Ci0KLVN5c3RlbS5vdXQucHJpbnRsbiggIkdvdCBNYWluLUNsYXNzOiAiICsgbWFpbkNsYXNzICk7Ci0KLXJldHVybiAgY2xhc3NQYXRoLmNvbnRhaW5zKCJwbGV4dXMtdXRpbHMiKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2NsYXNzcGF0aC1kZXNjcmlwdG9yL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2NsYXNzcGF0aC1kZXNjcmlwdG9yL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODZkMDc1Ni4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9jbGFzc3BhdGgtZGVzY3JpcHRvci9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTphc3NlbWJseQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvY2xhc3NwYXRoLWRlc2NyaXB0b3IvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2NsYXNzcGF0aC1kZXNjcmlwdG9yL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMGYwYWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvY2xhc3NwYXRoLWRlc2NyaXB0b3IvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnRlc3Q8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgCi0gIDxuYW1lPlRlc3Q8L25hbWU+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPnNyYzwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+cG9zaXg8L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZGVzY3JpcHRvckRpcmVjdG9yeVNjYW4vaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZGVzY3JpcHRvckRpcmVjdG9yeVNjYW4vaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjY3YTFmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Rlc2NyaXB0b3JEaXJlY3RvcnlTY2FuL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tYXNzZW1ibHktcGx1Z2luOiR7dGVzdFZlcnNpb259OmRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZGVzY3JpcHRvckRpcmVjdG9yeVNjYW4vcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Rlc2NyaXB0b3JEaXJlY3RvcnlTY2FuL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwMjNjMTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZGVzY3JpcHRvckRpcmVjdG9yeVNjYW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAKLSAgPG5hbWU+UGFyZW50PC9uYW1lPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeT5zcmMvYXNzZW1ibGU8L2Rlc2NyaXB0b3JTb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Rlc2NyaXB0b3JEaXJlY3RvcnlTY2FuL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZGVzY3JpcHRvckRpcmVjdG9yeVNjYW4vc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ODYyMzIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZGVzY3JpcHRvckRpcmVjdG9yeVNjYW4vc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluZGlyPC9pZD4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPmNvbW1vbnMtbG9nZ2luZzpjb21tb25zLWxvZ2dpbmc8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9kZXNjcmlwdG9yRGlyZWN0b3J5U2Nhbi9zcmMvYXNzZW1ibGUvcmVhZG1lLnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Rlc2NyaXB0b3JEaXJlY3RvcnlTY2FuL3NyYy9hc3NlbWJsZS9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzJhODMzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Rlc2NyaXB0b3JEaXJlY3RvcnlTY2FuL3NyYy9hc3NlbWJsZS9yZWFkbWUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGhpcyBmaWxlIGlzIGp1bmsgYW5kIHNob3VsZCBub3QgYmUgcGlja2VkIHVwIGFzIGEgZGVzY3JpcHRvci4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtY29weUludG9Ub3BEaXIvVE9ETy50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLWNvcHlJbnRvVG9wRGlyL1RPRE8udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVlNmFlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtY29weUludG9Ub3BEaXIvVE9ETy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UZXN0CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLWNvcHlJbnRvVG9wRGlyL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtY29weUludG9Ub3BEaXIvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjQ3NmM0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtY29weUludG9Ub3BEaXIvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPW9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06ZGlyZWN0b3J5CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLWNvcHlJbnRvVG9wRGlyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLWNvcHlJbnRvVG9wRGlyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhNDUyNzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZmlsZS1jb3B5SW50b1RvcERpci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIAotICA8bmFtZT5QYXJlbnQ8L25hbWU+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtY29weUludG9Ub3BEaXIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLWNvcHlJbnRvVG9wRGlyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGM4ZTNiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtY29weUludG9Ub3BEaXIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YnVnLWV4YW1wbGU8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlcz4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+VE9ETy50eHQ8L3NvdXJjZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDwvZmlsZT4KLSAgPC9maWxlcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLWNvcHlJbnRvVG9wRGlyL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLWNvcHlJbnRvVG9wRGlyL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZDg1NDguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZmlsZS1jb3B5SW50b1RvcERpci92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIHJlc3VsdCA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtYnVnLWV4YW1wbGUvVE9ETy50eHQiICkuZXhpc3RzKCk7ICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvYS5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZmlsZS1zYW1lTmFtZS9hLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMGFjYTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZmlsZS1zYW1lTmFtZS9hLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotdGVzdFByb3A9Ym9vCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLXNhbWVOYW1lL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA4OTM1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPW9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06YXNzZW1ibHkKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMzMjRjYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLXNhbWVOYW1lL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgCi0gIDxuYW1lPlBhcmVudDwvbmFtZT4KLQotICA8YnVpbGQ+Ci0gICAgPGZpbHRlcnM+Ci0gICAgICA8ZmlsdGVyPmEucHJvcGVydGllczwvZmlsdGVyPgotICAgIDwvZmlsdGVycz4KLSAgICAgICAgCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZmlsZS1zYW1lTmFtZS9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljOTgwMWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZmlsZS1zYW1lTmFtZS9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+bWFzc2VtYmx5LTE0OC1leGFtcGxlPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlcz4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+c3JjL2NvbmZpZy9hL2ZpbGUudHh0PC9zb3VyY2U+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmE8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICA8L2ZpbGU+Ci0gICAgPGZpbGU+Ci0gICAgICA8c291cmNlPnNyYy9jb25maWcvYi9maWxlLnR4dDwvc291cmNlPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5iPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8ZGVzdE5hbWU+ZmlsZS50eHQ8L2Rlc3ROYW1lPgotICAgICAgPGZpbHRlcmVkPnRydWU8L2ZpbHRlcmVkPgotICAgIDwvZmlsZT4KLSAgPC9maWxlcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLXNhbWVOYW1lL3NyYy9jb25maWcvYS9maWxlLnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvc3JjL2NvbmZpZy9hL2ZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzAxYzNjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvc3JjL2NvbmZpZy9hL2ZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1maWxlIEEKLSR7dGVzdFByb3B9CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLXNhbWVOYW1lL3NyYy9jb25maWcvYi9maWxlLnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvc3JjL2NvbmZpZy9iL2ZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmM2MDZmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvc3JjL2NvbmZpZy9iL2ZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1maWxlIEIKLSR7dGVzdFByb3B9Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2ZpbGUtc2FtZU5hbWUvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdmNGY0NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9maWxlLXNhbWVOYW1lL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgRmlsZSBhID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvcGFyZW50LTEuMC1tYXNzZW1ibHktMTQ4LWV4YW1wbGUvYS9maWxlLnR4dCIpOwotICAgIEZpbGUgYiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtbWFzc2VtYmx5LTE0OC1leGFtcGxlL2IvZmlsZS50eHQiKTsKLSAgICBpZihyZXN1bHQpIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihhKSk7Ci0gICAgICAgIFN0cmluZyBzID0gci5yZWFkTGluZSgpOwotICAgICAgICByZXN1bHQgPSBzLmVxdWFscygiZmlsZSBBIik7Ci0gICAgfQotICAgIGlmKHJlc3VsdCkgewotICAgICAgICBCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGIpKTsKLSAgICAgICAgU3RyaW5nIHMgPSByLnJlYWRMaW5lKCk7Ci0gICAgICAgIHJlc3VsdCA9IHMuZXF1YWxzKCJmaWxlIEIiKTsKLSAgICB9Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Zvcm1hdHMtaW4tcG9tLXdpbi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZm9ybWF0cy1pbi1wb20td2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1M2Y5NzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZm9ybWF0cy1pbi1wb20td2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICAgIDxuYW1lPlRlc3Q8L25hbWU+Ci0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtYXRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybWF0cz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZm9ybWF0cy1pbi1wb20td2luL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzLWluLXBvbS13aW4vc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU1YjZkNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzLWluLXBvbS13aW4vc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+dGFyZ2V0LyoqPC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZm9ybWF0cy1pbi1wb20td2luL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzLWluLXBvbS13aW4vdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTJmMWE0NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzLWluLXBvbS13aW4vdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcmV0dXJuICFuZXcgamF2YS5pby5GaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLXNyYy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIiApLmV4aXN0cygpICYmCi0gICAgICAgbmV3IGphdmEuaW8uRmlsZSggYmFzZWRpciwgInRhcmdldC9wYXJlbnQtMS1zcmMuemlwIiApIC5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Zvcm1hdHMvVE9ETy50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzL1RPRE8udHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVlNmFlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Zvcm1hdHMvVE9ETy50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UZXN0CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzL2dvYWxzLnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Zvcm1hdHMvZ29hbHMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2VkODViLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Zvcm1hdHMvZ29hbHMudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotY2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpzaW5nbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Zvcm1hdHMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2Zvcm1hdHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzI5OTg5My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+Zm9ybWF0LXRlc3Q8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgCi0gIDxuYW1lPlRlc3Q8L25hbWU+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsaWVzL2Zvcm1hdC10ZXN0LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXNzZW1ibGllczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+cG9zaXg8L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZm9ybWF0cy9zcmMvYXNzZW1ibGllcy9mb3JtYXQtdGVzdC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzL3NyYy9hc3NlbWJsaWVzL2Zvcm1hdC10ZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhYTQ1YS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzL3NyYy9hc3NlbWJsaWVzL2Zvcm1hdC10ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMAotICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+Zm9ybWF0LXRlc3Q8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD50YXI8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICAgIDxmb3JtYXQ+dGd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD50YXIuYnoyPC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD50YnoyPC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PndhcjwvZm9ybWF0PgotICAgIDxmb3JtYXQ+dGFyLnNuYXBweTwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlcz4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+VE9ETy50eHQ8L3NvdXJjZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDwvZmlsZT4KLSAgPC9maWxlcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9mb3JtYXRzL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNTU3YTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvZm9ybWF0cy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgRmlsZSBhc3NlbWJseSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2Fzc2VtYmxpZXMvZm9ybWF0LXRlc3QtMS4wIiApOwotICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBhc3NlbWJseS5leGlzdHMoKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgYXNzZW1ibHkuaXNEaXJlY3RvcnkoKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGFzc2VtYmx5LCAiVE9ETy50eHQiICkuZXhpc3RzKCk7Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotdHJ5Ci17Ci0gICAgRmlsZSBhc3NlbWJseSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2Fzc2VtYmxpZXMvZm9ybWF0LXRlc3QtMS4wLnppcCIgKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgYXNzZW1ibHkuZXhpc3RzKCk7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICYmIGFzc2VtYmx5LmlzRmlsZSgpOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXRyeQotewotICAgIEZpbGUgYXNzZW1ibHkgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9hc3NlbWJsaWVzL2Zvcm1hdC10ZXN0LTEuMC50YXIiICk7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICYmIGFzc2VtYmx5LmV4aXN0cygpOwotICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBhc3NlbWJseS5pc0ZpbGUoKTsKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi10cnkKLXsKLSAgICBGaWxlIGFzc2VtYmx5ID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvYXNzZW1ibGllcy9mb3JtYXQtdGVzdC0xLjAudGFyLmd6IiApOwotICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBhc3NlbWJseS5leGlzdHMoKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgYXNzZW1ibHkuaXNGaWxlKCk7Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotdHJ5Ci17Ci0gICAgRmlsZSBhc3NlbWJseSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2Fzc2VtYmxpZXMvZm9ybWF0LXRlc3QtMS4wLnRneiIgKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgYXNzZW1ibHkuZXhpc3RzKCk7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICYmIGFzc2VtYmx5LmlzRmlsZSgpOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXRyeQotewotICAgIEZpbGUgYXNzZW1ibHkgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9hc3NlbWJsaWVzL2Zvcm1hdC10ZXN0LTEuMC50YXIuYnoyIiApOwotICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBhc3NlbWJseS5leGlzdHMoKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgYXNzZW1ibHkuaXNGaWxlKCk7Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotdHJ5Ci17Ci0gICAgRmlsZSBhc3NlbWJseSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2Fzc2VtYmxpZXMvZm9ybWF0LXRlc3QtMS4wLnRiejIiICk7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICYmIGFzc2VtYmx5LmV4aXN0cygpOwotICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBhc3NlbWJseS5pc0ZpbGUoKTsKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi10cnkKLXsKLSAgICBGaWxlIGFzc2VtYmx5ID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvYXNzZW1ibGllcy9mb3JtYXQtdGVzdC0xLjAuamFyIiApOwotICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBhc3NlbWJseS5leGlzdHMoKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgYXNzZW1ibHkuaXNGaWxlKCk7Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotdHJ5Ci17Ci0gICAgRmlsZSBhc3NlbWJseSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2Fzc2VtYmxpZXMvZm9ybWF0LXRlc3QtMS4wLndhciIgKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgYXNzZW1ibHkuZXhpc3RzKCk7Ci0gICAgcmVzdWx0ID0gcmVzdWx0ICYmIGFzc2VtYmx5LmlzRmlsZSgpOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXRyeQotewotICAgIEZpbGUgYXNzZW1ibHkgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9hc3NlbWJsaWVzL2Zvcm1hdC10ZXN0LTEuMC50YXIuc25hcHB5IiApOwotICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBhc3NlbWJseS5leGlzdHMoKTsKLSAgICByZXN1bHQgPSByZXN1bHQgJiYgYXNzZW1ibHkuaXNGaWxlKCk7Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2xvY2FsLXJlcG8taW50ZXJwL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9sb2NhbC1yZXBvLWludGVycC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTE0Y2M0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2xvY2FsLXJlcG8taW50ZXJwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnRlc3Q8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9sb2NhbC1yZXBvLWludGVycC9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbG9jYWwtcmVwby1pbnRlcnAvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmJjOGZlMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9sb2NhbC1yZXBvLWludGVycC9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gICAgPGlkPmJpbjwvaWQ+Ci0gICAgPGZvcm1hdHM+Ci0gICAgICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gICAgCi0gICAgPGZpbGVzPgotICAgICAgPGZpbGU+Ci0gICAgICAgIDxzb3VyY2U+JHtsb2NhbFJlcG9zaXRvcnl9L29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vJHt0ZXN0VmVyc2lvbn0vbWF2ZW4tYXNzZW1ibHktcGx1Z2luLSR7dGVzdFZlcnNpb259Lmphcjwvc291cmNlPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnVucHJlZml4ZWQ8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPGRlc3ROYW1lPm1hdmVuLWFzc2VtYmx5LXBsdWdpbi5qYXI8L2Rlc3ROYW1lPgotICAgICAgPC9maWxlPgotICAgICAgPGZpbGU+Ci0gICAgICAgIDxzb3VyY2U+JHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9L29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vJHt0ZXN0VmVyc2lvbn0vbWF2ZW4tYXNzZW1ibHktcGx1Z2luLSR7dGVzdFZlcnNpb259Lmphcjwvc291cmNlPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnByZWZpeGVkPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgIDxkZXN0TmFtZT5tYXZlbi1hc3NlbWJseS1wbHVnaW4uamFyPC9kZXN0TmFtZT4KLSAgICAgIDwvZmlsZT4KLSAgICA8L2ZpbGVzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2xvY2FsLXJlcG8taW50ZXJwL3NyYy9tYWluL2ZpbGVzL3NvbWUuZmlsZSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2xvY2FsLXJlcG8taW50ZXJwL3NyYy9tYWluL2ZpbGVzL3NvbWUuZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9sb2NhbC1yZXBvLWludGVycC9zcmMvbWFpbi9maWxlcy9zb21lLmZpbGUKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbG9jYWwtcmVwby1pbnRlcnAvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL2xvY2FsLXJlcG8taW50ZXJwL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZGU3MzIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbG9jYWwtcmVwby1pbnRlcnAvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotRmlsZSBmID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdGVzdC0xLWJpbi91bnByZWZpeGVkL21hdmVuLWFzc2VtYmx5LXBsdWdpbi5qYXIiICk7Ci1GaWxlIGYyID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdGVzdC0xLWJpbi9wcmVmaXhlZC9tYXZlbi1hc3NlbWJseS1wbHVnaW4uamFyIiApOwotCi1pZiAoICFmLmV4aXN0cygpIHx8ICFmLmlzRmlsZSgpICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGaWxlOiAiICsgZiArICIgZG9lc24ndCBleGlzdCwgb3IgaXNuJ3QgYSBmaWxlLiIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWlmICggIWYyLmV4aXN0cygpIHx8ICFmMi5pc0ZpbGUoKSApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiRmlsZTogIiArIGYyICsgIiBkb2Vzbid0IGV4aXN0LCBvciBpc24ndCBhIGZpbGUuIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMjU2LXBvbVByb3BlcnRpZXNJbnRlcnAvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTI1Ni1wb21Qcm9wZXJ0aWVzSW50ZXJwL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE4YmY3ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMjU2LXBvbVByb3BlcnRpZXNJbnRlcnAvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06YXR0YWNoZWQKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0yNTYtcG9tUHJvcGVydGllc0ludGVycC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTI1Ni1wb21Qcm9wZXJ0aWVzSW50ZXJwL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMmE5NmUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTI1Ni1wb21Qcm9wZXJ0aWVzSW50ZXJwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yNTYtcG9tUHJvcGVydGllc0ludGVycDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9teWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0gIDxwcm9wZXJ0aWVzPgotICAgIDxmaWxlTG9jYXRpb24+ZmlsZS9wYXRoPC9maWxlTG9jYXRpb24+Ci0gICAgPGZpbGVMb2NhdGlvbjI+ZmlsZTIvcGF0aDwvZmlsZUxvY2F0aW9uMj4KLSAgICA8ZmlsZUxvY2F0aW9uMz5maWxlMy9wYXRoPC9maWxlTG9jYXRpb24zPgotICA8L3Byb3BlcnRpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMjU2LXBvbVByb3BlcnRpZXNJbnRlcnAvc3JjL21haW4vYXNzZW1ibHkvbXlhc3NlbWJseS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMjU2LXBvbVByb3BlcnRpZXNJbnRlcnAvc3JjL21haW4vYXNzZW1ibHkvbXlhc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0ODYzNDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTI1Ni1wb21Qcm9wZXJ0aWVzSW50ZXJwL3NyYy9tYWluL2Fzc2VtYmx5L215YXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gICAgPGlkPm15YXNzZW1ibHk8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2ZpbGVzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7ZmlsZUxvY2F0aW9ufTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9maWxlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3BvbS5wcm9wZXJ0aWVzLmZpbGVMb2NhdGlvbjJ9PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2ZpbGVzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5wcm9wZXJ0aWVzLmZpbGVMb2NhdGlvbjN9PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0yNTYtcG9tUHJvcGVydGllc0ludGVycC9zcmMvbWFpbi9maWxlcy9zb21lLmZpbGUgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMjU2LXBvbVByb3BlcnRpZXNJbnRlcnAvc3JjL21haW4vZmlsZXMvc29tZS5maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0yNTYtcG9tUHJvcGVydGllc0ludGVycC9zcmMvbWFpbi9maWxlcy9zb21lLmZpbGUKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTI1Ni1wb21Qcm9wZXJ0aWVzSW50ZXJwL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMjU2LXBvbVByb3BlcnRpZXNJbnRlcnAvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQwNDA2YS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMjU2LXBvbVByb3BlcnRpZXNJbnRlcnAvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotRmlsZSBmID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvbWFzc2VtYmx5LTI1Ni1wb21Qcm9wZXJ0aWVzSW50ZXJwLTEtbXlhc3NlbWJseS9maWxlL3BhdGgvc29tZS5maWxlIiApOwotRmlsZSBmMiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS0yNTYtcG9tUHJvcGVydGllc0ludGVycC0xLW15YXNzZW1ibHkvZmlsZTIvcGF0aC9zb21lLmZpbGUiICk7Ci1GaWxlIGYzID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvbWFzc2VtYmx5LTI1Ni1wb21Qcm9wZXJ0aWVzSW50ZXJwLTEtbXlhc3NlbWJseS9maWxlMy9wYXRoL3NvbWUuZmlsZSIgKTsKLQotYm9vbGVhbiBmT0sgPSBmLmV4aXN0cygpICYmIGYuaXNGaWxlKCk7Ci1pZiAoICFmT0sgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBmICsgIiBkb2Vzbid0IGV4aXN0LCBvciBpc24ndCBhIGZpbGUuIiApOwotfQotCi1ib29sZWFuIGYyT0sgPSBmMi5leGlzdHMoKSAmJiBmMi5pc0ZpbGUoKTsKLWlmICggIWYyT0sgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBmMiArICIgZG9lc24ndCBleGlzdCwgb3IgaXNuJ3QgYSBmaWxlLiIgKTsKLX0KLQotYm9vbGVhbiBmM09LID0gZjMuZXhpc3RzKCkgJiYgZjMuaXNGaWxlKCk7Ci1pZiAoICFmM09LICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGaWxlOiAiICsgZjMgKyAiIGRvZXNuJ3QgZXhpc3QsIG9yIGlzbid0IGEgZmlsZS4iICk7Ci19Ci0KLXJldHVybiBmT0sgJiYgZjJPSzsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0zNTEtcHJvamVjdFByZWZpeEludGVycC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMzUxLXByb2plY3RQcmVmaXhJbnRlcnAvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYThiZjdlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0zNTEtcHJvamVjdFByZWZpeEludGVycC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTphdHRhY2hlZApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTM1MS1wcm9qZWN0UHJlZml4SW50ZXJwL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMzUxLXByb2plY3RQcmVmaXhJbnRlcnAvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg0NDZhOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMzUxLXByb2plY3RQcmVmaXhJbnRlcnAvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9teWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMzUxLXByb2plY3RQcmVmaXhJbnRlcnAvc3JjL21haW4vYXNzZW1ibHkvbXlhc3NlbWJseS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMzUxLXByb2plY3RQcmVmaXhJbnRlcnAvc3JjL21haW4vYXNzZW1ibHkvbXlhc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0YjYwZWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTM1MS1wcm9qZWN0UHJlZml4SW50ZXJwL3NyYy9tYWluL2Fzc2VtYmx5L215YXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gICAgPGlkPm15YXNzZW1ibHk8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLSAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAgIDxmaWxlU2V0cz4KLSAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2ZpbGVzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9maWxlczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICA8aW5jbHVkZT4ke2FydGlmYWN0SWR9MS5maWxlPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vZmlsZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2ZpbGVzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgIDxpbmNsdWRlPiR7cG9tLmFydGlmYWN0SWR9Mi5maWxlPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vZmlsZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2ZpbGVzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgIDxpbmNsdWRlPiR7cHJvamVjdC5hcnRpZmFjdElkfTMuZmlsZTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvZmlsZVNldD4KLSAgICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0zNTEtcHJvamVjdFByZWZpeEludGVycC9zcmMvbWFpbi9maWxlcy9wcm9qZWN0MS5maWxlIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTM1MS1wcm9qZWN0UHJlZml4SW50ZXJwL3NyYy9tYWluL2ZpbGVzL3Byb2plY3QxLmZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU2OWRlMjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTM1MS1wcm9qZWN0UHJlZml4SW50ZXJwL3NyYy9tYWluL2ZpbGVzL3Byb2plY3QxLmZpbGUKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTM1MS1wcm9qZWN0UHJlZml4SW50ZXJwL3NyYy9tYWluL2ZpbGVzL3Byb2plY3QyLmZpbGUgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMzUxLXByb2plY3RQcmVmaXhJbnRlcnAvc3JjL21haW4vZmlsZXMvcHJvamVjdDIuZmlsZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMzUxLXByb2plY3RQcmVmaXhJbnRlcnAvc3JjL21haW4vZmlsZXMvcHJvamVjdDIuZmlsZQorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9tYXNzZW1ibHktMzUxLXByb2plY3RQcmVmaXhJbnRlcnAvc3JjL21haW4vZmlsZXMvcHJvamVjdDMuZmlsZSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0zNTEtcHJvamVjdFByZWZpeEludGVycC9zcmMvbWFpbi9maWxlcy9wcm9qZWN0My5maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0zNTEtcHJvamVjdFByZWZpeEludGVycC9zcmMvbWFpbi9maWxlcy9wcm9qZWN0My5maWxlCisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL21hc3NlbWJseS0zNTEtcHJvamVjdFByZWZpeEludGVycC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTM1MS1wcm9qZWN0UHJlZml4SW50ZXJwL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZjRlYTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvbWFzc2VtYmx5LTM1MS1wcm9qZWN0UHJlZml4SW50ZXJwL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgZiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Byb2plY3QtMS1teWFzc2VtYmx5L2ZpbGVzL3Byb2plY3QxLmZpbGUiICk7Ci1GaWxlIGYyID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvcHJvamVjdC0xLW15YXNzZW1ibHkvZmlsZXMvcHJvamVjdDIuZmlsZSIgKTsKLUZpbGUgZjMgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9wcm9qZWN0LTEtbXlhc3NlbWJseS9maWxlcy9wcm9qZWN0My5maWxlIiApOwotCi1ib29sZWFuIGZPSyA9IGYuZXhpc3RzKCkgJiYgZi5pc0ZpbGUoKTsKLWlmICggIWZPSyApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiRmlsZTogIiArIGYgKyAiIGRvZXNuJ3QgZXhpc3QsIG9yIGlzbid0IGEgZmlsZS4iICk7Ci19Ci0KLWJvb2xlYW4gZjJPSyA9IGYyLmV4aXN0cygpICYmIGYyLmlzRmlsZSgpOwotaWYgKCAhZjJPSyApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiRmlsZTogIiArIGYyICsgIiBkb2Vzbid0IGV4aXN0LCBvciBpc24ndCBhIGZpbGUuIiApOwotfQotCi1ib29sZWFuIGYzT0sgPSBmMy5leGlzdHMoKSAmJiBmMy5pc0ZpbGUoKTsKLWlmICggIWYzT0sgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBmMyArICIgZG9lc24ndCBleGlzdCwgb3IgaXNuJ3QgYSBmaWxlLiIgKTsKLX0KLQotcmV0dXJuIGZPSyAmJiBmMk9LOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXNpbXBsZS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctc2ltcGxlL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY2N2ExZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctc2ltcGxlL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tYXNzZW1ibHktcGx1Z2luOiR7dGVzdFZlcnNpb259OmRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXNpbXBsZS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXNpbXBsZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjFiNTVmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy1zaW1wbGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAKLSAgPG5hbWU+UGFyZW50PC9uYW1lPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctc2ltcGxlL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXNpbXBsZS9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4NjIzMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctc2ltcGxlL3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbmRpcjwvaWQ+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5jb21tb25zLWxvZ2dpbmc6Y29tbW9ucy1sb2dnaW5nPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNDc2YzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tYXNzZW1ibHktcGx1Z2luOiR7dGVzdFZlcnNpb259OmRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3ZjJmZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb248L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8cmVwb3NpdG9yaWVzPgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPGlkPnRlc3Qtc25hcHNob3RzPC9pZD4KLSAgICAgIDx1cmw+ZmlsZTovLyR7YmFzZWRpcn0vcmVwb3NpdG9yeTwvdXJsPgotICAgICAgPHJlbGVhc2VzPgotICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgIDwvcmVsZWFzZXM+Ci0gICAgPC9yZXBvc2l0b3J5PgotICA8L3JlcG9zaXRvcmllcz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3JlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvMS4zLVNOQVBTSE9UL21hdmVuLW1ldGFkYXRhLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzLzEuMy1TTkFQU0hPVC9tYXZlbi1tZXRhZGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MGU5YjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3JlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvMS4zLVNOQVBTSE9UL21hdmVuLW1ldGFkYXRhLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PG1ldGFkYXRhPgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMy1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHZlcnNpb25pbmc+Ci0gICAgPHNuYXBzaG90PgotICAgICAgPHRpbWVzdGFtcD4yMDA2MDgxMS4xNTE2MjQ8L3RpbWVzdGFtcD4KLSAgICAgIDxidWlsZE51bWJlcj4xPC9idWlsZE51bWJlcj4KLSAgICA8L3NuYXBzaG90PgotICAgIDxsYXN0VXBkYXRlZD4yMDA2MDgxMTE1MTYyNDwvbGFzdFVwZGF0ZWQ+Ci0gIDwvdmVyc2lvbmluZz4KLTwvbWV0YWRhdGE+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjMtU05BUFNIT1QvbWF2ZW4tbWV0YWRhdGEueG1sLm1kNSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzLzEuMy1TTkFQU0hPVC9tYXZlbi1tZXRhZGF0YS54bWwubWQ1CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjI3MjJlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzLzEuMy1TTkFQU0hPVC9tYXZlbi1tZXRhZGF0YS54bWwubWQ1CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotNDFjODZjNjEzODY2MmY4OWI4ZjkwMjA2OTlmZGY1YjkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjMtU05BUFNIT1QvbWF2ZW4tbWV0YWRhdGEueG1sLnNoYTEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjMtU05BUFNIT1QvbWF2ZW4tbWV0YWRhdGEueG1sLnNoYTEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3NTk0NTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3JlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvMS4zLVNOQVBTSE9UL21hdmVuLW1ldGFkYXRhLnhtbC5zaGExCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotMjE3NWY5Y2QxOGNiMmUzNmEyMDgxODI3OWExNDhlYmE1YWQ2Y2NmZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzLzEuMy1TTkFQU0hPVC9wbGV4dXMtdXRpbHMtMS4zLTIwMDYwODExLjE1MTYyNC0xLmphciBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzLzEuMy1TTkFQU0hPVC9wbGV4dXMtdXRpbHMtMS4zLTIwMDYwODExLjE1MTYyNC0xLmphcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU0NDBmZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjMtU05BUFNIT1QvcGxleHVzLXV0aWxzLTEuMy0yMDA2MDgxMS4xNTE2MjQtMS5qYXIKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjMtU05BUFNIT1QvcGxleHVzLXV0aWxzLTEuMy0yMDA2MDgxMS4xNTE2MjQtMS5wb20gYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjMtU05BUFNIT1QvcGxleHVzLXV0aWxzLTEuMy0yMDA2MDgxMS4xNTE2MjQtMS5wb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2M0MjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3JlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvMS4zLVNOQVBTSE9UL3BsZXh1cy11dGlscy0xLjMtMjAwNjA4MTEuMTUxNjI0LTEucG9tCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48cHJvamVjdD4KLSAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPlBsZXh1cyBDb21tb24gVXRpbGl0aWVzPC9uYW1lPgotICA8dmVyc2lvbj4xLjMtMjAwNjA4MTEuMTUxNjI0LTE8L3ZlcnNpb24+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGNoaWxkRGVsZWdhdGlvbj50cnVlPC9jaGlsZERlbGVnYXRpb24+Ci0gICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgPGV4Y2x1ZGU+b3JnL2NvZGVoYXVzL3BsZXh1cy91dGlsL0ZpbGVCYXNlZFRlc3RDYXNlLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8ZXhjbHVkZT4qKi9UZXN0Ki5qYXZhPC9leGNsdWRlPgotICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLSAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgIDxpZD5sb2NhbC1mb3ItdGVzdHM8L2lkPgotICAgICAgPHVybD5maWxlOi8vL3RtcC9yZXBvc2l0b3J5PC91cmw+Ci0gICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgPHN0YXR1cz5kZXBsb3llZDwvc3RhdHVzPgotICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy9tYXZlbi1tZXRhZGF0YS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy9tYXZlbi1tZXRhZGF0YS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMWIzYTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3JlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvbWF2ZW4tbWV0YWRhdGEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz48bWV0YWRhdGE+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBsZXh1cy11dGlsczwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4zLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8dmVyc2lvbmluZz4KLSAgICA8dmVyc2lvbnM+Ci0gICAgICA8dmVyc2lvbj4xLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC92ZXJzaW9ucz4KLSAgICA8bGFzdFVwZGF0ZWQ+MjAwNjA4MTExNTE2MjQ8L2xhc3RVcGRhdGVkPgotICA8L3ZlcnNpb25pbmc+Ci08L21ldGFkYXRhPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3JlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvbWF2ZW4tbWV0YWRhdGEueG1sLm1kNSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzL21hdmVuLW1ldGFkYXRhLnhtbC5tZDUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYjIxZDguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3JlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvbWF2ZW4tbWV0YWRhdGEueG1sLm1kNQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWI2Nzg5ZTJlYzEyMTg3YTFiMDM2NjUyY2YyZjgxNTExClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3JlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvbWF2ZW4tbWV0YWRhdGEueG1sLnNoYTEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy9tYXZlbi1tZXRhZGF0YS54bWwuc2hhMQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwMDkxMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy9tYXZlbi1tZXRhZGF0YS54bWwuc2hhMQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWQzOGY0YmNkMWY3MWE0YTY3ZDNkYWIwNjMyOTA1MjY2Y2VhOTQyYWIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NjI0ZDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0tJHthcnRpZmFjdC5iYXNlVmVyc2lvbn0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL291dHB1dEZpbGVOYW1lTWFwcGluZy13aXRoQXJ0aWZhY3RCYXNlVmVyc2lvbi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nLXdpdGhBcnRpZmFjdEJhc2VWZXJzaW9uL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk1ZmExMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24vdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICByZXN1bHQgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9vdXRwdXRGaWxlTmFtZU1hcHBpbmctd2l0aEFydGlmYWN0QmFzZVZlcnNpb24tMS4wLVNOQVBTSE9ULWJpbi9saWIvcGxleHVzLXV0aWxzLTEuMy5qYXIiICkuZXhpc3RzKCk7ICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3JlbGF0aXZlLXByb2plY3QtcGF0aHMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvcmVsYXRpdmUtcHJvamVjdC1wYXRocy9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MTNmM2YuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvcmVsYXRpdmUtcHJvamVjdC1wYXRocy9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gdmFsaWRhdGUKLSNpbnZva2VyLm1hdmVuT3B0cz0tWGRlYnVnIC1Ybm9hZ2VudCAtRGphdmEuY29tcGlsZXI9Tk9ORSAtWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz04MDAwCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9yZWxhdGl2ZS1wcm9qZWN0LXBhdGhzL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9yZWxhdGl2ZS1wcm9qZWN0LXBhdGhzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4NjUzOWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvcmVsYXRpdmUtcHJvamVjdC1wYXRocy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5yZWxhdGl2ZS1wcm9qZWN0LXBhdGhzPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxwaGFzZT52YWxpZGF0ZTwvcGhhc2U+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3JlbGF0aXZlLXByb2plY3QtcGF0aHMvc3JjL2Fzc2VtYmxlL3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9yZWxhdGl2ZS1wcm9qZWN0LXBhdGhzL3NyYy9hc3NlbWJsZS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWI0ZDI2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3JlbGF0aXZlLXByb2plY3QtcGF0aHMvc3JjL2Fzc2VtYmxlL3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHk+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmphcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPioqLyoubG9nPC9leGNsdWRlPgotICAgICAgICA8ZXhjbHVkZT50YXJnZXQvKio8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9yZWxhdGl2ZS1wcm9qZWN0LXBhdGhzL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy9yZWxhdGl2ZS1wcm9qZWN0LXBhdGhzL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMGUzODUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYmFzaWMtZmVhdHVyZXMvcmVsYXRpdmUtcHJvamVjdC1wYXRocy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIEZpbGUgZiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3JlbGF0aXZlLXByb2plY3QtcGF0aHMtMS4wLXNyYy5qYXIiICk7Ci0gICAgaWYgKCAhZi5leGlzdHMoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJqYXIgaXMgbWlzc2luZyIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEphckZpbGUgamYgPSBuZXcgSmFyRmlsZSggZiApOwotICAgIEphckVudHJ5IGplID0gamYuZ2V0RW50cnkoICJwb20ueG1sIiApOwotCi0gICAgaWYgKCBqZSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInBvbS54bWwgZW50cnkgaW4gamFyIGlzIG1pc3NpbmciICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3RoaXMgJiB0aGF0L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy90aGlzICYgdGhhdC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMzMjIyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3RoaXMgJiB0aGF0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICAKLSAgPG5hbWU+VGVzdDwvbmFtZT4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3RoaXMgJiB0aGF0L3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy90aGlzICYgdGhhdC9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTViNmQ3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3RoaXMgJiB0aGF0L3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHk+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPnRhcmdldC8qKjwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3RoaXMgJiB0aGF0L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9iYXNpYy1mZWF0dXJlcy90aGlzICYgdGhhdC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGZmOWJiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Jhc2ljLWZlYXR1cmVzL3RoaXMgJiB0aGF0L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXJldHVybiBuZXcgamF2YS5pby5GaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLXNyYy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIiApLmV4aXN0cygpOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL2NoaWxkLTEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTE5MC9jaGlsZC0xL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNjJjYjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL2NoaWxkLTEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQtMTwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWNvZGVjPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1jb2RlYzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL2NoaWxkLTEvc3JjL21haW4vcmVzb3VyY2VzL3Rlc3QudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL2NoaWxkLTEvc3JjL21haW4vcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVlNmFlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTE5MC9jaGlsZC0xL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRlc3QKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTE5MC9jaGlsZC0yL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0xOTAvY2hpbGQtMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDU3NzQyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTE5MC9jaGlsZC0yL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxhcnRpZmFjdElkPmNoaWxkLTI8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtaHR0cGNsaWVudDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtaHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgLS0+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL2NoaWxkLTIvc3JjL21haW4vcmVzb3VyY2VzL3Rlc3QudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL2NoaWxkLTIvc3JjL21haW4vcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDVlNmFlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTE5MC9jaGlsZC0yL3NyYy9tYWluL3Jlc291cmNlcy90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVRlc3QKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTE5MC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0xOTAvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWI2MDBmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTE5MC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZSBhc3NlbWJseTphc3NlbWJseQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0xOTAvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA4YWVkYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0xOTAvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZC0xPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZC0yPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTE5MC9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzZmI2ODguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDxiaW5hcmllcz4KLSAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke21vZHVsZS5hcnRpZmFjdElkfTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8aW5jbHVkZURlcGVuZGVuY2llcz50cnVlPC9pbmNsdWRlRGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgIDxpbmNsdWRlPmNvbW1vbnMtY29kZWMqPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldHM+Ci0gICAgICA8L2JpbmFyaWVzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMTkwL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0xOTAvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjgwNTRiZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0xOTAvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotRmlsZSBjaGlsZDFDb2RlYyA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Byb2plY3QtMS1iaW4vY2hpbGQtMS9jb21tb25zLWNvZGVjLTEuMy5qYXIiICk7Ci1GaWxlIGNoaWxkMkNvZGVjID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvcHJvamVjdC0xLWJpbi9jaGlsZC0yL2NvbW1vbnMtY29kZWMtMS4zLmphciIgKTsKLQotaWYgKCAhY2hpbGQxQ29kZWMuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImNvbW1vbnMtY29kZWMgZGVwZW5kZW5jeSBpbiBjaGlsZC0xIG1vZHVsZSBpcyBlaXRoZXIgbWlzc2luZyBvciBpcyB0aGUgd3JvbmcgdmVyc2lvbi4gRmlsZSBtaXNzaW5nOiAiICsgY2hpbGQxQ29kZWMgKTsKLX0KLQotaWYgKCAhY2hpbGQyQ29kZWMuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggImNvbW1vbnMtY29kZWMgZGVwZW5kZW5jeSBpbiBjaGlsZC0yIG1vZHVsZSBpcyBlaXRoZXIgbWlzc2luZyBvciBpcyB0aGUgd3JvbmcgdmVyc2lvbi4gRmlsZSBtaXNzaW5nOiAiICsgY2hpbGQyQ29kZWMgKTsKLX0KLQotcmV0dXJuIGNoaWxkMUNvZGVjLmV4aXN0cygpICYmIGNoaWxkMkNvZGVjLmV4aXN0cygpOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDJlNTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1pbnN0YWxsCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyNWM1OGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtYXNzZW1ibHkvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPSMgU3BlY2lmeSB0aGUgZ29hbHMgdG8gYmUgcnVuIGhlcmUsIG9uZSBwZXIgbGluZS4gTGluZXMgYmVnaW5uaW5nIHdpdGggYSBoYXNoICcjJyB3aWxsIGJlIGlnbm9yZWQuIGNsZWFuIHBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS9tYXNzZW1ibHktMjg1LWFzc2VtYmx5L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTZlMTZiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS9tYXNzZW1ibHktMjg1LWFzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yODU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5tYXNzZW1ibHktMjg1LWFzc2VtYmx5PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPiR7cG9tLmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+JHtwb20ucGFyZW50LmFydGlmYWN0SWR9LW1vZDE8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPiR7cG9tLmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+JHtwb20ucGFyZW50LmFydGlmYWN0SWR9LW1vZDI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnNpbmdsZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS9tYXNzZW1ibHktMjg1LWFzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjBlMjMxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS9tYXNzZW1ibHktMjg1LWFzc2VtYmx5L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KLSAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS9zcmMvbWFpbi9qYXZhL3Rlc3RzL0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtYXNzZW1ibHkvc3JjL21haW4vamF2YS90ZXN0cy9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE3N2UyNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS9zcmMvbWFpbi9qYXZhL3Rlc3RzL0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0czsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtYXNzZW1ibHkvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFmMDdmNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKgotIFRoaXMgaXMgd2hlcmUgeW91IHZlcmlmeSB0aGUgcmVzdWx0cyBvZiB0aGUgYXNzZW1ibHkgYnVpbGQuIFlvdSBtYXkgbmVlZCB0byBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIGEgZmlsZSwKLSBvciBldmVuIHBlZWsgd2l0aGluIGEgamFyIGZpbGUgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFzc2VtYmx5IGRpZCB0aGUgcmlnaHQgdGhpbmcuCi0gKi8KLXJldHVybiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC8ke2FydGlmYWN0SWR9LSR7dmVyc2lvbn0tYmluLmRpci9saWIvanVuaXQuamFyIiApLmV4aXN0cygpOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtbW9kMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtbW9kMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmViZWYwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS9tYXNzZW1ibHktMjg1LW1vZDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTI4NTwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yODUtbW9kMTwvYXJ0aWZhY3RJZD4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1tb2QxL3NyYy9tYWluL2phdmEvdGVzdHMvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1tb2QxL3NyYy9tYWluL2phdmEvdGVzdHMvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzdlMjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtbW9kMS9zcmMvbWFpbi9qYXZhL3Rlc3RzL0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0czsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1tb2QxL3NyYy90ZXN0L2phdmEvdGVzdHMvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtbW9kMS9zcmMvdGVzdC9qYXZhL3Rlc3RzL0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzNDM5Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1tb2QxL3NyYy90ZXN0L2phdmEvdGVzdHMvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0czsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtbW9kMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtbW9kMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGUwNGUyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS9tYXNzZW1ibHktMjg1LW1vZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTI4NTwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yODUtbW9kMjwvYXJ0aWZhY3RJZD4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1tb2QyL3NyYy9tYWluL2phdmEvdGVzdHMvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1tb2QyL3NyYy9tYWluL2phdmEvdGVzdHMvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxNzdlMjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtbW9kMi9zcmMvbWFpbi9qYXZhL3Rlc3RzL0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0czsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1tb2QyL3NyYy90ZXN0L2phdmEvdGVzdHMvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L21hc3NlbWJseS0yODUtbW9kMi9zcmMvdGVzdC9qYXZhL3Rlc3RzL0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzNDM5Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvbWFzc2VtYmx5LTI4NS1tb2QyL3NyYy90ZXN0L2phdmEvdGVzdHMvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0czsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMjg1L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDE0NDU4Ni4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5tYXNzZW1ibHktMjg1PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5tYXNzZW1ibHktMjg1LW1vZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPm1hc3NlbWJseS0yODUtbW9kMjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bWFzc2VtYmx5LTI4NS1hc3NlbWJseTwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICA8cGx1Z2lucz4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8YXJjaGl2ZXJDb25maWc+Ci0gICAgICAgICAgICAgIDxkdXBsaWNhdGVCZWhhdmlvcj5za2lwPC9kdXBsaWNhdGVCZWhhdmlvcj4KLSAgICAgICAgICAgIDwvYXJjaGl2ZXJDb25maWc+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0yODUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGZjNmJmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTI4NS92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLUZpbGUgZiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAibWFzc2VtYmx5LTI4NS1hc3NlbWJseS90YXJnZXQvbWFzc2VtYmx5LTI4NS1hc3NlbWJseS0xLWJpbi5qYXIiICk7Ci1KYXJGaWxlIGpmID0gbmV3IEphckZpbGUoIGYgKTsKLQotU3RyaW5nIHRlc3RQYXRoID0gInRlc3RzL0FwcC5jbGFzcyI7Ci0KLWludCBqYXJDb3VudCA9IDA7Ci0KLUVudW1lcmF0aW9uIGUgPSBqZi5lbnRyaWVzKCk7Ci13aGlsZSggZS5oYXNNb3JlRWxlbWVudHMoKSApCi17Ci0gICAgaWYgKCB0ZXN0UGF0aC5lcXVhbHMoIFN0cmluZy52YWx1ZU9mKCBlLm5leHRFbGVtZW50KCkgKSApICkKLSAgICB7Ci0gICAgICAgIGphckNvdW50Kys7Ci0gICAgfQotfQotCi1pZiAoIGphckNvdW50ICE9IDEgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkVSUk9SISBUZXN0IHBhdGg6ICIgKyB0ZXN0UGF0aCArICIgd2FzIGZvdW5kICIgKyBqYXJDb3VudCArICIgdGltZXMgKHNob3VsZCBoYXZlIGJlZW4gMSkuXG5BcmNoaXZlOiAiICsgZiApOwotfQotCi1mID0gbmV3IEZpbGUoIGJhc2VkaXIsICJtYXNzZW1ibHktMjg1LWFzc2VtYmx5L3RhcmdldC9tYXNzZW1ibHktMjg1LWFzc2VtYmx5LTEtYmluLnppcCIgKTsKLVppcEZpbGUgemYgPSBuZXcgWmlwRmlsZSggZiApOwotCi1TdHJpbmcgdGVzdFBhdGggPSAidGVzdHMvQXBwLmNsYXNzIjsKLQotaW50IHppcENvdW50ID0gMDsKLQotZSA9IHpmLmVudHJpZXMoKTsKLXdoaWxlKCBlLmhhc01vcmVFbGVtZW50cygpICkKLXsKLSAgICBpZiAoIHRlc3RQYXRoLmVxdWFscyggU3RyaW5nLnZhbHVlT2YoIGUubmV4dEVsZW1lbnQoKSApICkgKQotICAgIHsKLSAgICAgICAgemlwQ291bnQrKzsKLSAgICB9Ci19Ci0KLWlmICggemlwQ291bnQgIT0gMSApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiRVJST1IhIFRlc3QgcGF0aDogIiArIHRlc3RQYXRoICsgIiB3YXMgZm91bmQgIiArIHppcENvdW50ICsgIiB0aW1lcyAoc2hvdWxkIGhhdmUgYmVlbiAxKS5cbkFyY2hpdmU6ICIgKyBmICk7Ci19Ci0KLXJldHVybiBqYXJDb3VudCA9PSAxOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMzA2L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTMwNi9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDNhYTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMzA2L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zMDYvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTMwNi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg0MjdhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTMwNi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5tYXNzZW1ibHktMzA2PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8bmFtZT5tYXNzZW1ibHktMzA2PC9uYW1lPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8IS0tIEtlZXAgdGhlIGphci13aXRoLWRlcGVuZGVuY2llcyBmcm9tIGJlaW5nIGZpbGUtbGVzcy4uLiAtLT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgCi0gICAgICA8IS0tIEJvdGggdGhlIHJhbmdlIEFORCB0aGUgc2NvcGUgYXJlIGNyaXRpY2FsIGhlcmUsIAotICAgICAgICAgICBzaW5jZSB0aGlzIGFydGlmYWN0IHdpbGwgYmUgRVhDTFVERUQgZnJvbSB0aGUgZGVwU2V0LiAtLT4KLSAgICAgIDx2ZXJzaW9uPlsxLjIuMTZdPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5tYWtlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zMjQvYXNzZW1ibHkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMzI0L2Fzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E2MDZjMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zMjQvYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08YXNzZW1ibHk+Ci0JPGlkPmJpbjwvaWQ+Ci0JPGZvcm1hdHM+Ci0JCTxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0JPC9mb3JtYXRzPgotCTxiYXNlRGlyZWN0b3J5PnNwcmluZy0ke3Byb2plY3QudmVyc2lvbn08L2Jhc2VEaXJlY3Rvcnk+Ci0JPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotCQk8ZGVwZW5kZW5jeVNldHM+Ci0JCTxkZXBlbmRlbmN5U2V0PgotCQkJPG91dHB1dERpcmVjdG9yeT5XRUItSU5GL2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotCQkJPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotCQkJPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotCQk8L2RlcGVuZGVuY3lTZXQ+Ci0JCTwvZGVwZW5kZW5jeVNldHM+Ci0KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zMjQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTMyNC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzYwMzRiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTMyNC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0geHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+Ci0KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JPGdyb3VwSWQ+bXlncm91cDwvZ3JvdXBJZD4KLQk8YXJ0aWZhY3RJZD5wcm9qZWN0MjwvYXJ0aWZhY3RJZD4KLQk8dmVyc2lvbj4wLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotCTxidWlsZD4KLQkJPHBsdWdpbnM+Ci0JCQk8cGx1Z2luPgotCQkJCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQkJCQk8dmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdmVyc2lvbj4KLQkJCQk8Y29uZmlndXJhdGlvbj4KLQkJCQkJPGRlc2NyaXB0b3JzPgotCQkJCQkJPGRlc2NyaXB0b3I+YXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgotCQkJCQk8L2Rlc2NyaXB0b3JzPgotCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCQk8ZXhlY3V0aW9ucz4KLQkJCQkJPGV4ZWN1dGlvbj4KLQkJCQkJCTxpZD5tYWtlLWFzc2VtYmx5PC9pZD4KLQkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLQkJCQkJCTxnb2Fscz4KLQkJCQkJCQk8Z29hbD5zaW5nbGU8L2dvYWw+Ci0JCQkJCQk8L2dvYWxzPgotCQkJCQk8L2V4ZWN1dGlvbj4KLQkJCQk8L2V4ZWN1dGlvbnM+Ci0JCQk8L3BsdWdpbj4KLQkJPC9wbHVnaW5zPgotCTwvYnVpbGQ+Ci0JPGRlcGVuZGVuY2llcz4KLQkJPGRlcGVuZGVuY3k+Ci0JCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KLQkJCTxhcnRpZmFjdElkPm1hdmVuLXNoYXJlZC1pbzwvYXJ0aWZhY3RJZD4KLQkJCTx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KLQkJPC9kZXBlbmRlbmN5PgotCQk8ZGVwZW5kZW5jeT4KLQkJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0JCQk8YXJ0aWZhY3RJZD5tYXZlbi1hcnRpZmFjdDwvYXJ0aWZhY3RJZD4KLQkJCTx2ZXJzaW9uPjIuMC4yPC92ZXJzaW9uPgotCQkJPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLQkJPC9kZXBlbmRlbmN5PgotCQk8IS0tIGRlcGVuZGVuY3k+Ci0JCQk8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotCQkJPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0JCQk8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0JCQk8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotCQk8L2RlcGVuZGVuY3kgLS0+Ci0gICAgICAgPC9kZXBlbmRlbmNpZXM+CQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMzc1L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTM3NS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDNhYTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMzc1L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zNzUvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTM3NS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGY4MmE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTM3NS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0zNzU8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3Rlc3QueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5zaW5nbGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zNzUvc3JjL21haW4vYXNzZW1ibHkvdGVzdC50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zNzUvc3JjL21haW4vYXNzZW1ibHkvdGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmZmY4ODEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMzc1L3NyYy9tYWluL2Fzc2VtYmx5L3Rlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotVGVzdCBGaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zNzUvc3JjL21haW4vYXNzZW1ibHkvdGVzdC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zNzUvc3JjL21haW4vYXNzZW1ibHkvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlNjFmOTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMzc1L3NyYy9tYWluL2Fzc2VtYmx5L3Rlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5PgotICA8aWQ+dGVzdDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9hc3NlbWJseTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3QudHh0PC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktMzc1L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zNzUvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTg2Y2VjZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS0zNzUvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLXRyeQotewotICAgIEZpbGUgZiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS0zNzUtMS10ZXN0LmphciIgKTsKLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkV4YW1pbmluZyBhc3NlbWJseSBmaWxlOiAiICsgZiApOwotICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLQotICAgIGlmICggIWYuaXNGaWxlKCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiVGFyZ2V0IGZpbGU6ICIgKyBmICsgIiBkb2Vzbid0IGV4aXN0ISIgKTsKLSAgICAgICAgU3lzdGVtLm91dC5mbHVzaCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgSmFyRmlsZSBqZiA9IG5ldyBKYXJGaWxlKCBmICk7Ci0KLSAgICBKYXJFbnRyeSBqZSA9IGpmLmdldEVudHJ5KCAiL3Rlc3QudHh0IiApOwotICAgIGlmICggamUgIT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJFbnRyeTogL3Rlc3QudHh0IHNob3VsZCBOT1QgZXhpc3QuIiApOwotICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBqZSA9IGpmLmdldEVudHJ5KCAidGVzdC50eHQiICk7Ci0gICAgaWYgKCBqZSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkVudHJ5OiB0ZXN0LnR4dCBTSE9VTEQgZXhpc3QuIiApOwotICAgICAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJWRVJJRklDQVRJT04gUEFTU0VELiIgKTsKLSAgICBTeXN0ZW0ub3V0LmZsdXNoKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci1jYXRjaCAoIFRocm93YWJsZSB0ICkKLXsKLSAgICB0LnByaW50U3RhY2tUcmFjZSggU3lzdGVtLm91dCApOwotICAgIFN5c3RlbS5vdXQuZmx1c2goKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS00NjIvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNDYyL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4NmQ1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS00NjIvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06ZGlyZWN0b3J5LWlubGluZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNDYyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS00NjIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JmMTAxYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS00NjIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS00NjI8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTQ2Mi9zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS00NjIvc3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDk2ZTdjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTQ2Mi9zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0ke3Byb2plY3QudmVyc2lvbn0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTQ2Mi9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNDYyL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxMGJiOTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNDYyL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICAgIDxsaW5lRW5kaW5nPnVuaXg8L2xpbmVFbmRpbmc+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS00NjIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNDYyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS00NjIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTQ2Mi92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNDYyL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjc1YjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNDYyL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotU3RyaW5nIGFzc2VtYmx5RGlyID0gInRhcmdldC9tYXNzZW1ibHktNDYyLTEtc3JjLyI7Ci0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgYXNzZW1ibHlEaXIgKyAidGVzdC50eHQiICkuZXhpc3RzKCk7Ci1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsIGFzc2VtYmx5RGlyICkubGlzdCgpLmxlbmd0aCA9PSAxOwotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNTU5L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01NTkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwOThkOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01NTkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLQk8YXJ0aWZhY3RJZD50ZXN0LWFzc2VtYmx5LXRyYW5zaXRpdmUtYnVnPC9hcnRpZmFjdElkPgotCTx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotCTxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0JCi0JPGRlcGVuZGVuY2llcz4KLQkJPGRlcGVuZGVuY3k+Ci0JCQk8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLQkJCTxhcnRpZmFjdElkPmp1bml0LWRlcDwvYXJ0aWZhY3RJZD4KLQkJCTx2ZXJzaW9uPjQuOC4yPC92ZXJzaW9uPgotCQk8L2RlcGVuZGVuY3k+Ci0JPC9kZXBlbmRlbmNpZXM+Ci0KLQk8YnVpbGQ+Ci0JCTxwbHVnaW5zPgotCQkJPHBsdWdpbj4KLQkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0JCQkJPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotCQkJCTx2ZXJzaW9uPiR7dGVzdFZlcnNpb259PC92ZXJzaW9uPgotCQkJCTxleGVjdXRpb25zPgotCQkJCQk8ZXhlY3V0aW9uPgotCQkJCQkJPGlkPmNyZWF0ZS1hc3NlbWJseTwvaWQ+Ci0JCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0JCQkJCQk8Z29hbHM+Ci0JCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgotCQkJCQkJPC9nb2Fscz4KLQkJCQkJCTxjb25maWd1cmF0aW9uPgotCQkJCQkJCTxkZXNjcmlwdG9ycz4KLQkJCQkJCQkJPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmx5L3Rlc3QueG1sPC9kZXNjcmlwdG9yPgotCQkJCQkJCTwvZGVzY3JpcHRvcnM+Ci0JCQkJCQkJPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0JCQkJCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCQkJCTwvZXhlY3V0aW9uPgotCQkJCTwvZXhlY3V0aW9ucz4KLQkJCTwvcGx1Z2luPgotCQk8L3BsdWdpbnM+Ci0JPC9idWlsZD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNTU5L3NyYy9hc3NlbWJseS90ZXN0LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU1OS9zcmMvYXNzZW1ibHkvdGVzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MzMzMmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNTU5L3NyYy9hc3NlbWJseS90ZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGFzc2VtYmx5Ci0JeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgotCXhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLQotCTxpZD50ZXN0PC9pZD4KLQk8Zm9ybWF0cz4KLQkJPGZvcm1hdD56aXA8L2Zvcm1hdD4KLQk8L2Zvcm1hdHM+Ci0KLQk8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+dHJ1ZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0KLQk8ZGVwZW5kZW5jeVNldHM+Ci0JCTxkZXBlbmRlbmN5U2V0PgotCQkJPGluY2x1ZGVzPgotCQkJCTxpbmNsdWRlPmp1bml0Oio8L2luY2x1ZGU+Ci0JCQk8L2luY2x1ZGVzPgotCQkJPG91dHB1dERpcmVjdG9yeT5qdW5pdC1vbmx5PC9vdXRwdXREaXJlY3Rvcnk+Ci0JCQk8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+IAotCQkJPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotCQkJPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KLQkJPC9kZXBlbmRlbmN5U2V0PgotCQk8ZGVwZW5kZW5jeVNldD4KLQkJCTxvdXRwdXREaXJlY3Rvcnk+bm8tdHJhbnNpdGl2ZTwvb3V0cHV0RGlyZWN0b3J5PgotCQkJPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPiAKLQkJCTx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KLQkJCTx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPmZhbHNlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgotCQk8L2RlcGVuZGVuY3lTZXQ+Ci0JPC9kZXBlbmRlbmN5U2V0cz4KLQotPC9hc3NlbWJseT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODAvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4MC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTIxZDExLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4MC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPg0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotDQotICAgIDxncm91cElkPmNvbS5zdWxha2UubWF2ZW48L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmRpcmVjdG9yeS1tb2RlLWlnbm9yZWQ8L2FydGlmYWN0SWQ+DQotICAgIDx2ZXJzaW9uPjEwLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQ0KLSAgICA8cHJvcGVydGllcz4NCi0gICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPg0KLSAgICA8L3Byb3BlcnRpZXM+DQotDQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICA8IS0tIGJ1bmNoIG9mIHdhcnMgZGVmaW5lZCBoZXJlLCByYW5kb20gY29tbW9ucyBhcnRpZmFjdCBmb3IgdGVzdGluZyAtLT4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtZmlsZXVwbG9hZDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWZpbGV1cGxvYWQ8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+MS4yLjI8L3ZlcnNpb24+DQotICAgICAgICAgICAgPCEtLXR5cGU+d2FyPC90eXBlLS0+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLSAgICA8YnVpbGQ+DQotICAgICAgICA8cGx1Z2lucz4NCi0gICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7dGVzdFZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgIDxmaW5hbE5hbWU+cHJvamVjdC1kZXBsb3k8L2ZpbmFsTmFtZT4NCi0gICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPg0KLSAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3JlbGVhc2UueG1sPC9kZXNjcmlwdG9yPg0KLSAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4NCi0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2UtYXNzZW1ibHk8L2lkPiA8IS0tIHRoaXMgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UgbWVyZ2VzIC0tPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4gPCEtLSBiaW5kIHRvIHRoZSBwYWNrYWdpbmcgcGhhc2UgLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+DQotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4NCi0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgICAgPC9wbHVnaW4+DQotICAgICAgICA8L3BsdWdpbnM+DQotICAgIDwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4MC9zcmMvbWFpbi9hc3NlbWJseS9yZWxlYXNlLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4MC9zcmMvbWFpbi9hc3NlbWJseS9yZWxlYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU3M2VkNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODAvc3JjL21haW4vYXNzZW1ibHkvcmVsZWFzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjIiDQotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjIgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4yLnhzZCI+DQotICAgIDxpZD5yZWxlYXNlPC9pZD4NCi0gICAgPGZvcm1hdHM+DQotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0Pg0KLSAgICA8L2Zvcm1hdHM+DQotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQotICAgIDxkZXBlbmRlbmN5U2V0cz4NCi0gICAgICAgIDxkZXBlbmRlbmN5U2V0Pg0KLSAgICAgICAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4NCi0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PndlYmFwcHM8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPg0KLSAgICAgICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4NCi0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+DQotICAgICAgICAgICAgPGZpbGVNb2RlPjA2NDQ8L2ZpbGVNb2RlPg0KLSAgICAgICAgICAgIDxkaXJlY3RvcnlNb2RlPjA3NTA8L2RpcmVjdG9yeU1vZGU+DQotICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+DQotICAgIDwvZGVwZW5kZW5jeVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3MmM2N2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNTgzL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0geHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+Ci0KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JPGdyb3VwSWQ+bXlncm91cDwvZ3JvdXBJZD4KLQk8YXJ0aWZhY3RJZD5wcm9qZWN0MTwvYXJ0aWZhY3RJZD4KLQk8dmVyc2lvbj4wLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9zdGFydC5zaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9zdGFydC5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTNhODMzOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vc3RhcnQuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9iaW4vc3RvcC5zaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9zdG9wLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E4MzM5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2Jpbi9zdG9wLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNTgzL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvZW1wdHkucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2VtcHR5LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzYTgzMzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNTgzL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvZW1wdHkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyNDNmOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQk8Z3JvdXBJZD5teWdyb3VwPC9ncm91cElkPgotCTxhcnRpZmFjdElkPnByb2plY3QyPC9hcnRpZmFjdElkPgotCTx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0JPGRlcGVuZGVuY2llcz4KLQkJPGRlcGVuZGVuY3k+Ci0JCQk8Z3JvdXBJZD5teWdyb3VwPC9ncm91cElkPgotCQkJPGFydGlmYWN0SWQ+cHJvamVjdDE8L2FydGlmYWN0SWQ+Ci0JCQk8dmVyc2lvbj4wLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLQkJCTxzY29wZT5ydW50aW1lPC9zY29wZT4KLQkJPC9kZXBlbmRlbmN5PgotCQk8IS0tIGNvbW1lbnQtb3V0IHRoaXMgZGVwZW5kZW5jeSBpbiB0aGUgc2Vjb25kIHJ1biB0byB2ZXJpZnkgdGhlIGJlaGF2aW91ciAtLT4KLQkJPGRlcGVuZGVuY3k+Ci0JCQk8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLQkJCTxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotCQkJPHZlcnNpb24+MS4yLjE2PC92ZXJzaW9uPgotCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgotCQk8L2RlcGVuZGVuY3k+Ci0JPC9kZXBlbmRlbmNpZXM+Ci0KLQk8YnVpbGQ+Ci0JCTxwbHVnaW5zPgotCQkJPHBsdWdpbj4KLQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0JCQkJPHZlcnNpb24+JHt0ZXN0VmVyc2lvbn08L3ZlcnNpb24+Ci0JCQkJPGNvbmZpZ3VyYXRpb24+Ci0JCQkJCTxkZXNjcmlwdG9ycz4KLQkJCQkJCTxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLQkJCQkJPC9kZXNjcmlwdG9ycz4KLQkJCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCQkJPGV4ZWN1dGlvbnM+Ci0JCQkJCTxleGVjdXRpb24+Ci0JCQkJCQk8aWQ+bWFrZS1hc3NlbWJseTwvaWQ+Ci0JCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0JCQkJCQk8Z29hbHM+Ci0JCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgotCQkJCQkJPC9nb2Fscz4KLQkJCQkJPC9leGVjdXRpb24+Ci0JCQkJPC9leGVjdXRpb25zPgotCQkJPC9wbHVnaW4+Ci0JCTwvcGx1Z2lucz4KLQk8L2J1aWxkPgotCQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNTgzL2NoaWxkMi9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvY2hpbGQyL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYyNDk3NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvY2hpbGQyL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotCi0JPGlkPmRlcGxveWFibGU8L2lkPgotCi0JPGZvcm1hdHM+Ci0JCTxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0JPC9mb3JtYXRzPgotCi0JPGRlcGVuZGVuY3lTZXRzPgotCQotCi0JCTxkZXBlbmRlbmN5U2V0PgotCQkJPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0JCQk8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0JCQk8dW5wYWNrPnRydWU8L3VucGFjaz4KLQkJCTx1bnBhY2tPcHRpb25zPgotCQkJCTxpbmNsdWRlcz4KLQkJCQkJPGluY2x1ZGU+Ki5wcm9wZXJ0aWVzPC9pbmNsdWRlPgotCQkJCTwvaW5jbHVkZXM+Ci0JCQk8L3VucGFja09wdGlvbnM+Ci0JCQk8ZmlsZU1vZGU+MDQ0NDwvZmlsZU1vZGU+Ci0JCQk8ZGlyZWN0b3J5TW9kZT4wNDQ0PC9kaXJlY3RvcnlNb2RlPgotCQk8L2RlcGVuZGVuY3lTZXQ+Ci0KLQkJPGRlcGVuZGVuY3lTZXQ+Ci0JCQk8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLQkJCTxzY29wZT5ydW50aW1lPC9zY29wZT4KLQkJCTx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotCQkJPHVucGFja09wdGlvbnM+Ci0JCQkJPGluY2x1ZGVzPgotCQkJCQk8aW5jbHVkZT5iaW4vKjwvaW5jbHVkZT4KLQkJCQk8L2luY2x1ZGVzPgotCQkJPC91bnBhY2tPcHRpb25zPgotCQkJPGZpbGVNb2RlPjA3NDQ8L2ZpbGVNb2RlPgotCQkJPGRpcmVjdG9yeU1vZGU+MDc0NDwvZGlyZWN0b3J5TW9kZT4KLQkJPC9kZXBlbmRlbmN5U2V0PgotCTwvZGVwZW5kZW5jeVNldHM+Ci0KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZmZiMGE1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCQotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQkKLQk8Z3JvdXBJZD5teWdyb3VwPC9ncm91cElkPgotCTxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLQk8dmVyc2lvbj4wLjAuMTwvdmVyc2lvbj4KLQk8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0JPG1vZHVsZXM+Ci0JCTxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0JCTxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0JPC9tb2R1bGVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS01ODMvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTY2Y2NkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTU4My92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIEZpbGUgemlwRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQyL3RhcmdldC9wcm9qZWN0Mi0wLjAuMS1TTkFQU0hPVC1kZXBsb3lhYmxlLnppcCIgKTsKLSAgICAKLSAgICBpZiAoICF6aXBGaWxlLmV4aXN0cygpIHx8IHppcEZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJ6aXAtZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFppcEZpbGUgemYgPSBuZXcgWmlwRmlsZSggemlwRmlsZSApOwotICAgIAotICAgIGlmICggemYuZ2V0RW50cnkoICJwcm9qZWN0Mi0wLjAuMS1TTkFQU0hPVC9lbXB0eS5wcm9wZXJ0aWVzIiApID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiZW1wdHkucHJvcGVydGllcyBlbnRyeSBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmICggemYuZ2V0RW50cnkoICJwcm9qZWN0Mi0wLjAuMS1TTkFQU0hPVC9iaW4vc3RhcnQuc2giICkgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJzdGFydC5zaCBlbnRyeSBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzAvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGY3NjBjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLQk8Z3JvdXBJZD5mci5odXN0YS50ZXN0PC9ncm91cElkPgotCTxhcnRpZmFjdElkPmlzc3VlLW12bi1hc3NlbWJseS1wbHVnaW4tNzMwPC9hcnRpZmFjdElkPgotCTx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0JPHByb3BlcnRpZXM+Ci0JCTxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgotCTwvcHJvcGVydGllcz4KLQotCTxidWlsZD4KLQkJPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KLQotCQk8cGx1Z2lucz4KLQkJCTxwbHVnaW4+Ci0JCQkJPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQkJCQk8dmVyc2lvbj4yLjU8L3ZlcnNpb24+Ci0JCQk8L3BsdWdpbj4KLQotCQkJPHBsdWdpbj4KLQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0JCQkJPHZlcnNpb24+JHt0ZXN0VmVyc2lvbn08L3ZlcnNpb24+Ci0JCQkJPCEtLSA8dmVyc2lvbj4yLjQuMTwvdmVyc2lvbj4gLS0+Ci0JCQkJPGNvbmZpZ3VyYXRpb24+Ci0JCQkJPC9jb25maWd1cmF0aW9uPgotCQkJCTxleGVjdXRpb25zPgotCQkJCQk8ZXhlY3V0aW9uPgotCQkJCQkJPGlkPnRlc3QtcGtnPC9pZD4KLQkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLQkJCQkJCTxnb2Fscz4KLQkJCQkJCQk8Z29hbD5zaW5nbGU8L2dvYWw+Ci0JCQkJCQk8L2dvYWxzPgotCQkJCQkJPGNvbmZpZ3VyYXRpb24+Ci0JCQkJCQkJPGRlc2NyaXB0b3JSZWZzPgotCQkJCQkJCQk8ZGVzY3JpcHRvclJlZj5qYXItd2l0aC1kZXBlbmRlbmNpZXM8L2Rlc2NyaXB0b3JSZWY+Ci0JCQkJCQkJPC9kZXNjcmlwdG9yUmVmcz4KLQkJCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCQkJPC9leGVjdXRpb24+Ci0JCQkJPC9leGVjdXRpb25zPgotCQkJPC9wbHVnaW4+Ci0KLQkJCTxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICAJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQkJCQk8dmVyc2lvbj4yLjUuMTwvdmVyc2lvbj4KLQkJCTwvcGx1Z2luPgotCQkJPHBsdWdpbj4KLQkJCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0JCQkJPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotCQkJCTx2ZXJzaW9uPjIuMTg8L3ZlcnNpb24+Ci0JCQkJPGNvbmZpZ3VyYXRpb24+Ci0JCQkJCTxza2lwPnRydWU8L3NraXA+Ci0JCQkJPC9jb25maWd1cmF0aW9uPgotCQkJCTxleGVjdXRpb25zPgotCQkJCQk8ZXhlY3V0aW9uPgotCQkJCQkJPGlkPnVuaXQtdGVzdHMtYWZ0ZXItcGFja2FnaW5nPC9pZD4KLQkJCQkJCTxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLQkJCQkJCTxnb2Fscz4KLQkJCQkJCQk8Z29hbD50ZXN0PC9nb2FsPgotCQkJCQkJPC9nb2Fscz4KLQkJCQkJCTxjb25maWd1cmF0aW9uPgotCQkJCQkJCTxza2lwPmZhbHNlPC9za2lwPgotCQkJCQkJCTxpbmNsdWRlcz4KLQkJCQkJCQkJPGluY2x1ZGU+KiovKlRlc3QuamF2YTwvaW5jbHVkZT4KLQkJCQkJCQk8L2luY2x1ZGVzPgotCQkJCQkJPC9jb25maWd1cmF0aW9uPgotCQkJCQk8L2V4ZWN1dGlvbj4KLQkJCQk8L2V4ZWN1dGlvbnM+Ci0JCQk8L3BsdWdpbj4KLQotCQk8L3BsdWdpbnM+Ci0JPC9idWlsZD4KLQotCTxkZXBlbmRlbmNpZXM+Ci0KLQkJPCEtLSBQb3N0Z3JlU1FMIEpEQkMgNC4wIERyaXZlciAtLT4KLQkJPGRlcGVuZGVuY3k+Ci0JCQk8Z3JvdXBJZD5vcmcucG9zdGdyZXNxbDwvZ3JvdXBJZD4KLQkJCTxhcnRpZmFjdElkPnBvc3RncmVzcWw8L2FydGlmYWN0SWQ+Ci0JCQk8dmVyc2lvbj45LjMtMTEwMi1qZGJjNDwvdmVyc2lvbj4KLQkJPC9kZXBlbmRlbmN5PgotCi0JCTwhLS0gVGVzdHMgLS0+Ci0JCTxkZXBlbmRlbmN5PgotCQkJPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0JCQk8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLQkJCTx2ZXJzaW9uPjQuMTE8L3ZlcnNpb24+Ci0JCQk8c2NvcGU+dGVzdDwvc2NvcGU+Ci0JCTwvZGVwZW5kZW5jeT4KLQotCQk8ZGVwZW5kZW5jeT4KLQkJCTxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+Ci0JCQk8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgotCQkJPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotCQkJPHNjb3BlPnRlc3Q8L3Njb3BlPgotCQk8L2RlcGVuZGVuY3k+Ci0KLQk8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMwL3NyYy90ZXN0L2phdmEvZnIvaHVzdGEvdGVzdC9hc3NlbWJseS9KYXJXaXRoRGVwZW5kZW5jaWVzVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMwL3NyYy90ZXN0L2phdmEvZnIvaHVzdGEvdGVzdC9hc3NlbWJseS9KYXJXaXRoRGVwZW5kZW5jaWVzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmMwODBlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMC9zcmMvdGVzdC9qYXZhL2ZyL2h1c3RhL3Rlc3QvYXNzZW1ibHkvSmFyV2l0aERlcGVuZGVuY2llc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLXBhY2thZ2UgZnIuaHVzdGEudGVzdC5hc3NlbWJseTsKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIEphcldpdGhEZXBlbmRlbmNpZXNUZXN0Ci17Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGNoZWNrTWV0YUluZkNvbnRlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIC8vIGNoZWNrIE1FVEEtSU5GL3NlcnZpY2VzL2phdmEuc3FsLkRyaXZlciBleGlzdHMKLSAgICAgICAgSmFyRmlsZSBqYXIgPSBuZXcgSmFyRmlsZSgidGFyZ2V0L2lzc3VlLW12bi1hc3NlbWJseS1wbHVnaW4tNzMwLWphci13aXRoLWRlcGVuZGVuY2llcy5qYXIiKTsKLSAgICAgICAgSmFyRW50cnkgZW50cnkgPSBqYXIuZ2V0SmFyRW50cnkoIk1FVEEtSU5GL3NlcnZpY2VzL2phdmEuc3FsLkRyaXZlciIpOwotICAgICAgICBpZiAoZW50cnkgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCgidGhlIGZpbGUgJ01FVEEtSU5GL3NlcnZpY2VzL2phdmEuc3FsLkRyaXZlcicgc2hvdWxkIGV4aXN0IGluIGphci13aXRoLWRlcGVuZGVuY2llcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQ29udGVudCBzaG91bGQgYmUgIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciIKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBqYXIuZ2V0SW5wdXRTdHJlYW0oZW50cnkpOwotICAgICAgICBTdHJpbmcgY29udGVudCA9IElPVXRpbHMudG9TdHJpbmcoaXMsICJVVEYtOCIpOwotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpEQkMgRHJpdmVyIGZvdW5kIDogIiArIGNvbnRlbnQuc3Vic3RyaW5nKDAsIGNvbnRlbnQuaW5kZXhPZigiXG4iKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIm9yZy5wb3N0Z3Jlc3FsLkRyaXZlciIsIGNvbnRlbnQuc3Vic3RyaW5nKDAsIGNvbnRlbnQuaW5kZXhPZigiXG4iKSkpOwotCi0gICAgICAgIC8vIGlmIHRlc3QgZmFpbHMgYW5kIGNvbnRlbnQgPT0gInN1bi5qZGJjLm9kYmMuSmRiY09kYmNEcml2ZXIiLAotICAgICAgICAvLyBpdCBtZWFucyBpdCBjb21lcyBmcm9tIGpyZS9saWIvcmVzb3VyY2VzLmphciEvTUVUQS1JTkYvc2VydmljZXMvamF2YS5zcWwuRHJpdmVyICh3aGljaCBpcyB1bndhbnRlZCkKLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL2Fzc2VtYmx5LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjU4NjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL2Fzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotCi0JPGlkPmRlcGxveWFibGU8L2lkPgotCi0JPGZvcm1hdHM+Ci0JCTxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0JPC9mb3JtYXRzPgotCi0JPGZpbGVTZXRzPgotICAgICAgICAgICA8ZmlsZVNldD4KLQkJPGluY2x1ZGVzPjxpbmNsdWRlPnN5bWxpbmtzL3NyYy8qKjwvaW5jbHVkZT48L2luY2x1ZGVzPgotCQkgPGRpcmVjdG9yeU1vZGU+NzAwPC9kaXJlY3RvcnlNb2RlPgotICAgICAgICAgICAgICAgICA8ZmlsZU1vZGU+NjAwPC9maWxlTW9kZT4KLSAgICAgICAgICAgPC9maWxlU2V0PgotCTwvZmlsZVNldHM+Ci0KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvbm90LXZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvbm90LXZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZGEyMjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL25vdC12ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmNvbXByZXNzLmFyY2hpdmVycy56aXAuWmlwRmlsZTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuY29tcHJlc3MuYXJjaGl2ZXJzLnppcC5aaXBBcmNoaXZlRW50cnk7Ci0KLQotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIEZpbGUgemlwRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Byb2plY3QyLTAuMC4xLVNOQVBTSE9ULWRlcGxveWFibGUuemlwIiApOwotICAgIAotICAgIGlmICggIXppcEZpbGUuZXhpc3RzKCkgfHwgemlwRmlsZS5pc0RpcmVjdG9yeSgpICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggInppcC1maWxlIGlzIG1pc3Npbmcgb3IgYSBkaXJlY3RvcnkuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgWmlwRmlsZSB6ZiA9IG5ldyBaaXBGaWxlKCB6aXBGaWxlICk7Ci0KLSAgICBaaXBBcmNoaXZlRW50cnkgemUgPSB6Zi5nZXRFbnRyeSggInByb2plY3QyLTAuMC4xLVNOQVBTSE9UL3N5bWxpbmtzL3NyYy9zeW1EaXIvIiApOwotICAgIGlmICggemUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJzeW1EaXIgaXMgbWlzc2luZy4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLQotICAgIGlmICghemUuaXNVbml4U3ltbGluaygpKSB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggInN5bURpciBpcyBub3QgYSBzeW1ubGluay4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQzZjBkZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotCi0JPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCTxncm91cElkPm15Z3JvdXA8L2dyb3VwSWQ+Ci0JPGFydGlmYWN0SWQ+cHJvamVjdDI8L2FydGlmYWN0SWQ+Ci0JPHZlcnNpb24+MC4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLQk8YnVpbGQ+Ci0JCTxwbHVnaW5zPgotCQkJPHBsdWdpbj4KLQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0JCQkJPHZlcnNpb24+JHt0ZXN0VmVyc2lvbn08L3ZlcnNpb24+Ci0JCQkJPGNvbmZpZ3VyYXRpb24+Ci0JCQkJCTxkZXNjcmlwdG9ycz4KLQkJCQkJCTxkZXNjcmlwdG9yPmFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLQkJCQkJPC9kZXNjcmlwdG9ycz4KLQkJCQk8L2NvbmZpZ3VyYXRpb24+Ci0JCQkJPGV4ZWN1dGlvbnM+Ci0JCQkJCTxleGVjdXRpb24+Ci0JCQkJCQk8aWQ+bWFrZS1hc3NlbWJseTwvaWQ+Ci0JCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0JCQkJCQk8Z29hbHM+Ci0JCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPgotCQkJCQkJPC9nb2Fscz4KLQkJCQkJPC9leGVjdXRpb24+Ci0JCQkJPC9leGVjdXRpb25zPgotCQkJPC9wbHVnaW4+Ci0JCTwvcGx1Z2lucz4KLQk8L2J1aWxkPgotCQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL2Rpck9uVGhlT3V0c2lkZS9GaWxlSW5EaXJPblRoZU91dHNpZGUudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL2Rpck9uVGhlT3V0c2lkZS9GaWxlSW5EaXJPblRoZU91dHNpZGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjA2NzYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9kaXJPblRoZU91dHNpZGUvRmlsZUluRGlyT25UaGVPdXRzaWRlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotSSBhbSBvbiB0aGUgb3V0c2lkZS4uLgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL29uVGhlT3V0c2lkZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvb25UaGVPdXRzaWRlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzYzMmMyZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvb25UaGVPdXRzaWRlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotSSBhbSBvbiB0aGUgb3V0c2lkZSBvZiB0aGUgc3JjCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3MvcmVnZW4uc2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3MvcmVnZW4uc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ0ZTRkMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3JlZ2VuLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1ybSBzeW1saW5rcy56aXAKLXJtIHN5bWxpbmtzLnRhcgotY2Qgc3JjCi16aXAgLS1zeW1saW5rcyAuLi9zeW1saW5rcy56aXAgZmlsZSogdGFyZ2V0RGlyIHN5bSoKLXRhciAtY3ZmIC4uL3N5bWxpbmtzLnRhciBmaWxlKiB0YXJnZXREaXIgc3ltKgotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL2FSZWd1bGFyRGlyL2FSZWd1bGFyRmlsZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL2FSZWd1bGFyRGlyL2FSZWd1bGFyRmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllNDI5YTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9hUmVndWxhckRpci9hUmVndWxhckZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1JIGFtIGp1c3QgYW4gb3JkaW5hcnkgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9maWxlUi50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL2ZpbGVSLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0M2I0MS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL2ZpbGVSLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotVGhpcyBmaWxlIGlzIGEgc291cmNlLiByIHIgciBmaWxlbW9kZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9maWxlVy50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL2ZpbGVXLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ5MDFhZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL2ZpbGVXLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotYWxsIHcKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9zcmMvZmlsZVgudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9maWxlWC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg3MmE1Y2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9maWxlWC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXh4eApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9zeW1EaXIgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3N5bURpcgpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMjliNWQ1Yy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3N5bURpcgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRhcmdldERpci8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3N5bUxpbmtUb0Rpck9uVGhlT3V0c2lkZSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9zcmMvc3ltTGlua1RvRGlyT25UaGVPdXRzaWRlCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBlZWMyNWY1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9zcmMvc3ltTGlua1RvRGlyT25UaGVPdXRzaWRlCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vZGlyT25UaGVPdXRzaWRlLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9zcmMvc3ltTGlua1RvRmlsZU9uVGhlT3V0c2lkZSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9zcmMvc3ltTGlua1RvRmlsZU9uVGhlT3V0c2lkZQpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZmQxMjI3Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3N5bUxpbmtUb0ZpbGVPblRoZU91dHNpZGUKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi9vblRoZU91dHNpZGUudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9zeW1SIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9zeW1SCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxMTRhNTE3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9zcmMvc3ltUgorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWZpbGVSLnR4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9zcmMvc3ltVyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMS9zeW1saW5rcy9zcmMvc3ltVwpkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMTlhNjQyYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3N5bVcKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1maWxlVy50eHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3N5bVggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3N5bVgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDJkOGE3MzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy9zeW1YCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmlsZVgudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMxL3N5bWxpbmtzL3NyYy90YXJnZXREaXIvdGFyZ2V0RmlsZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3RhcmdldERpci90YXJnZXRGaWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY4YmExNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzEvc3ltbGlua3Mvc3JjL3RhcmdldERpci90YXJnZXRGaWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotVGhpcyBpcyBhIHRhcmdldCBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzIvYXNzZW1ibHkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMyL2Fzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0ODM5ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzIvYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08YXNzZW1ibHk+Ci0JPGlkPmJpbjwvaWQ+Ci0JPGZvcm1hdHM+Ci0JCTxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0JPC9mb3JtYXRzPgotCTxiYXNlRGlyZWN0b3J5PnNwcmluZy0ke3Byb2plY3QudmVyc2lvbn08L2Jhc2VEaXJlY3Rvcnk+Ci0JPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotCTxmaWxlcz4KLQkJPGZpbGU+Ci0JCTxzb3VyY2U+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS5qYXI8L3NvdXJjZT4KLQkJCTxvdXRwdXREaXJlY3Rvcnk+L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotCQkJPGRlc3ROYW1lPiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9LmphcjwvZGVzdE5hbWU+Ci0JCTwvZmlsZT4KLQk8L2ZpbGVzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjU4ZjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLQotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQk8Z3JvdXBJZD5teWdyb3VwPC9ncm91cElkPgotCTxhcnRpZmFjdElkPnByb2plY3QyPC9hcnRpZmFjdElkPgotCTx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotCi0JPGJ1aWxkPgotCQk8cGx1Z2lucz4KLQkJCTxwbHVnaW4+Ci0JCQkJPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotCQkJCTx2ZXJzaW9uPiR7dGVzdFZlcnNpb259PC92ZXJzaW9uPgotCQkJCTxjb25maWd1cmF0aW9uPgotCQkJCQk8ZGVzY3JpcHRvcnM+Ci0JCQkJCQk8ZGVzY3JpcHRvcj5hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0JCQkJCTwvZGVzY3JpcHRvcnM+Ci0JCQkJPC9jb25maWd1cmF0aW9uPgotCQkJCTxleGVjdXRpb25zPgotCQkJCQk8ZXhlY3V0aW9uPgotCQkJCQkJPGlkPm1ha2UtYXNzZW1ibHk8L2lkPgotCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotCQkJCQkJPGdvYWxzPgotCQkJCQkJCTxnb2FsPnNpbmdsZTwvZ29hbD4KLQkJCQkJCTwvZ29hbHM+Ci0JCQkJCTwvZXhlY3V0aW9uPgotCQkJCTwvZXhlY3V0aW9ucz4KLQkJCTwvcGx1Z2luPgotCQk8L3BsdWdpbnM+Ci0JPC9idWlsZD4KLQkKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMi92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMyL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyY2EzMTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMyL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLQotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIEZpbGUgemlwRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Byb2plY3QyLTAuMC4xLVNOQVBTSE9ULWJpbi56aXAiICk7Ci0gICAgCi0gICAgaWYgKCAhemlwRmlsZS5leGlzdHMoKSB8fCB6aXBGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiemlwLWZpbGUgaXMgbWlzc2luZyBvciBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIHppcEZpbGUgKTsKLQotICAgIFppcEVudHJ5IHplID0gemYuZ2V0RW50cnkoICJzcHJpbmctMC4wLjEtU05BUFNIT1QvbGliL3Byb2plY3QyLTAuMC4xLVNOQVBTSE9ULmphciIgKTsKLSAgICBpZiAoIHplID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiZmlsZW5hbWUgaXMgaW5jb3JyZWN0IiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgemYuY2xvc2UoKTsKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMzL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzMzU1Mi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD5sb2NhbGhvc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPk1BU1NFTUJMWS03MzM8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICA8cGx1Z2lucz4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPiR7dGVzdFZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPm15LWZpbmFsLW5hbWU8L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICA8L3BsdWdpbnM+Ci0gICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLQotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMzL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzMvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDViYjNkNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzMvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT48YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4xIgotICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjEueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotCi0gIDxmaWxlcz4KLSAgICA8ZmlsZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L3Jvb3Q8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzb3VyY2U+c3JjL21haW4vYXNzZW1ibHkvYmluLnhtbDwvc291cmNlPgotICAgIDwvZmlsZT4KLSAgPC9maWxlcz4KLQotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczMy92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMzL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMDE2MmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzMzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIHJlc3VsdCA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L215LWZpbmFsLW5hbWUtYmluL215LWZpbmFsLW5hbWUvcm9vdC9iaW4ueG1sIiApLmV4aXN0cygpOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzcvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczNy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTczMDYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczNy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4NCi0JPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgIDxwYXJlbnQ+DQotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPg0KLSAgICA8L3BhcmVudD4NCi0JPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTczNzwvYXJ0aWZhY3RJZD4NCi0JPHZlcnNpb24+MC4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotCTxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+DQotDQotCTxidWlsZD4NCi0JCTxkZWZhdWx0R29hbD5wYWNrYWdlPC9kZWZhdWx0R29hbD4NCi0JCTxwbHVnaW5NYW5hZ2VtZW50Pg0KLQkJCTxwbHVnaW5zPg0KLQkJCQk8cGx1Z2luPg0KLQkJCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLQkJCQkJPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLQkJCQkJPHZlcnNpb24+JHt0ZXN0VmVyc2lvbn08L3ZlcnNpb24+DQotCQkJCTwvcGx1Z2luPg0KLQkJCTwvcGx1Z2lucz4NCi0JCTwvcGx1Z2luTWFuYWdlbWVudD4NCi0JCTxwbHVnaW5zPg0KLQkJCTxwbHVnaW4+DQotCQkJCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0JCQkJPGV4ZWN1dGlvbnM+DQotCQkJCQk8ZXhlY3V0aW9uPg0KLQkJCQkJCTxpZD5hc3NlbWJsZS1kZXBsb3lhYmxlLXdhcjwvaWQ+DQotCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLQkJCQkJCTxnb2Fscz4NCi0JCQkJCQkJPGdvYWw+c2luZ2xlPC9nb2FsPg0KLQkJCQkJCTwvZ29hbHM+DQotCQkJCQkJPGNvbmZpZ3VyYXRpb24+DQotCQkJCQkJCTxkZXNjcmlwdG9ycz4NCi0JCQkJCQkJCTxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9kZXBsb3lhYmxlLnhtbDwvZGVzY3JpcHRvcj4NCi0JCQkJCQkJPC9kZXNjcmlwdG9ycz4NCi0JCQkJCQk8L2NvbmZpZ3VyYXRpb24+DQotCQkJCQk8L2V4ZWN1dGlvbj4NCi0JCQkJPC9leGVjdXRpb25zPg0KLQkJCTwvcGx1Z2luPg0KLQkJPC9wbHVnaW5zPg0KLQk8L2J1aWxkPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03Mzcvc3JjL2Fzc2VtYmx5L2RlcGxveWFibGUueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzM3L3NyYy9hc3NlbWJseS9kZXBsb3lhYmxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM2YTkyZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03Mzcvc3JjL2Fzc2VtYmx5L2RlcGxveWFibGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08YXNzZW1ibHkNCi0JeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIg0KLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMi54c2QiPg0KLQk8aWQ+ZGVwbG95YWJsZTwvaWQ+DQotCTxmb3JtYXRzPg0KLQkJPGZvcm1hdD53YXI8L2Zvcm1hdD4NCi0JPC9mb3JtYXRzPg0KLQk8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5Pg0KLQk8ZGVwZW5kZW5jeVNldHM+DQotCQk8ZGVwZW5kZW5jeVNldD4NCi0JCQk8dW5wYWNrPnRydWU8L3VucGFjaz4NCi0JCQk8dXNlUHJvamVjdEFydGlmYWN0PnRydWU8L3VzZVByb2plY3RBcnRpZmFjdD4NCi0JCTwvZGVwZW5kZW5jeVNldD4NCi0JPC9kZXBlbmRlbmN5U2V0cz4NCi08L2Fzc2VtYmx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMzNmMGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03MzkvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczOS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTViODJlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczOS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0NCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPg0KLQ0KLSAgICA8Z3JvdXBJZD5sb2NhbGhvc3Q8L2dyb3VwSWQ+DQotICAgIDxhcnRpZmFjdElkPmFzc2VtYmx5LTczOS1idWc8L2FydGlmYWN0SWQ+DQotICAgIDx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQ0KLSAgICA8cGFyZW50Pg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4NCi0gICAgICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MTwvdmVyc2lvbj4NCi0gICAgPC9wYXJlbnQ+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+aXNvODg1OS0xPC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPg0KLSAgICAgICAgPHByb2plY3QucmVwb3J0aW5nLm91dHB1dEVuY29kaW5nPmlzbzg4NTktMTwvcHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RW5jb2Rpbmc+DQotICAgIDwvcHJvcGVydGllcz4NCi0NCi0gICAgPGJ1aWxkPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICA8IS0tIEFDSFRVTkc6IDIuNSAtIDIuNS4yIGlzIGJ1Z2d5OiBwYWNrZWQgZGlyZWN0b3JpZXMgYXJlIHdyaXRlIHByb3RlY3RlZCAobW9kZSAwMDApIC0tPg0KLSAgICAgICAgICAgICAgICA8IS0tIFZlcnNpb24gMi40IHdvcmtzIGFuZCBjcmVhdGVzIGRpcmVjdG9yaWVzIHdpdGggbW9kZSA3NTUgLS0+DQotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPg0KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtYXNzZW1ibHk8L2lkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLQ0KLSAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9idWlsZD4NCi0NCi0gICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuNTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03Mzkvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzM5L3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyYjc0ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03Mzkvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pg0KLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjIiDQotICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjIgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4yLnhzZCI+DQotICAgIDxpZD5jb25hcHA8L2lkPg0KLSAgICA8Zm9ybWF0cz4NCi0gICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+DQotICAgIDwvZm9ybWF0cz4NCi0gICAgPGRlcGVuZGVuY3lTZXRzPg0KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+DQotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4NCi0gICAgPC9kZXBlbmRlbmN5U2V0cz4NCi0gICAgPGZpbGVTZXRzPg0KLSAgICAgICAgPGZpbGVTZXQ+DQotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vYmluPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3NjcmlwdHM8L2RpcmVjdG9yeT4NCi0gICAgICAgIDwvZmlsZVNldD4NCi0gICAgPC9maWxlU2V0cz4NCi08L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTczOS9zcmMvbWFpbi9zY3JpcHRzL3Rlc3QudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzM5L3NyYy9tYWluL3NjcmlwdHMvdGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YzkxMjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzM5L3NyYy9tYWluL3NjcmlwdHMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BbiBlbXB0eSB0ZXh0IGZpbGUuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzQzL2Fzc2VtYmx5LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTc0My9hc3NlbWJseS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOTNiMmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzQzL2Fzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiINCi0JCSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0JCSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjIueHNkIj4NCi0NCi0JPGlkPmRpc3Q8L2lkPg0KLQ0KLQk8IS0tIEdlbmVyYXRlcyBhIHppcCBwYWNrYWdlIGNvbnRhaW5pbmcgdGhlIG5lZWRlZCBmaWxlcyAtLT4NCi0JPGZvcm1hdHM+DQotCQk8Zm9ybWF0PmRpcjwvZm9ybWF0Pg0KLQk8L2Zvcm1hdHM+DQotDQotCTxpbmNsdWRlQmFzZURpcmVjdG9yeT4ke21pbmUuaW5jbHVkZUJhc2VEaXJlY3Rvcnl9PC9pbmNsdWRlQmFzZURpcmVjdG9yeT4NCi0NCi0JPGZpbGVzPg0KLQkJPGZpbGU+DQotCQkJPHNvdXJjZT5zdHJ1Y3R1cmUvUkVBRE1FLnR4dDwvc291cmNlPg0KLQkJCTxkZXN0TmFtZT5mb2xkZXIvUkVBRE1FLnR4dDwvZGVzdE5hbWU+DQotCQk8L2ZpbGU+DQotCTwvZmlsZXM+DQotDQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03NDMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzQzL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI4MDc5Yy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03NDMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06c2luZ2xlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03NDMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTc0My9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjFmZDc0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2J1Z3MvbWFzc2VtYmx5LTc0My9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLQk8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0JPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLQk8YXJ0aWZhY3RJZD5tYXNzZW1ibHktNzQzPC9hcnRpZmFjdElkPgotCTx2ZXJzaW9uPjEuMC4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0JPG5hbWU+TWF2ZW4gQXNzZW1ibHkgQnVnPC9uYW1lPgotCTxkZXNjcmlwdGlvbj5NYXZlbiBBc3NlbWJseSBCdWc8L2Rlc2NyaXB0aW9uPgotCi0JPGJ1aWxkPgotCQk8cGx1Z2lucz4KLQkJCTxwbHVnaW4+Ci0JCQkJPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0JCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotCQkJCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQkJCQk8dmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdmVyc2lvbj4KLQkJCQk8IS0tIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBwbHVnaW4gLS0+Ci0JCQkJPGNvbmZpZ3VyYXRpb24+Ci0JCQkJCTwhLS0gU3BlY2lmaWVzIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgb2YgdGhlIGFzc2VtYmx5IHBsdWdpbiAtLT4KLQkJCQkJPGRlc2NyaXB0b3JzPgotCQkJCQkJPGRlc2NyaXB0b3I+YXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgotCQkJCQk8L2Rlc2NyaXB0b3JzPgotCQkJCQk8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLQkJCQkJPHRhckxvbmdGaWxlTW9kZT5wb3NpeDwvdGFyTG9uZ0ZpbGVNb2RlPgotCQkJCTwvY29uZmlndXJhdGlvbj4KLQkJCTwvcGx1Z2luPgotCQk8L3BsdWdpbnM+Ci0JCTxyZXNvdXJjZXM+Ci0JCQk8cmVzb3VyY2U+Ci0JCQkJPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLQkJCQk8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+Ci0JCQk8L3Jlc291cmNlPgotCQk8L3Jlc291cmNlcz4KLQkJPHRlc3RSZXNvdXJjZXM+Ci0JCQk8dGVzdFJlc291cmNlPgotCQkJCTxkaXJlY3Rvcnk+c3JjL3Rlc3QvcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0JCQkJPGZpbHRlcmluZz5mYWxzZTwvZmlsdGVyaW5nPgotCQkJPC90ZXN0UmVzb3VyY2U+Ci0JCTwvdGVzdFJlc291cmNlcz4KLQk8L2J1aWxkPgotCi0JPHByb3BlcnRpZXM+Ci0JCTxtaW5lLmluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L21pbmUuaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0JPC9wcm9wZXJ0aWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03NDMvc3RydWN0dXJlL1JFQURNRS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03NDMvc3RydWN0dXJlL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMGMxYzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzQzL3N0cnVjdHVyZS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQkxBIEJMSQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvYnVncy9tYXNzZW1ibHktNzQzL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03NDMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjMzFmMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9idWdzL21hc3NlbWJseS03NDMvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotCi0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgRmlsZSB6aXBGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvbWFzc2VtYmx5LTc0My0xLjAuMC1TTkFQU0hPVC9tYXNzZW1ibHktNzQzLTEuMC4wLVNOQVBTSE9UL2ZvbGRlci9SRUFETUUudHh0IiApOwotICAgIAotICAgIGlmICggIXppcEZpbGUuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiaW5jb3JyZWN0IHBhdGggb2YgZmlsZS4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtZGVwZW5kZW5jeVNldC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtZGVwZW5kZW5jeVNldC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTdiNjEzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LWRlcGVuZGVuY3lTZXQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgPG5hbWU+cGFyZW50PC9uYW1lPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1kZXBlbmRlbmN5U2V0L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1kZXBlbmRlbmN5U2V0L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjBjOTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtZGVwZW5kZW5jeVNldC9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5PgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8Y29tcG9uZW50RGVzY3JpcHRvcnM+Ci0gICAgPGNvbXBvbmVudERlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvZGVwc2V0LnhtbDwvY29tcG9uZW50RGVzY3JpcHRvcj4KLSAgPC9jb21wb25lbnREZXNjcmlwdG9ycz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1kZXBlbmRlbmN5U2V0L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNldC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1kZXBlbmRlbmN5U2V0L3NyYy9tYWluL2Fzc2VtYmx5L2RlcHNldC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwZTEwMmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtZGVwZW5kZW5jeVNldC9zcmMvbWFpbi9hc3NlbWJseS9kZXBzZXQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGNvbXBvbmVudD4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtZGVwZW5kZW5jeVNldC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1kZXBlbmRlbmN5U2V0L3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1kZXBlbmRlbmN5U2V0L3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1kZXBlbmRlbmN5U2V0L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1kZXBlbmRlbmN5U2V0L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtZGVwZW5kZW5jeVNldC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1tb2R1bGVTZXQvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1tb2R1bGVTZXQvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZWFkNzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtbW9kdWxlU2V0L2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1tb2R1bGVTZXQvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LW1vZHVsZVNldC9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LW1vZHVsZVNldC9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LW1vZHVsZVNldC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LW1vZHVsZVNldC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1tb2R1bGVTZXQvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LW1vZHVsZVNldC9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LW1vZHVsZVNldC9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQyNTFiMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1tb2R1bGVTZXQvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtbW9kdWxlU2V0L2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LW1vZHVsZVNldC9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyZjUzZTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtbW9kdWxlU2V0L2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Y29tcG9uZW50RGVzY3JpcHRvcnM+Ci0gICAgPGNvbXBvbmVudERlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL21vZHNldC54bWw8L2NvbXBvbmVudERlc2NyaXB0b3I+Ci0gIDwvY29tcG9uZW50RGVzY3JpcHRvcnM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtbW9kdWxlU2V0L2NoaWxkMi9zcmMvYXNzZW1ibGUvbW9kc2V0LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbXBvbmVudHMvY29tcG9uZW50LW1vZHVsZVNldC9jaGlsZDIvc3JjL2Fzc2VtYmxlL21vZHNldC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmNzMzYWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtbW9kdWxlU2V0L2NoaWxkMi9zcmMvYXNzZW1ibGUvbW9kc2V0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxjb21wb25lbnQ+Ci0gIDxtb2R1bGVTZXRzPgotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIAotICAgICAgPHVzZUFsbFJlYWN0b3JQcm9qZWN0cz50cnVlPC91c2VBbGxSZWFjdG9yUHJvamVjdHM+Ci0gICAgICA8YmluYXJpZXM+Ci0gICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXRzPgotICAgICAgICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgICAgIDwvYmluYXJpZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvY29tcG9uZW50PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29tcG9uZW50cy9jb21wb25lbnQtbW9kdWxlU2V0L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1tb2R1bGVTZXQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZhNTk3Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb21wb25lbnRzL2NvbXBvbmVudC1tb2R1bGVTZXQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jb25maWd1cmVkLWhhbmRsZXIvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmZGVjN2YuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gdmFsaWRhdGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jb25maWd1cmVkLWhhbmRsZXIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jb25maWd1cmVkLWhhbmRsZXIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJmMTA2Mi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY29uZmlndXJlZC1oYW5kbGVyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNvbmZpZ3VyZWQtaGFuZGxlcjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgCi0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnZhbGlkYXRlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jb25maWd1cmVkLWhhbmRsZXIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4YWQ5M2UuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseT4KLSAgPGlkPmJpbjwvaWQ+Ci0gIAotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIAotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAKLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci0gIAotICA8Y29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzPgotICAgIDxjb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcj4KLSAgICAgIDxoYW5kbGVyTmFtZT5maWxlLWFnZ3JlZ2F0b3I8L2hhbmRsZXJOYW1lPgotICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxmaWxlUGF0dGVybj4uKi9maWxlLnR4dDwvZmlsZVBhdHRlcm4+Ci0gICAgICAgIDxvdXRwdXRQYXRoPmZpbGUudHh0PC9vdXRwdXRQYXRoPgotICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgIDwvY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXI+Ci0gIDwvY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jb25maWd1cmVkLWhhbmRsZXIvc3JjL2NvbmZpZy9hL2ZpbGUudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci9zcmMvY29uZmlnL2EvZmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTQxZDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci9zcmMvY29uZmlnL2EvZmlsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1maWxlIEEKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jb25maWd1cmVkLWhhbmRsZXIvc3JjL2NvbmZpZy9iL2ZpbGUudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci9zcmMvY29uZmlnL2IvZmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzk0ZTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci9zcmMvY29uZmlnL2IvZmlsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLWZpbGUgQgotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY29uZmlndXJlZC1oYW5kbGVyL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY29uZmlndXJlZC1oYW5kbGVyL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTgyZDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2NvbmZpZ3VyZWQtaGFuZGxlci92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIEZpbGUgYSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2NvbmZpZ3VyZWQtaGFuZGxlci0xLWJpbi9maWxlLnR4dCIpOwotICAgIEZpbGUgYiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2NvbmZpZ3VyZWQtaGFuZGxlci0xLWJpbi9iL2ZpbGUudHh0Iik7Ci0gICAgCi0gICAgaWYocmVzdWx0ICYmICFhLmV4aXN0cygpICkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGaWxlOiAiICsgYSArICIgc2hvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQsIGJ1dCB3YXMgbm90LiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmKHJlc3VsdCkgewotICAgICAgICBCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGEpKTsKLSAgICAgICAgU3RyaW5nIHMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBmb3VuZEEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZEIgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUoICggcyA9IHIucmVhZExpbmUoKSApICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHMuZXF1YWxzKCAiZmlsZSBBIiApICkgewotICAgICAgICAgICAgICAgIGZvdW5kQSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggcy5lcXVhbHMoICJmaWxlIEIiICkgKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRCID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCBmb3VuZEEgJiYgZm91bmRCICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoICFyZXN1bHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGaWxlOiAiICsgYSArICIgc2hvdWxkIGNvbnRhaW4gbGluZXM6XG5maWxlIEFcbmZpbGUgQlxuXG4gLi4uYnV0IGRpZG4ndC4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYocmVzdWx0ICYmIGIuZXhpc3RzKCkgKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBiICsgIiBzaG91bGQgbm90IGV4aXN0LCBidXQgZG9lcy4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9hc3NlbWJseS9hLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyL2Fzc2VtYmx5L2EucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwYWNhNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyL2Fzc2VtYmx5L2EucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi10ZXN0UHJvcD1ib28KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvYXNzZW1ibHkvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvYXNzZW1ibHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU4OTgzMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyL2Fzc2VtYmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmFzc2VtYmx5PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFuZGxlci1kZWY8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIAotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIAotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9hc3NlbWJseS9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvYXNzZW1ibHkvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiODZlMWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9hc3NlbWJseS9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgCi0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIAotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLSAgCi0gIDxjb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnM+Ci0gICAgPGNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPgotICAgICAgPGhhbmRsZXJOYW1lPmZpbGUudHh0PC9oYW5kbGVyTmFtZT4KLSAgICA8L2NvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPgotICA8L2NvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVycz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyL2Fzc2VtYmx5L3NyYy9jb25maWcvYS9maWxlLnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvYXNzZW1ibHkvc3JjL2NvbmZpZy9hL2ZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTk0MWQwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvYXNzZW1ibHkvc3JjL2NvbmZpZy9hL2ZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmlsZSBBCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyL2Fzc2VtYmx5L3NyYy9jb25maWcvYi9maWxlLnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvYXNzZW1ibHkvc3JjL2NvbmZpZy9iL2ZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTc5NGUzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvYXNzZW1ibHkvc3JjL2NvbmZpZy9iL2ZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1maWxlIEIKLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9oYW5kbGVyLWRlZi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9oYW5kbGVyLWRlZi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzY0NTM1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvaGFuZGxlci1kZWYvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmhhbmRsZXItZGVmPC9hcnRpZmFjdElkPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7dGVzdFZlcnNpb259PC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9oYW5kbGVyLWRlZi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9oYW5kbGVyLWRlZi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTI5ZTJkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvaGFuZGxlci1kZWYvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxjb21wb25lbnQtc2V0PgotICA8Y29tcG9uZW50cz4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZmlsdGVyLkNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5maWxlLnR4dDwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlci5TaW1wbGVBZ2dyZWdhdGluZ0Rlc2NyaXB0b3JIYW5kbGVyPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8ZmlsZVBhdHRlcm4+LiovZmlsZS50eHQ8L2ZpbGVQYXR0ZXJuPgotICAgICAgICA8b3V0cHV0UGF0aD5maWxlLnR4dDwvb3V0cHV0UGF0aD4KLSAgICAgICAgPGNvbW1lbnRDaGFycz4jPC9jb21tZW50Q2hhcnM+Ci0gICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgPC9jb21wb25lbnQ+Ci0gIDwvY29tcG9uZW50cz4KLTwvY29tcG9uZW50LXNldD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDJlNTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9aW5zdGFsbApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWUzYmY5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXI8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxuYW1lPmN1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcjwvbmFtZT4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWludm9rZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke2ludm9rZXJQbHVnaW5WZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgCi0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzdXBwcmVzc1N1bW1hcmllcz50cnVlPC9zdXBwcmVzc1N1bW1hcmllcz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5UGF0aD4ke2xvY2FsUmVwb3NpdG9yeVBhdGh9PC9sb2NhbFJlcG9zaXRvcnlQYXRoPgotICAgICAgICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICAgICAgPHRlc3RWZXJzaW9uPiR7dGVzdFZlcnNpb259PC90ZXN0VmVyc2lvbj4KLSAgICAgICAgICA8L3Byb3BlcnRpZXM+Ci0gICAgICAgICAgPHN0cmVhbUxvZ3M+dHJ1ZTwvc3RyZWFtTG9ncz4KLSAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICA8Z29hbD5pbnN0YWxsPC9nb2FsPgotICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+aGFuZGxlci1idWlsZDwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHBvbT5oYW5kbGVyLWRlZi9wb20ueG1sPC9wb20+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseS1idWlsZDwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlYnVnPnRydWU8L2RlYnVnPgotICAgICAgICAgICAgICA8cG9tPmFzc2VtYmx5L3BvbS54bWw8L3BvbT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgwNTgxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20tY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICBGaWxlIGEgPSBuZXcgRmlsZSggYmFzZWRpciwgImFzc2VtYmx5L3RhcmdldC9hc3NlbWJseS0xLWJpbi9maWxlLnR4dCIpOwotICAgIEZpbGUgYiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiYXNzZW1ibHkvdGFyZ2V0L2Fzc2VtYmx5LTEtYmluL2IvZmlsZS50eHQiKTsKLSAgICAKLSAgICBpZihyZXN1bHQgJiYgIWEuZXhpc3RzKCkgKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBhICsgIiBzaG91bGQgaGF2ZSBiZWVuIGdlbmVyYXRlZCwgYnV0IHdhcyBub3QuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYocmVzdWx0KSB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYSkpOwotICAgICAgICBTdHJpbmcgcyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGZvdW5kQSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kQiA9IGZhbHNlOwotICAgICAgICB3aGlsZSggKCBzID0gci5yZWFkTGluZSgpICkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcy5lcXVhbHMoICJmaWxlIEEiICkgKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRBID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBzLmVxdWFscyggImZpbGUgQiIgKSApIHsKLSAgICAgICAgICAgICAgICBmb3VuZEIgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIGZvdW5kQSAmJiBmb3VuZEIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICggIXJlc3VsdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBhICsgIiBzaG91bGQgY29udGFpbiBsaW5lczpcbmZpbGUgQVxuZmlsZSBCXG5cbiAuLi5idXQgZGlkbid0LiIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZihyZXN1bHQgJiYgYi5leGlzdHMoKSApIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRmlsZTogIiArIGIgKyAiIHNob3VsZCBub3QgZXhpc3QsIGJ1dCBkb2VzLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2Fzc2VtYmx5L2EucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvYXNzZW1ibHkvYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBhY2E1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvYXNzZW1ibHkvYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXRlc3RQcm9wPWJvbwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9hc3NlbWJseS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9hc3NlbWJseS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTZkMDJiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPGFydGlmYWN0SWQ+YXNzZW1ibHk8L2FydGlmYWN0SWQ+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW5kbGVyLWRlZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgCi0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2Fzc2VtYmx5L3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9hc3NlbWJseS9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjcwZGI0Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2Fzc2VtYmx5L3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICAKLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICAKLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgCi0gIDxmaWxlcz4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+c3JjL2NvbmZpZy9hL2ZpbGUudHh0PC9zb3VyY2U+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmE8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxkZXN0TmFtZT5maWxlLnR4dDwvZGVzdE5hbWU+Ci0gICAgPC9maWxlPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT5zcmMvY29uZmlnL2IvZmlsZS50eHQ8L3NvdXJjZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Yjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGRlc3ROYW1lPmZpbGUudHh0PC9kZXN0TmFtZT4KLSAgICA8L2ZpbGU+Ci0gIDwvZmlsZXM+Ci0gIAotICA8Y29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzPgotICAgIDxjb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcj4KLSAgICAgIDxoYW5kbGVyTmFtZT5maWxlLnR4dDwvaGFuZGxlck5hbWU+Ci0gICAgPC9jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcj4KLSAgPC9jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9hc3NlbWJseS9zcmMvY29uZmlnL2EvZmlsZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2Fzc2VtYmx5L3NyYy9jb25maWcvYS9maWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU5NDFkMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2Fzc2VtYmx5L3NyYy9jb25maWcvYS9maWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWZpbGUgQQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9hc3NlbWJseS9zcmMvY29uZmlnL2IvZmlsZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2Fzc2VtYmx5L3NyYy9jb25maWcvYi9maWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3OTRlMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2Fzc2VtYmx5L3NyYy9jb25maWcvYi9maWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotZmlsZSBCCi0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvaGFuZGxlci1kZWYvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvaGFuZGxlci1kZWYvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2NDUzNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2hhbmRsZXItZGVmL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgCi0gIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5oYW5kbGVyLWRlZjwvYXJ0aWZhY3RJZD4KLSAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvaGFuZGxlci1kZWYvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvaGFuZGxlci1kZWYvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk3MWRmNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aEZpbGVFbnRyaWVzL2hhbmRsZXItZGVmL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08Y29tcG9uZW50LXNldD4KLSAgPGNvbXBvbmVudHM+Ci0gICAgPGNvbXBvbmVudD4KLSAgICAgIDxyb2xlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlci5Db250YWluZXJEZXNjcmlwdG9ySGFuZGxlcjwvcm9sZT4KLSAgICAgIDxyb2xlLWhpbnQ+ZmlsZS50eHQ8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5maWx0ZXIuU2ltcGxlQWdncmVnYXRpbmdEZXNjcmlwdG9ySGFuZGxlcjwvaW1wbGVtZW50YXRpb24+Ci0gICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgPGZpbGVQYXR0ZXJuPi4qZmlsZS50eHQ8L2ZpbGVQYXR0ZXJuPgotICAgICAgICA8b3V0cHV0UGF0aD5maWxlLnR4dDwvb3V0cHV0UGF0aD4KLSAgICAgICAgPGNvbW1lbnRDaGFycz4jPC9jb21tZW50Q2hhcnM+Ci0gICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgPC9jb21wb25lbnQ+Ci0gIDwvY29tcG9uZW50cz4KLTwvY29tcG9uZW50LXNldD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDJlNTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9aW5zdGFsbApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhiNDU0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxuYW1lPmN1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllczwvbmFtZT4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWludm9rZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke2ludm9rZXJQbHVnaW5WZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgCi0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzdXBwcmVzc1N1bW1hcmllcz50cnVlPC9zdXBwcmVzc1N1bW1hcmllcz4KLSAgICAgICAgICA8bG9jYWxSZXBvc2l0b3J5UGF0aD4ke2xvY2FsUmVwb3NpdG9yeVBhdGh9PC9sb2NhbFJlcG9zaXRvcnlQYXRoPgotICAgICAgICAgIDxzdHJlYW1Mb2dzPnRydWU8L3N0cmVhbUxvZ3M+Ci0gICAgICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgICAgICA8dGVzdFZlcnNpb24+JHt0ZXN0VmVyc2lvbn08L3Rlc3RWZXJzaW9uPgotICAgICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICA8Z29hbD5pbnN0YWxsPC9nb2FsPgotICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+aGFuZGxlci1idWlsZDwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHBvbT5oYW5kbGVyLWRlZi9wb20ueG1sPC9wb20+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseS1idWlsZDwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlYnVnPnRydWU8L2RlYnVnPgotICAgICAgICAgICAgICA8cG9tPmFzc2VtYmx5L3BvbS54bWw8L3BvbT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhGaWxlRW50cmllcy92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgwNTgxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoRmlsZUVudHJpZXMvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICBGaWxlIGEgPSBuZXcgRmlsZSggYmFzZWRpciwgImFzc2VtYmx5L3RhcmdldC9hc3NlbWJseS0xLWJpbi9maWxlLnR4dCIpOwotICAgIEZpbGUgYiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiYXNzZW1ibHkvdGFyZ2V0L2Fzc2VtYmx5LTEtYmluL2IvZmlsZS50eHQiKTsKLSAgICAKLSAgICBpZihyZXN1bHQgJiYgIWEuZXhpc3RzKCkgKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBhICsgIiBzaG91bGQgaGF2ZSBiZWVuIGdlbmVyYXRlZCwgYnV0IHdhcyBub3QuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaWYocmVzdWx0KSB7Ci0gICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYSkpOwotICAgICAgICBTdHJpbmcgcyA9IG51bGw7Ci0gICAgICAgIAotICAgICAgICBib29sZWFuIGZvdW5kQSA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGZvdW5kQiA9IGZhbHNlOwotICAgICAgICB3aGlsZSggKCBzID0gci5yZWFkTGluZSgpICkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcy5lcXVhbHMoICJmaWxlIEEiICkgKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRBID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBzLmVxdWFscyggImZpbGUgQiIgKSApIHsKLSAgICAgICAgICAgICAgICBmb3VuZEIgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgCi0gICAgICAgICAgICBpZiAoIGZvdW5kQSAmJiBmb3VuZEIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIGlmICggIXJlc3VsdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBhICsgIiBzaG91bGQgY29udGFpbiBsaW5lczpcbmZpbGUgQVxuZmlsZSBCXG5cbiAuLi5idXQgZGlkbid0LiIgKTsKLSAgICAgICAgfQotICAgIH0KLSAgICAKLSAgICBpZihyZXN1bHQgJiYgYi5leGlzdHMoKSApIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRmlsZTogIiArIGIgKyAiIHNob3VsZCBub3QgZXhpc3QsIGJ1dCBkb2VzLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9hc3NlbWJseS9hLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9hc3NlbWJseS9hLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMGFjYTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvYXNzZW1ibHkvYS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXRlc3RQcm9wPWJvbwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvYXNzZW1ibHkvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoTWl4ZWRFbnRyaWVzL2Fzc2VtYmx5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhNmQwMmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvYXNzZW1ibHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPGFydGlmYWN0SWQ+YXNzZW1ibHk8L2FydGlmYWN0SWQ+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW5kbGVyLWRlZjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgCi0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgCi0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9hc3NlbWJseS9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoTWl4ZWRFbnRyaWVzL2Fzc2VtYmx5L3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmY5ZDlmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoTWl4ZWRFbnRyaWVzL2Fzc2VtYmx5L3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICAKLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICAKLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgCi0gIDxmaWxlcz4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+c3JjL2NvbmZpZy9hL2ZpbGUudHh0PC9zb3VyY2U+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmE8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxkZXN0TmFtZT5maWxlLnR4dDwvZGVzdE5hbWU+Ci0gICAgPC9maWxlPgotICA8L2ZpbGVzPgotICAKLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvY29uZmlnL2I8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Yjwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLSAgCi0gIDxjb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnM+Ci0gICAgPGNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPgotICAgICAgPGhhbmRsZXJOYW1lPmZpbGUudHh0PC9oYW5kbGVyTmFtZT4KLSAgICA8L2NvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPgotICA8L2NvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVycz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9hc3NlbWJseS9zcmMvY29uZmlnL2EvZmlsZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9hc3NlbWJseS9zcmMvY29uZmlnL2EvZmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1OTQxZDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvYXNzZW1ibHkvc3JjL2NvbmZpZy9hL2ZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmlsZSBBCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9hc3NlbWJseS9zcmMvY29uZmlnL2IvZmlsZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9hc3NlbWJseS9zcmMvY29uZmlnL2IvZmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzk0ZTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvYXNzZW1ibHkvc3JjL2NvbmZpZy9iL2ZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1maWxlIEIKLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvaGFuZGxlci1kZWYvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoTWl4ZWRFbnRyaWVzL2hhbmRsZXItZGVmL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjQ1MzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvaGFuZGxlci1kZWYvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmhhbmRsZXItZGVmPC9hcnRpZmFjdElkPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7dGVzdFZlcnNpb259PC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvaGFuZGxlci1kZWYvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoTWl4ZWRFbnRyaWVzL2hhbmRsZXItZGVmL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NzFkZjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvaGFuZGxlci1kZWYvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxjb21wb25lbnQtc2V0PgotICA8Y29tcG9uZW50cz4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZmlsdGVyLkNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5maWxlLnR4dDwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlci5TaW1wbGVBZ2dyZWdhdGluZ0Rlc2NyaXB0b3JIYW5kbGVyPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICA8ZmlsZVBhdHRlcm4+LipmaWxlLnR4dDwvZmlsZVBhdHRlcm4+Ci0gICAgICAgIDxvdXRwdXRQYXRoPmZpbGUudHh0PC9vdXRwdXRQYXRoPgotICAgICAgICA8Y29tbWVudENoYXJzPiM8L2NvbW1lbnRDaGFycz4KLSAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgPC9jb21wb25lbnRzPgotPC9jb21wb25lbnQtc2V0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTAyZTUwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoTWl4ZWRFbnRyaWVzL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1pbnN0YWxsCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL2N1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA1YjlhMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmN1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxuYW1lPmN1c3RvbS1oYW5kbGVyLXdpdGhNaXhlZEVudHJpZXM8L25hbWU+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnZva2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHtpbnZva2VyUGx1Z2luVmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIAotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c3VwcHJlc3NTdW1tYXJpZXM+dHJ1ZTwvc3VwcHJlc3NTdW1tYXJpZXM+Ci0gICAgICAgICAgPGxvY2FsUmVwb3NpdG9yeVBhdGg+JHtsb2NhbFJlcG9zaXRvcnlQYXRofTwvbG9jYWxSZXBvc2l0b3J5UGF0aD4KLSAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgIDx0ZXN0VmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdGVzdFZlcnNpb24+Ci0gICAgICAgICAgPC9wcm9wZXJ0aWVzPgotICAgICAgICAgIDxzdHJlYW1Mb2dzPnRydWU8L3N0cmVhbUxvZ3M+Ci0gICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgPGdvYWw+aW5zdGFsbDwvZ29hbD4KLSAgICAgICAgICA8L2dvYWxzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIAotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmhhbmRsZXItYnVpbGQ8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxwb20+aGFuZGxlci1kZWYvcG9tLnhtbDwvcG9tPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHktYnVpbGQ8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZWJ1Zz50cnVlPC9kZWJ1Zz4KLSAgICAgICAgICAgICAgPHBvbT5hc3NlbWJseS9wb20ueG1sPC9wb20+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoTWl4ZWRFbnRyaWVzL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvY3VzdG9tLWhhbmRsZXItd2l0aE1peGVkRW50cmllcy92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzgwNTgxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9jdXN0b20taGFuZGxlci13aXRoTWl4ZWRFbnRyaWVzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgRmlsZSBhID0gbmV3IEZpbGUoIGJhc2VkaXIsICJhc3NlbWJseS90YXJnZXQvYXNzZW1ibHktMS1iaW4vZmlsZS50eHQiKTsKLSAgICBGaWxlIGIgPSBuZXcgRmlsZSggYmFzZWRpciwgImFzc2VtYmx5L3RhcmdldC9hc3NlbWJseS0xLWJpbi9iL2ZpbGUudHh0Iik7Ci0gICAgCi0gICAgaWYocmVzdWx0ICYmICFhLmV4aXN0cygpICkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGaWxlOiAiICsgYSArICIgc2hvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQsIGJ1dCB3YXMgbm90LiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmKHJlc3VsdCkgewotICAgICAgICBCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGEpKTsKLSAgICAgICAgU3RyaW5nIHMgPSBudWxsOwotICAgICAgICAKLSAgICAgICAgYm9vbGVhbiBmb3VuZEEgPSBmYWxzZTsKLSAgICAgICAgYm9vbGVhbiBmb3VuZEIgPSBmYWxzZTsKLSAgICAgICAgd2hpbGUoICggcyA9IHIucmVhZExpbmUoKSApICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHMuZXF1YWxzKCAiZmlsZSBBIiApICkgewotICAgICAgICAgICAgICAgIGZvdW5kQSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggcy5lcXVhbHMoICJmaWxlIEIiICkgKSB7Ci0gICAgICAgICAgICAgICAgZm91bmRCID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCBmb3VuZEEgJiYgZm91bmRCICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoICFyZXN1bHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGaWxlOiAiICsgYSArICIgc2hvdWxkIGNvbnRhaW4gbGluZXM6XG5maWxlIEFcbmZpbGUgQlxuXG4gLi4uYnV0IGRpZG4ndC4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYocmVzdWx0ICYmIGIuZXhpc3RzKCkgKSB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBiICsgIiBzaG91bGQgbm90IGV4aXN0LCBidXQgZG9lcy4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zZXJ2aWNlcy1hZ2dyZWdhdGlvbi9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhYTBhOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zZXJ2aWNlcy1hZ2dyZWdhdGlvbi9jaGlsZDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zZXJ2aWNlcy1hZ2dyZWdhdGlvbi9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zZXJ2aWNlcy1hZ2dyZWdhdGlvbi9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvdGVzdC5UZXN0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy90ZXN0LlRlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZjA0NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy90ZXN0LlRlc3QKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10ZXN0LkZvbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL2NoaWxkMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMGY0ZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTlkNTdhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Y29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzPgotICAgIDxjb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcj4KLSAgICAgIDxoYW5kbGVyTmFtZT5tZXRhSW5mLXNlcnZpY2VzPC9oYW5kbGVyTmFtZT4KLSAgICA8L2NvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPgotICA8L2NvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVycz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+anVuaXQ6anVuaXQ8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zZXJ2aWNlcy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zZXJ2aWNlcy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvdGVzdC5UZXN0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy90ZXN0LlRlc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjc1OGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy90ZXN0LlRlc3QKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi10ZXN0LkJhcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zZXJ2aWNlcy1hZ2dyZWdhdGlvbi9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MWY4OGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNlcnZpY2VzLWFnZ3JlZ2F0aW9uL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmJkNmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc2VydmljZXMtYWdncmVnYXRpb24vdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLXRyeQotewotICBib29sZWFuIGZvb0ZvdW5kID0gZmFsc2U7Ci0gIGJvb2xlYW4gYmFyRm91bmQgPSBmYWxzZTsKLSAgCi0gIEphckZpbGUgZmlsZSA9IG5ldyBKYXJGaWxlKCBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMi90YXJnZXQvY2hpbGQyLTEuMC1TTkFQU0hPVC1iaW4uamFyIiApICk7Ci0gIEphckVudHJ5IGVudHJ5ID0gZmlsZS5nZXRFbnRyeSggIk1FVEEtSU5GL3NlcnZpY2VzL3Rlc3QuVGVzdCIgKTsKLSAgaWYgKCBlbnRyeSA9PSBudWxsICkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBJbnB1dFN0cmVhbVJlYWRlciggZmlsZS5nZXRJbnB1dFN0cmVhbSggZW50cnkgKSApICk7Ci0gIAotICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gIHdoaWxlKCAoIGxpbmUgPSBici5yZWFkTGluZSgpICkgIT0gbnVsbCApCi0gIHsKLSAgICBpZiAoIGxpbmUuZXF1YWxzKCAidGVzdC5Gb28iICkgKQotICAgIHsKLSAgICAgIGZvb0ZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGxpbmUuZXF1YWxzKCAidGVzdC5CYXIiICkgKQotICAgIHsKLSAgICAgIGJhckZvdW5kID0gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCBmb29Gb3VuZCAmJiBiYXJGb3VuZCApCi0gICAgewotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIAotICBpZiAoICFmb29Gb3VuZCApCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDYW5ub3QgZmluZCBlbnRyeSAndGVzdC5Gb28nIGluOiAiICsgZW50cnkuZ2V0TmFtZSgpICk7Ci0gIH0KLSAgCi0gIGlmICggIWJhckZvdW5kICkKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNhbm5vdCBmaW5kIGVudHJ5ICd0ZXN0LkJhcicgaW46ICIgKyBlbnRyeS5nZXROYW1lKCkgKTsKLSAgfQotICAKLSAgcmV0dXJuIGZvb0ZvdW5kICYmIGJhckZvdW5kOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci19Ci0KLXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlhYTBhOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zcHJpbmcuaGFuZGxlcnMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zcHJpbmcuaGFuZGxlcnMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OGZhOWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc3ByaW5nLmhhbmRsZXJzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaHR0cFw6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYW9wPW9yZy5zcHJpbmdmcmFtZXdvcmsuYW9wLmNvbmZpZy5Bb3BOYW1lc3BhY2VIYW5kbGVyMQ0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NwcmluZy5zY2hlbWFzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc3ByaW5nLnNjaGVtYXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkYWYwOGYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc3ByaW5nLnNjaGVtYXMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1odHRwXDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9hb3Avc3ByaW5nLWFvcC0yLjAueHNkPW9yZy9zcHJpbmdmcmFtZXdvcmsvYW9wL2NvbmZpZy9zcHJpbmctYW9wLTMuMC54c2QNCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzMGY0ZTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXR0YWNoLWJpbmFyeS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk3MzAxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVycz4KLSAgICA8Y29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXI+Ci0gICAgICA8aGFuZGxlck5hbWU+bWV0YUluZi1zcHJpbmc8L2hhbmRsZXJOYW1lPgotICAgIDwvY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXI+Ci0gIDwvY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8dW5wYWNrPnRydWU8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT5qdW5pdDpqdW5pdDwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc3ByaW5nLmhhbmRsZXJzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc3ByaW5nLmhhbmRsZXJzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2Q3OWY4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NwcmluZy5oYW5kbGVycworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWh0dHBcOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2NvbnRleHQ9b3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmNvbmZpZy5Db250ZXh0TmFtZXNwYWNlSGFuZGxlcjENCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vY2hpbGQyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zcHJpbmcuc2NoZW1hcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NwcmluZy5zY2hlbWFzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTkzYjhlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NwcmluZy5zY2hlbWFzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaHR0cFw6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYW9wL3NwcmluZy1hb3AtMi4wLnhzZD1vcmcvc3ByaW5nZnJhbWV3b3JrL2FvcC9jb25maWcvc3ByaW5nLWFvcC00LjAueHNkDQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvY29udGFpbmVyLWRlc2NyaXB0b3JzL21ldGFJbmYtc3ByaW5nLWFnZ3JlZ2F0aW9uL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1wYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFmODhiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9jb250YWluZXItZGVzY3JpcHRvcnMvbWV0YUluZi1zcHJpbmctYWdncmVnYXRpb24vdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWMxZmYxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2NvbnRhaW5lci1kZXNjcmlwdG9ycy9tZXRhSW5mLXNwcmluZy1hZ2dyZWdhdGlvbi92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTE5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLXRyeQotewotICBKYXJGaWxlIGZpbGUgPSBuZXcgSmFyRmlsZSggbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZDIvdGFyZ2V0L2NoaWxkMi0xLjAtU05BUFNIT1QtYmluLmphciIgKSApOwotICBKYXJFbnRyeSBoYW5kbGVyRW50cnkgPSBmaWxlLmdldEVudHJ5KCAiTUVUQS1JTkYvc3ByaW5nLmhhbmRsZXJzIiApOwotICBpZiAoIGhhbmRsZXJFbnRyeSA9PSBudWxsICkKLSAgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIGZpbGUuZ2V0SW5wdXRTdHJlYW0oIGhhbmRsZXJFbnRyeSApICkgKTsKLQotICBib29sZWFuIGFvcEZvdW5kID0gZmFsc2U7Ci0gIGJvb2xlYW4gY3R4Rm91bmQgPSBmYWxzZTsKLQotICBTdHJpbmcgbGluZSA9IG51bGw7Ci0gIHdoaWxlKCAoIGxpbmUgPSBici5yZWFkTGluZSgpICkgIT0gbnVsbCApCi0gIHsKLSAgICBpZiAoIGxpbmUuZW5kc1dpdGgoICJBb3BOYW1lc3BhY2VIYW5kbGVyMSIgKSApCi0gICAgewotICAgICAgYW9wRm91bmQgPSB0cnVlOwotICAgIH0KLSAgICBlbHNlIGlmICggbGluZS5lbmRzV2l0aCggIkNvbnRleHROYW1lc3BhY2VIYW5kbGVyMSIgKSApCi0gICAgewotICAgICAgY3R4Rm91bmQgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICggYW9wRm91bmQgJiYgY3R4Rm91bmQgKQotICAgIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmICggIWFvcEZvdW5kICkKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNhbm5vdCBmaW5kIGVudHJ5ICdBb3BOYW1lc3BhY2VIYW5kbGVyMScgaW46ICIgKyBoYW5kbGVyRW50cnkuZ2V0TmFtZSgpICk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYnIuY2xvc2UoKTsKLSAgCi0gIGlmICggIWN0eEZvdW5kICkKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNhbm5vdCBmaW5kIGVudHJ5ICdDb250ZXh0TmFtZXNwYWNlSGFuZGxlcjEnIGluOiAiICsgaGFuZGxlckVudHJ5LmdldE5hbWUoKSApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAKLSAgSmFyRW50cnkgc2NoZW1hRW50cnkgPSBmaWxlLmdldEVudHJ5KCAiTUVUQS1JTkYvc3ByaW5nLnNjaGVtYXMiICk7Ci0gIGlmICggc2NoZW1hRW50cnkgPT0gbnVsbCApCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBiciA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKCBmaWxlLmdldElucHV0U3RyZWFtKCBzY2hlbWFFbnRyeSApICkgKTsKLQotICBib29sZWFuIGZvdW5kMzAgPSBmYWxzZTsKLSAgYm9vbGVhbiBmb3VuZDQwID0gZmFsc2U7Ci0KLSAgU3RyaW5nIGxpbmUgPSBudWxsOwotICB3aGlsZSggKCBsaW5lID0gYnIucmVhZExpbmUoKSApICE9IG51bGwgKQotICB7Ci0gICAgaWYgKCBsaW5lLmVuZHNXaXRoKCAic3ByaW5nLWFvcC0zLjAueHNkIiApICkKLSAgICB7Ci0gICAgICBmb3VuZDMwID0gdHJ1ZTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIGxpbmUuZW5kc1dpdGgoICJzcHJpbmctYW9wLTQuMC54c2QiICkgKQotICAgIHsKLSAgICAgIGZvdW5kNDAgPSB0cnVlOwotICAgIH0KLQotICAgIGlmICggZm91bmQzMCAmJiBmb3VuZDQwICkKLSAgICB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBici5jbG9zZSgpOwotICAKLSAgaWYgKCAhZm91bmQzMCApCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDYW5ub3QgZmluZCBlbnRyeSAnc3ByaW5nLWFvcC0zLjAueHNkJyBpbjogIiArIHNjaGVtYUVudHJ5LmdldE5hbWUoKSApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICggIWZvdW5kNDAgKQotICB7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ2Fubm90IGZpbmQgZW50cnkgJ3NwcmluZy1hb3AtNC4wLnhzZCcgaW46ICIgKyBzY2hlbWFFbnRyeS5nZXROYW1lKCkgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCi0gIHJldHVybiB0cnVlOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci19Ci0KLXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtdHJhbnNmaWx0ZXItd2lsZGNhcmQtbWFzc2VtYmx5NTQ0L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtdHJhbnNmaWx0ZXItd2lsZGNhcmQtbWFzc2VtYmx5NTQ0L2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2FhNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXRyYW5zZmlsdGVyLXdpbGRjYXJkLW1hc3NlbWJseTU0NC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcC10cmFuc2ZpbHRlci13aWxkY2FyZC1tYXNzZW1ibHk1NDQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtdHJhbnNmaWx0ZXItd2lsZGNhcmQtbWFzc2VtYmx5NTQ0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODg2MjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcC10cmFuc2ZpbHRlci13aWxkY2FyZC1tYXNzZW1ibHk1NDQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPmRlcC10cmFuc2ZpbHRlci13aWxkY2FyZC1tYXNzZW1ibHk1NDQ8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPmRlcC10cmFuc2ZpbHRlci13aWxkY2FyZC1tYXNzZW1ibHk1NDQ8L25hbWU+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+d2Fnb24td2ViZGF2LWphY2tyYWJiaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYmV0YS00PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXRyYW5zZmlsdGVyLXdpbGRjYXJkLW1hc3NlbWJseTU0NC9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcC10cmFuc2ZpbHRlci13aWxkY2FyZC1tYXNzZW1ibHk1NDQvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRlNGZkMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXRyYW5zZmlsdGVyLXdpbGRjYXJkLW1hc3NlbWJseTU0NC9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIAotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAKLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5tYXZlbi1saWJzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8dXNlUHJvamVjdEFydGlmYWN0PmZhbHNlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgotICAgICAgPHVzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+dHJ1ZTwvdXNlVHJhbnNpdGl2ZUZpbHRlcmluZz4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5tYXZlbio8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXRyYW5zZmlsdGVyLXdpbGRjYXJkLW1hc3NlbWJseTU0NC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXRyYW5zZmlsdGVyLXdpbGRjYXJkLW1hc3NlbWJseTU0NC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcC10cmFuc2ZpbHRlci13aWxkY2FyZC1tYXNzZW1ibHk1NDQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtdHJhbnNmaWx0ZXItd2lsZGNhcmQtbWFzc2VtYmx5NTQ0L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXRyYW5zZmlsdGVyLXdpbGRjYXJkLW1hc3NlbWJseTU0NC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtdHJhbnNmaWx0ZXItd2lsZGNhcmQtbWFzc2VtYmx5NTQ0L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtdHJhbnNmaWx0ZXItd2lsZGNhcmQtbWFzc2VtYmx5NTQ0L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXRyYW5zZmlsdGVyLXdpbGRjYXJkLW1hc3NlbWJseTU0NC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMmYwZTUwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtdHJhbnNmaWx0ZXItd2lsZGNhcmQtbWFzc2VtYmx5NTQ0L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgZGlyID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZGVwLXRyYW5zZmlsdGVyLXdpbGRjYXJkLW1hc3NlbWJseTU0NC0xLWJpbi9tYXZlbi1saWJzIiApOwotRmlsZVtdIGZpbGVzID0gewotICBuZXcgRmlsZSggZGlyLCAid2Fnb24td2ViZGF2LWphY2tyYWJiaXQtMS4wLWJldGEtNC5qYXIiICksCi0gIG5ldyBGaWxlKCBkaXIsICJ4ZXJjZXNNaW5pbWFsLTEuOS42LjIuamFyIiApLAotICBuZXcgRmlsZSggZGlyLCAibWF2ZW4tcmVwb3J0aW5nLWFwaS0yLjAuNC5qYXIiICksCi0gIG5ldyBGaWxlKCBkaXIsICJkb3hpYS1zaW5rLWFwaS0xLjAtYWxwaGEtNy5qYXIiICkKLX07Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLWZvciggaW50IGkgPSAwOyBpPGZpbGVzLmxlbmd0aDsgaSsrICkKLXsKLSAgICBpZiAoICFmaWxlc1tpXS5leGlzdHMoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDYW5ub3QgZmluZCBqYXI6ICIgKyBmaWxlc1tpXSArICIgKHNob3VsZCBiZSBpbmNsdWRlZCB2aWEgdHJhbnNpdGl2ZSBwYXR0ZXJuKS4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtd2l0aC10cmFuc2l0aXZlLWZpbHRlci9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXdpdGgtdHJhbnNpdGl2ZS1maWx0ZXIvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtd2l0aC10cmFuc2l0aXZlLWZpbHRlci9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcC13aXRoLXRyYW5zaXRpdmUtZmlsdGVyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXdpdGgtdHJhbnNpdGl2ZS1maWx0ZXIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlkMDRlMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXdpdGgtdHJhbnNpdGl2ZS1maWx0ZXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+cHJvamVjdDwvbmFtZT4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD53YWdvbi13ZWJkYXYtamFja3JhYmJpdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1iZXRhLTQ8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5yZXBvcnRpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvcnRpbmctaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC40LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcC13aXRoLXRyYW5zaXRpdmUtZmlsdGVyL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXdpdGgtdHJhbnNpdGl2ZS1maWx0ZXIvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQzZmZkNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXdpdGgtdHJhbnNpdGl2ZS1maWx0ZXIvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICAKLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgCi0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bWF2ZW4tbGliczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KLSAgICAgIDx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb24qPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcC13aXRoLXRyYW5zaXRpdmUtZmlsdGVyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtd2l0aC10cmFuc2l0aXZlLWZpbHRlci9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcC13aXRoLXRyYW5zaXRpdmUtZmlsdGVyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXdpdGgtdHJhbnNpdGl2ZS1maWx0ZXIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtd2l0aC10cmFuc2l0aXZlLWZpbHRlci9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtd2l0aC10cmFuc2l0aXZlLWZpbHRlci9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwLXdpdGgtdHJhbnNpdGl2ZS1maWx0ZXIvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtd2l0aC10cmFuc2l0aXZlLWZpbHRlci92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBiNWY5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXAtd2l0aC10cmFuc2l0aXZlLWZpbHRlci92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1GaWxlIHdhZ29uSmFja3JhYmJpdEphciA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Byb2plY3QtMS1iaW4vbWF2ZW4tbGlicy93YWdvbi13ZWJkYXYtamFja3JhYmJpdC0xLjAtYmV0YS00LmphciIgKTsKLUZpbGUgeGVyY2VzTWluaW1hbEphciA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Byb2plY3QtMS1iaW4vbWF2ZW4tbGlicy94ZXJjZXNNaW5pbWFsLTEuOS42LjIuamFyIiApOwotCi1pZiAoICF3YWdvbkphY2tyYWJiaXRKYXIuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIldhZ29uIHByb3ZpZGVyIGphciBpcyBtaXNzaW5nIChzaG91bGQgYmUgaW5jbHVkZWQgdmlhIGluY2x1ZGUgd2lsZGNhcmQgcGF0dGVybikuIiApOwotfQotCi1pZiAoICF4ZXJjZXNNaW5pbWFsSmFyLmV4aXN0cygpICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJYZXJjZXMgbWluaW1hbCBqYXIgKGZyb20gbmVrb2h0bWwsIGJyb3VnaHQgaW4gYnkgd2Fnb24gamFja3JhYmJpdCBwcm92aWRlcikgaXMgbWlzc2luZyAoc2hvdWxkIGJlIGluY2x1ZGVkIHZpYSBpbmNsdWRlIHdpbGRjYXJkIHBhdHRlcm4pLiIgKTsKLX0KLQotcmV0dXJuIHdhZ29uSmFja3JhYmJpdEphci5leGlzdHMoKSAmJiB4ZXJjZXNNaW5pbWFsSmFyLmV4aXN0cygpOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcE1nbXQtb3ZlcnJpZGUvY2hpbGQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBNZ210LW92ZXJyaWRlL2NoaWxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0Y2U4NGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcE1nbXQtb3ZlcnJpZGUvY2hpbGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICA8L3BhcmVudD4KLSAgIAotICA8YXJ0aWZhY3RJZD5jaGlsZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8cHJvcGVydGllcz4KLSAgICA8dGVzdC52ZXJzaW9uPjIuMi4xPC90ZXN0LnZlcnNpb24+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4ke3Rlc3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8YnVpbGQ+Ci0gICAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibHkvYnVuZGxlLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwTWdtdC1vdmVycmlkZS9jaGlsZC9zcmMvYXNzZW1ibHkvYnVuZGxlLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBNZ210LW92ZXJyaWRlL2NoaWxkL3NyYy9hc3NlbWJseS9idW5kbGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YWIzOTFiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBNZ210LW92ZXJyaWRlL2NoaWxkL3NyYy9hc3NlbWJseS9idW5kbGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5PgotICA8IS0tIFRPRE86IENoYW5nZSAke3BvbS4qfSByZWZlcmVuY2VzIHRvICR7cHJvamVjdC4qfSBvbmNlIG1hdmVuLWFzc2VtYmx5LXBsdWdpbiAyLjItYmV0YS0zIGlzIGF2YWlsYWJsZSAtLT4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGlkPmJ1bmRsZTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgCi0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLm1hdmVuOm1hdmVuLXBsdWdpbi1hcGk8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwTWdtdC1vdmVycmlkZS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcE1nbXQtb3ZlcnJpZGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU5MTc4MS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwTWdtdC1vdmVycmlkZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHRlc3QudmVyc2lvbj4yLjAuNjwvdGVzdC52ZXJzaW9uPgotICA8L3Byb3BlcnRpZXM+Ci0KLSAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLjY8L3ZlcnNpb24+Ci0gICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcE1nbXQtb3ZlcnJpZGUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBNZ210LW92ZXJyaWRlL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDBhN2YuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcE1nbXQtb3ZlcnJpZGUvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotRmlsZSBmID0gbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZC90YXJnZXQvY2hpbGQtMS4wLWJ1bmRsZS9tYXZlbi1wbHVnaW4tYXBpLTIuMi4xLmphciIgKTsKLUZpbGUgZjIgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkL3RhcmdldC9jaGlsZC0xLjAtYnVuZGxlL21hdmVuLXBsdWdpbi1hcGktMi4wLjYuamFyIiApOwotCi1pZiAoICFmLmV4aXN0cygpIHx8ICFmLmlzRmlsZSgpICkKLXsKLSAgU3lzdGVtLm91dC5wcmludGxuKCBmICsgIiBkb2VzIG5vdCBleGlzdCBvciBpcyBub3QgYSBmaWxlLiIgKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pZiAoIGYyLmV4aXN0cygpICkKLXsKLSAgU3lzdGVtLm91dC5wcmludGxuKCBmMiArICIgc2hvdWxkIE5PVCBoYXZlIGJlZW4gaW5jbHVkZWQuIiApOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1hcnRpZmFjdFBvbVByb3BJbnRlcnAvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWFydGlmYWN0UG9tUHJvcEludGVycC9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU3MjU3ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWFydGlmYWN0UG9tUHJvcEludGVycC9jaGlsZDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICAKLSAgPHByb3BlcnRpZXM+Ci0gICAgPGZvbz5iYXI8L2Zvbz4KLSAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1hcnRpZmFjdFBvbVByb3BJbnRlcnAvY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWFydGlmYWN0UG9tUHJvcEludGVycC9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmx5LXJlc291cmNlcy90ZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYmY3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWFydGlmYWN0UG9tUHJvcEludGVycC9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmx5LXJlc291cmNlcy90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVByb2plY3QgVmVyc2lvbjogJHtwcm9qZWN0LnZlcnNpb259ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1hcnRpZmFjdFBvbVByb3BJbnRlcnAvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWFydGlmYWN0UG9tUHJvcEludGVycC9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ3OTllMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWFydGlmYWN0UG9tUHJvcEludGVycC9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1hcnRpZmFjdFBvbVByb3BJbnRlcnAvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1hcnRpZmFjdFBvbVByb3BJbnRlcnAvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmVmMjVmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYXJ0aWZhY3RQb21Qcm9wSW50ZXJwL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjIiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMi54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHthcnRpZmFjdC5wcm9wZXJ0aWVzLmZvb308L291dHB1dERpcmVjdG9yeT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1hcnRpZmFjdFBvbVByb3BJbnRlcnAvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYXJ0aWZhY3RQb21Qcm9wSW50ZXJwL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWQ1Y2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1hcnRpZmFjdFBvbVByb3BJbnRlcnAvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYXJ0aWZhY3RQb21Qcm9wSW50ZXJwL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWFydGlmYWN0UG9tUHJvcEludGVycC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmE2ZTgzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYXJ0aWZhY3RQb21Qcm9wSW50ZXJwL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgZiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQyL3RhcmdldC9jaGlsZDItMS1iaW4vYmFyL2NoaWxkMS0xLmphciIgKTsKLXJldHVybiBmLmV4aXN0cygpICYmIGYuaXNGaWxlKCk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWJ5RGVwVmVyc2lvbi9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYThkODlkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWJ5RGVwVmVyc2lvbi9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTc2NGY2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjI8L3ZlcnNpb24+Ci0KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWJ5RGVwVmVyc2lvbi9jaGlsZDMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYwOGFkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgICAKLSAgPGFydGlmYWN0SWQ+Y2hpbGQzPC9hcnRpZmFjdElkPgotCi0gIDxuYW1lPkRlcGVuZGVuY3lTZXQ6OkJ5LVZlcnNpb248L25hbWU+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL2NoaWxkMy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vY2hpbGQzL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2Y2ZhYzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vY2hpbGQzL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHk+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHthcnRpZmFjdC5iYXNlVmVyc2lvbn08L291dHB1dERpcmVjdG9yeT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjE3N2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDM8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtYnlEZXBWZXJzaW9uL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZmIzNzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ieURlcFZlcnNpb24vdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotdHJ5Ci17Ci0gICAgRmlsZSBkaXIgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMy90YXJnZXQvY2hpbGQzLTEtYmluIiApOwotICAgIAotICAgIEZpbGUgZiA9IG5ldyBGaWxlKCBkaXIsICIxL2NoaWxkMS0xLmphciIgKTsKLSAgICBpZiAoICFmLmV4aXN0cygpIHx8ICFmLmlzRmlsZSgpICkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDb3VsZCBub3QgZmluZCBkZXBlbmRlbmN5IGZpbGU6ICIgKyBmICk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGYgPSBuZXcgRmlsZSggZGlyLCAiMi9jaGlsZDItMi5qYXIiICk7Ci0gICAgaWYgKCAhZi5leGlzdHMoKSB8fCAhZi5pc0ZpbGUoKSApCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ291bGQgbm90IGZpbmQgZGVwZW5kZW5jeSBmaWxlOiAiICsgZiApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotfQotCi1yZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWVudW0tdnMtd2lsZGNhcmQvZW51bS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1lbnVtLXZzLXdpbGRjYXJkL2VudW0vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU4YTUyNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWVudW0tdnMtd2lsZGNhcmQvZW51bS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPmVudW08L2FydGlmYWN0SWQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5tdWxlPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bXVsZS1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS40LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgICA8Z3JvdXBJZD5vcmcubXVsZS50cmFuc3BvcnRzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tdWxlLXRyYW5zcG9ydC12bTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS40LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtZW51bS12cy13aWxkY2FyZC9lbnVtL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWVudW0tdnMtd2lsZGNhcmQvZW51bS9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2JjOTcwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtZW51bS12cy13aWxkY2FyZC9lbnVtL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHk+Ci0gICAgPGlkPmJpbjwvaWQ+Ci0gICAgPGZvcm1hdHM+Ci0gICAgICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gICAgPGRlcGVuZGVuY3lTZXRzPgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLm11bGU6bXVsZS1jb3JlPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5tdWxlLnRyYW5zcG9ydHM6bXVsZS10cmFuc3BvcnQtdm08L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gICAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWVudW0tdnMtd2lsZGNhcmQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtZW51bS12cy13aWxkY2FyZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzJkNjEyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtZW51bS12cy13aWxkY2FyZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+ZW51bTwvbW9kdWxlPgotICAgIDxtb2R1bGU+d2lsZGNhcmQ8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1lbnVtLXZzLXdpbGRjYXJkL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWVudW0tdnMtd2lsZGNhcmQvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM0ZjZjNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LWVudW0tdnMtd2lsZGNhcmQvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIEZpbGUgZjEgPSBuZXcgRmlsZSggYmFzZWRpciwgImVudW0vdGFyZ2V0L2VudW0tMS1iaW4uamFyIiApOwotICAgIEZpbGUgZjIgPSBuZXcgRmlsZSggYmFzZWRpciwgIndpbGRjYXJkL3RhcmdldC93aWxkY2FyZC0xLWJpbi5qYXIiICk7Ci0gICAgCi0gICAgSmFyRmlsZSBqZjEgPSBuZXcgSmFyRmlsZSggZjEgKTsKLSAgICBKYXJGaWxlIGpmMiA9IG5ldyBKYXJGaWxlKCBmMiApOwotICAgIAotICAgIGZvciggRW51bWVyYXRpb24gZSA9IGpmMS5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkKLSAgICB7Ci0gICAgICAgIEphckVudHJ5IGVudHJ5MSA9IChKYXJFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICBKYXJFbnRyeSBlbnRyeTIgPSAoSmFyRW50cnkpIGpmMi5nZXRFbnRyeSggZW50cnkxLmdldE5hbWUoKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKCBlbnRyeTIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIk1pc3NpbmcgZW50cnk6ICIgKyBlbnRyeTEuZ2V0TmFtZSgpICsgIiBpbiAiICsgZjIgKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIAotICAgIGZvciggRW51bWVyYXRpb24gZSA9IGpmMi5lbnRyaWVzKCk7IGUuaGFzTW9yZUVsZW1lbnRzKCk7ICkKLSAgICB7Ci0gICAgICAgIEphckVudHJ5IGVudHJ5MiA9IChKYXJFbnRyeSkgZS5uZXh0RWxlbWVudCgpOwotICAgICAgICBKYXJFbnRyeSBlbnRyeTEgPSAoSmFyRW50cnkpIGpmMi5nZXRFbnRyeSggZW50cnkyLmdldE5hbWUoKSApOwotICAgICAgICAKLSAgICAgICAgaWYgKCBlbnRyeTEgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIk1pc3NpbmcgZW50cnk6ICIgKyBlbnRyeTIuZ2V0TmFtZSgpICsgIiBpbiAiICsgZjEgKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoICFlbnRyeTEuaXNEaXJlY3RvcnkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZW50cnkyLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIk9uZSBmaWxlIGlzIGRpcmVjdG9yeSwgdGhlIG90aGVyIGEgZmlsZSEgRW50cnk6ICIgKyBlbnRyeTIuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIxID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW4gPSBqZjEuZ2V0SW5wdXRTdHJlYW0oIGVudHJ5MSApOwotICAgICAgICAgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKLSAgICAgICAgICAgICAgICBpbnQgcmVhZCA9IC0xOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoICggcmVhZCA9IGluLnJlYWQoIGJ1ZiApICkgPiAtMSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBiMS53cml0ZSggYnVmLCAwLCByZWFkICk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGIyID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotCi0gICAgICAgICAgICAgICAgaW4gPSBqZjIuZ2V0SW5wdXRTdHJlYW0oIGVudHJ5MiApOwotICAgICAgICAgICAgICAgIHJlYWQgPSAtMTsKLQotICAgICAgICAgICAgICAgIHdoaWxlKCAoIHJlYWQgPSBpbi5yZWFkKCBidWYgKSApID4gLTEgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYjIud3JpdGUoIGJ1ZiwgMCwgcmVhZCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICggIUFycmF5cy5lcXVhbHMoIGIxLnRvQnl0ZUFycmF5KCksIGIyLnRvQnl0ZUFycmF5KCkgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJFbnRyaWVzIGFyZSBub3QgZXF1YWwhIEVudHJ5IG5hbWU6ICIgKyBlbnRyeTIuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLWNhdGNoICggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtZW51bS12cy13aWxkY2FyZC93aWxkY2FyZC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1lbnVtLXZzLXdpbGRjYXJkL3dpbGRjYXJkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYjNhYzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1lbnVtLXZzLXdpbGRjYXJkL3dpbGRjYXJkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGFydGlmYWN0SWQ+d2lsZGNhcmQ8L2FydGlmYWN0SWQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5tdWxlPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bXVsZS1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS40LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgICA8Z3JvdXBJZD5vcmcubXVsZS50cmFuc3BvcnRzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tdWxlLXRyYW5zcG9ydC12bTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS40LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtZW51bS12cy13aWxkY2FyZC93aWxkY2FyZC9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1lbnVtLXZzLXdpbGRjYXJkL3dpbGRjYXJkL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlNjU5OTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1lbnVtLXZzLXdpbGRjYXJkL3dpbGRjYXJkL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHk+Ci0gICAgPGlkPmJpbjwvaWQ+Ci0gICAgPGZvcm1hdHM+Ci0gICAgICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gICAgPC9mb3JtYXRzPgotICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gICAgPGRlcGVuZGVuY3lTZXRzPgotICAgICAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLm11bGU6KjwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT5vcmcubXVsZS50cmFuc3BvcnRzOio8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gICAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXJ1bnRpbWVTY29wZS9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYThkODlkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXJ1bnRpbWVTY29wZS9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTc2NGY2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjI8L3ZlcnNpb24+Ci0KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXJ1bnRpbWVTY29wZS9jaGlsZDMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmYwOGFkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgICAKLSAgPGFydGlmYWN0SWQ+Y2hpbGQzPC9hcnRpZmFjdElkPgotCi0gIDxuYW1lPkRlcGVuZGVuY3lTZXQ6OkJ5LVZlcnNpb248L25hbWU+Ci0KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL2NoaWxkMy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvY2hpbGQzL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NmQzYWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvY2hpbGQzL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHk+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjE3N2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDM8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtcnVudGltZVNjb3BlL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NWExZDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC1ydW50aW1lU2NvcGUvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotdHJ5Ci17Ci0gICAgRmlsZSBkaXIgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMy90YXJnZXQvY2hpbGQzLTEtYmluIiApOwotICAgIAotICAgIEZpbGUgZiA9IG5ldyBGaWxlKCBkaXIsICJjaGlsZDEtMS5qYXIiICk7Ci0gICAgaWYgKCAhZi5leGlzdHMoKSB8fCAhZi5pc0ZpbGUoKSApCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ291bGQgbm90IGZpbmQgZGVwZW5kZW5jeSBmaWxlOiAiICsgZiApOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBmID0gbmV3IEZpbGUoIGRpciwgImNoaWxkMi0yLmphciIgKTsKLSAgICBpZiAoICFmLmV4aXN0cygpIHx8ICFmLmlzRmlsZSgpICkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDb3VsZCBub3QgZmluZCBkZXBlbmRlbmN5IGZpbGU6ICIgKyBmICk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci19Ci0KLXJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzRkYzA4ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL2NoaWxkMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzZjMTM1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NDllMjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPmp1bml0Omp1bml0PC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQzL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYmRlYTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL2NoaWxkMy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5jaGlsZDM8L2FydGlmYWN0SWQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQzL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3OTE2YS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQ0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmNoaWxkNDwvYXJ0aWZhY3RJZD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxwcm9maWxlcz4KLSAgICA8cHJvZmlsZT4KLSAgICAgIDxpZD50ZXN0PC9pZD4KLSAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgPG5hbWU+dGVzdC1wcm9maWxlPC9uYW1lPgotICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgCi0gICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgIDwvcHJvZmlsZT4KLSAgPC9wcm9maWxlcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDQvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDQvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTdiM2FhYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQ0L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseT4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KLSAgICAgIDx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+dGVzdDpjaGlsZDI8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvY2hpbGQ0L3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9jaGlsZDQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODFjZGU2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMzwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQ0PC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS90ZXN0LnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXRyYW5zRnJvbVByb2ZpbGUvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjgwMTA2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS90ZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotdGVzdC1wcm9maWxlPXRydWUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdHJhbnNGcm9tUHJvZmlsZS92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNzY5MzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC10cmFuc0Zyb21Qcm9maWxlL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXJldHVybiBuZXcgamF2YS5pby5GaWxlKCBiYXNlZGlyLCAiY2hpbGQ0L3RhcmdldC9jaGlsZDQtMS4wLVNOQVBTSE9ULWJpbi9jaGlsZDMtMS4wLVNOQVBTSE9ULmphciIgKS5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdW5wYWNrZWQtcmRvbmx5L2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC11bnBhY2tlZC1yZG9ubHkvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MWMzZmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC11bnBhY2tlZC1yZG9ubHkvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdW5wYWNrZWQtcmRvbmx5L2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvdGVzdC50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXVucGFja2VkLXJkb25seS9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjRhY2ZmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdW5wYWNrZWQtcmRvbmx5L2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UZXN0IGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdW5wYWNrZWQtcmRvbmx5L2NoaWxkMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC11bnBhY2tlZC1yZG9ubHkvY2hpbGQyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzYjQxZjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC11bnBhY2tlZC1yZG9ubHkvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXVucGFja2VkLXJkb25seS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXVucGFja2VkLXJkb25seS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTJhMTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC11bnBhY2tlZC1yZG9ubHkvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+dGVzdDpjaGlsZDE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi8ke2FydGlmYWN0LmFydGlmYWN0SWR9PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8ZmlsZU1vZGU+MDQ0NDwvZmlsZU1vZGU+Ci0gICAgICA8ZGlyZWN0b3J5TW9kZT4wNTU1PC9kaXJlY3RvcnlNb2RlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXVucGFja2VkLXJkb25seS9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcFNldC11bnBhY2tlZC1yZG9ubHkvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXVucGFja2VkLXJkb25seS9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdW5wYWNrZWQtcmRvbmx5L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXVucGFja2VkLXJkb25seS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzFmODhiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdW5wYWNrZWQtcmRvbmx5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdW5wYWNrZWQtcmRvbmx5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwU2V0LXVucGFja2VkLXJkb25seS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjJhNmIzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBTZXQtdW5wYWNrZWQtcmRvbmx5L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgZmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQyL3RhcmdldC9jaGlsZDItMS4wLVNOQVBTSE9ULWJpbi9jaGlsZDEvdGVzdC50eHQiICk7Ci1yZXR1cm4gZmlsZS5leGlzdHMoKSAmJiBmaWxlLmNhblJlYWQoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvUkVBRE1FLWppcmEudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9SRUFETUUtamlyYS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzc5MDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9SRUFETUUtamlyYS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NQVNTRU1CTFktMTMyCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0YWZlMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2NoaWxkMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdkZjJiMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGU8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXR0YWNoLWJpbmFyeS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkYzJkNGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbWF0Y2hTY29wZS9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFiNjk1ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW1hdGNoU2NvcGUvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyOWYyNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1tYXRjaFNjb3BlL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ3JlYXRpbmcgSmFyRmlsZSBqYXZhLmlvLkZpbGUuIiApOwotICAgIAotICAgIEZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQyL3RhcmdldC9jaGlsZDItMS4wLVNOQVBTSE9ULWJpbi5qYXIiICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ2hlY2tpbmcgZm9yIGV4aXN0ZW5jZSBhbmQgZmlsZS1pc2huZXNzIG9mOiAiICsgamFyRmlsZSApOwotICAgIAotICAgIGlmICggIWphckZpbGUuZXhpc3RzKCkgfHwgamFyRmlsZS5pc0RpcmVjdG9yeSgpICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImphciBmaWxlIGlzIG1pc3Npbmcgb3IgYSBkaXJlY3RvcnkuIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNyZWF0aW5nIEphckZpbGUgaW5zdGFuY2UuIiApOwotICAgIAotICAgIEphckZpbGUgamYgPSBuZXcgSmFyRmlsZSggamFyRmlsZSApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkxvb2tpbmcgZm9yICdsaWIvY2hpbGQxLmphcicgamFyIGVudHJ5LiIgKTsKLSAgICAKLSAgICBpZiAoIGpmLmdldEVudHJ5KCAibGliL2NoaWxkMS5qYXIiICkgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJjaGlsZDEgZW50cnkgaXMgbWlzc2luZy4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBhYnNlbmNlIG9mICdsaWIvanVuaXQuamFyJyBqYXIgZW50cnkuIiApOwotICAgIAotICAgIGlmICggamYuZ2V0RW50cnkoICJsaWIvanVuaXQuamFyIiApICE9IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAianVuaXQgamFyIHNob3VsZCBub3QgYmUgcHJlc2VudC4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9SRUFETUUtamlyYS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL1JFQURNRS1qaXJhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNzkwNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL1JFQURNRS1qaXJhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1BU1NFTUJMWS0xMzIKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDlmMDczLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmU8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDAyMWY1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmU8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmM2I3NjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPmZhbHNlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub25UcmFuc2l0aXZlL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOWFkMzYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmU8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm9uVHJhbnNpdGl2ZS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjI5ZjI0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vblRyYW5zaXRpdmUvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGphdmEuaW8uRmlsZS4iICk7Ci0gICAgCi0gICAgRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZDIvdGFyZ2V0L2NoaWxkMi0xLjAtU05BUFNIT1QtYmluLmphciIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBmb3IgZXhpc3RlbmNlIGFuZCBmaWxlLWlzaG5lc3Mgb2Y6ICIgKyBqYXJGaWxlICk7Ci0gICAgCi0gICAgaWYgKCAhamFyRmlsZS5leGlzdHMoKSB8fCBqYXJGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiamFyIGZpbGUgaXMgbWlzc2luZyBvciBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ3JlYXRpbmcgSmFyRmlsZSBpbnN0YW5jZS4iICk7Ci0gICAgCi0gICAgSmFyRmlsZSBqZiA9IG5ldyBKYXJGaWxlKCBqYXJGaWxlICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgJ2xpYi9jaGlsZDEuamFyJyBqYXIgZW50cnkuIiApOwotICAgIAotICAgIGlmICggamYuZ2V0RW50cnkoICJsaWIvY2hpbGQxLmphciIgKSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImNoaWxkMSBlbnRyeSBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkxvb2tpbmcgZm9yIGFic2VuY2Ugb2YgJ2xpYi9qdW5pdC5qYXInIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggImxpYi9qdW5pdC5qYXIiICkgIT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJqdW5pdCBqYXIgc2hvdWxkIG5vdCBiZSBwcmVzZW50LiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY0OTVlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPk1hdmVuIFF1aWNrIFN0YXJ0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm90VW5wYWNrZWQvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm90VW5wYWNrZWQvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ3NDgyMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm90VW5wYWNrZWQvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm90VW5wYWNrZWQvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDQ5ZTIwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPmp1bml0Omp1bml0PC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm90VW5wYWNrZWQvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm90VW5wYWNrZWQvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm90VW5wYWNrZWQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTY4NzcwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LW5vdFVucGFja2VkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtbm90VW5wYWNrZWQvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyOWYyNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1ub3RVbnBhY2tlZC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNyZWF0aW5nIEphckZpbGUgamF2YS5pby5GaWxlLiIgKTsKLSAgICAKLSAgICBGaWxlIGphckZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMi90YXJnZXQvY2hpbGQyLTEuMC1TTkFQU0hPVC1iaW4uamFyIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIGphckZpbGUgKTsKLSAgICAKLSAgICBpZiAoICFqYXJGaWxlLmV4aXN0cygpIHx8IGphckZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJqYXIgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBKYXJGaWxlIGpmID0gbmV3IEphckZpbGUoIGphckZpbGUgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciAnbGliL2NoaWxkMS5qYXInIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggImxpYi9jaGlsZDEuamFyIiApID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiY2hpbGQxIGVudHJ5IGlzIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgYWJzZW5jZSBvZiAnbGliL2p1bml0LmphcicgamFyIGVudHJ5LiIgKTsKLSAgICAKLSAgICBpZiAoIGpmLmdldEVudHJ5KCAibGliL2p1bml0LmphciIgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImp1bml0IGphciBzaG91bGQgbm90IGJlIHByZXNlbnQuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI0NzZjNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1wcm9qZWN0QXJ0aWZhY3ROb3RJbmNsdWRlZC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnkKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1wcm9qZWN0QXJ0aWZhY3ROb3RJbmNsdWRlZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ2ZjE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmRlcGVuZGVuY3lTZXQtcHJvamVjdEFydGlmYWN0Tm90SW5jbHVkZWQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgPG5hbWU+Rm9vIGJhcjwvbmFtZT4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibHkvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1wcm9qZWN0QXJ0aWZhY3ROb3RJbmNsdWRlZC9zcmMvYXNzZW1ibHkvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkL3NyYy9hc3NlbWJseS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTEwZmJlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkL3NyYy9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICA8dXNlUHJvamVjdEFydGlmYWN0PmZhbHNlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkL3NyYy9tYWluL2phdmEvZm9vL0Zvby5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtcHJvamVjdEFydGlmYWN0Tm90SW5jbHVkZWQvc3JjL21haW4vamF2YS9mb28vRm9vLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNzdlZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtcHJvamVjdEFydGlmYWN0Tm90SW5jbHVkZWQvc3JjL21haW4vamF2YS9mb28vRm9vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi1wYWNrYWdlIGZvbzsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLXB1YmxpYyBjbGFzcyBGb28gewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIZWxsbywgV29ybGQhIik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtcHJvamVjdEFydGlmYWN0Tm90SW5jbHVkZWQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMmRmZTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtcHJvamVjdEFydGlmYWN0Tm90SW5jbHVkZWQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IURPQ1RZUEUgd2ViLWFwcAotICAgICAgUFVCTElDICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCi0gICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIj4KLQotPHdlYi1hcHA+Ci0gICAgPGRpc3BsYXktbmFtZT5Gb28gYmFyPC9kaXNwbGF5LW5hbWU+Ci0KLSAgICA8c2VydmxldD4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5mb29iYXI8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+Zm9vLkZvbzwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5mb29iYXI8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9hcHAvKjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1wcm9qZWN0QXJ0aWZhY3ROb3RJbmNsdWRlZC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtcHJvamVjdEFydGlmYWN0Tm90SW5jbHVkZWQvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBiZTljZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC1wcm9qZWN0QXJ0aWZhY3ROb3RJbmNsdWRlZC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1pZiAoIGJhc2VkaXIgPT0gdm9pZCApCi17Ci0gIGJhc2VkaXIgPSBuZXcgRmlsZSggIi4iICk7Ci19Ci0KLUZpbGUgZGVwRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2RlcGVuZGVuY3lTZXQtcHJvamVjdEFydGlmYWN0Tm90SW5jbHVkZWQtMS4wLVNOQVBTSE9ULWJpbi9saWIvY29tbW9ucy1sb2dnaW5nLTEuMC40LmphciIgKTsKLQotRmlsZSBwcm9qZWN0QXJ0aWZhY3RGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZGVwZW5kZW5jeVNldC1wcm9qZWN0QXJ0aWZhY3ROb3RJbmNsdWRlZC0xLjAtU05BUFNIT1QtYmluL2xpYi9kZXBlbmRlbmN5U2V0LXByb2plY3RBcnRpZmFjdE5vdEluY2x1ZGVkLTEuMC1TTkFQU0hPVC53YXIiICk7Ci0KLVN5c3RlbS5vdXQucHJpbnRsbiggInJlc3VsdDogIiArICggZGVwRmlsZS5leGlzdHMoKSAmJiAhcHJvamVjdEFydGlmYWN0RmlsZS5leGlzdHMoKSApICk7Ci1yZXR1cm4gZGVwRmlsZS5leGlzdHMoKSAmJiAhcHJvamVjdEFydGlmYWN0RmlsZS5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkLWZpbHRlcmVkL2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQtZmlsdGVyZWQvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTEyODAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQtZmlsdGVyZWQvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQtZmlsdGVyZWQvY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC1maWx0ZXJlZC9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmx5LXJlc291cmNlcy90ZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZiYmY3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC1maWx0ZXJlZC9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmx5LXJlc291cmNlcy90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLVByb2plY3QgVmVyc2lvbjogJHtwcm9qZWN0LnZlcnNpb259ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQtZmlsdGVyZWQvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC1maWx0ZXJlZC9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzdkNjBkYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC1maWx0ZXJlZC9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmF0dGFjaC1iaW5hcnktYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC1maWx0ZXJlZC9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC1maWx0ZXJlZC9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4OWZkZDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQtZmlsdGVyZWQvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjIgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4yLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+dGVzdDpjaGlsZDE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgCi0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi96ejwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICAKLSAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgICAgPHVucGFja09wdGlvbnM+Ci0gICAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICAgIDwvdW5wYWNrT3B0aW9ucz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQtZmlsdGVyZWQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkLWZpbHRlcmVkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYWQ1Y2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQtZmlsdGVyZWQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkLWZpbHRlcmVkL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC1maWx0ZXJlZC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTViM2Y2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkLWZpbHRlcmVkL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLXRyeQotewotICAgIEZpbGUgZiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQyL3RhcmdldC9jaGlsZDItMS1iaW4venovYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0IiApOwotICAgIAotICAgIEJ1ZmZlcmVkUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKCBmICkgKTsKLSAgICBpZiAoIHIucmVhZExpbmUoKS5lcXVhbHMoICJQcm9qZWN0IFZlcnNpb246IDEiICkgKQotICAgIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotfQotCi1yZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjBjMzAwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeVNldC11bnBhY2tlZDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPk1hdmVuIFF1aWNrIFN0YXJ0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU5ZWU2NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+ZGVwZW5kZW5jeVNldC11bnBhY2tlZDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTNhNmIyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vJHthcnRpZmFjdC5hcnRpZmFjdElkfTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT5qdW5pdDpqdW5pdDwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1wYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZlMGQwZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmRlcGVuZGVuY3lTZXQtdW5wYWNrZWQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MjVkOWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWQvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGphdmEuaW8uRmlsZS4iICk7Ci0gICAgCi0gICAgRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZDIvdGFyZ2V0L2NoaWxkMi0xLjAtU05BUFNIT1QtYmluLmphciIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBmb3IgZXhpc3RlbmNlIGFuZCBmaWxlLWlzaG5lc3Mgb2Y6ICIgKyBqYXJGaWxlICk7Ci0gICAgCi0gICAgaWYgKCAhamFyRmlsZS5leGlzdHMoKSB8fCBqYXJGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiamFyIGZpbGUgaXMgbWlzc2luZyBvciBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ3JlYXRpbmcgSmFyRmlsZSBpbnN0YW5jZS4iICk7Ci0gICAgCi0gICAgSmFyRmlsZSBqZiA9IG5ldyBKYXJGaWxlKCBqYXJGaWxlICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgJ2NoaWxkMS8nIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggImNoaWxkMS8iICkgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJjaGlsZDEgZW50cnkgaXMgbWlzc2luZy4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBhYnNlbmNlIG9mICdqdW5pdC8nIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggImp1bml0IiApICE9IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAianVuaXQgamFyIHNob3VsZCBub3QgYmUgcHJlc2VudC4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mL2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjU3ZDc2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi9jaGlsZDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvY2hpbGQyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMjA1NDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZjwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlMTU4NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgICAgPHVucGFja09wdGlvbnM+Ci0gICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi8qKjwvZXhjbHVkZT4KLSAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgIDwvdW5wYWNrT3B0aW9ucz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+LyR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH08L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+anVuaXQ6anVuaXQ8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRFeGNsdWRpbmdNZXRhSW5mL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxNjE2ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgICA8cmVsYXRpdmVQYXRoPi4uLy4uLy4uL2l0LXByb2plY3QtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZjwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZEV4Y2x1ZGluZ01ldGFJbmYvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY0ZjcyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkRXhjbHVkaW5nTWV0YUluZi92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNyZWF0aW5nIEphckZpbGUgamF2YS5pby5GaWxlLiIgKTsKLSAgICAKLSAgICBGaWxlIGphckZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMi90YXJnZXQvY2hpbGQyLTEuMC1TTkFQU0hPVC1iaW4uamFyIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIGphckZpbGUgKTsKLSAgICAKLSAgICBpZiAoICFqYXJGaWxlLmV4aXN0cygpIHx8IGphckZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJqYXIgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBKYXJGaWxlIGpmID0gbmV3IEphckZpbGUoIGphckZpbGUgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciAnY2hpbGQxLycgamFyIGVudHJ5LiIgKTsKLSAgICAKLSAgICBpZiAoIGpmLmdldEVudHJ5KCAiY2hpbGQxLyIgKSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImNoaWxkMSBlbnRyeSBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgJ2NoaWxkMS9NRVRBLUlORicgamFyIGVudHJ5IChzaG91bGQgbm90IGV4aXN0KS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggImNoaWxkMS9NRVRBLUlORiIgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImNoaWxkMS9NRVRBLUlORiBlbnRyeSBzaG91bGQgbm90IGJlIHByZXNlbnQuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgYWJzZW5jZSBvZiAnanVuaXQvJyBqYXIgZW50cnkuIiApOwotICAgIAotICAgIGlmICggamYuZ2V0RW50cnkoICJqdW5pdCIgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImp1bml0IGphciBzaG91bGQgbm90IGJlIHByZXNlbnQuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NDQ2MjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcDIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Y2RmZWI1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAyIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWRhMTQ0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXR0YWNoLWJpbmFyeS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JiNzQ4Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT50ZXN0OmNoaWxkMTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz5mYWxzZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KLSAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vY2xhc3NlczE8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDx1bnBhY2tPcHRpb25zPgotICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgPGluY2x1ZGU+KiovQXBwLmNsYXNzPC9pbmNsdWRlPgotICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgPC91bnBhY2tPcHRpb25zPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+dGVzdDpjaGlsZDE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPHVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+ZmFsc2U8L3VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+Ci0gICAgICA8dW5wYWNrPnRydWU8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2NsYXNzZXMyPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8dW5wYWNrT3B0aW9ucz4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPioqL0FwcDIuY2xhc3M8L2luY2x1ZGU+Ci0gICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3VucGFja09wdGlvbnM+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1wYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmVjMDIzZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC11bnBhY2tlZFN1YnNldHNUd2ljZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmRlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2U8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXVucGFja2VkU3Vic2V0c1R3aWNlL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjYzQ0OTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtdW5wYWNrZWRTdWJzZXRzVHdpY2UvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGphdmEuaW8uRmlsZS4iICk7Ci0gICAgCi0gICAgRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZDIvdGFyZ2V0L2NoaWxkMi0xLjAtU05BUFNIT1QtYmluLmphciIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBmb3IgZXhpc3RlbmNlIGFuZCBmaWxlLWlzaG5lc3Mgb2Y6ICIgKyBqYXJGaWxlICk7Ci0gICAgCi0gICAgaWYgKCAhamFyRmlsZS5leGlzdHMoKSB8fCBqYXJGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiamFyIGZpbGUgaXMgbWlzc2luZyBvciBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ3JlYXRpbmcgSmFyRmlsZSBpbnN0YW5jZS4iICk7Ci0gICAgCi0gICAgSmFyRmlsZSBqZiA9IG5ldyBKYXJGaWxlKCBqYXJGaWxlICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgJ2NsYXNzZXMxL3Rlc3QvQXBwLmNsYXNzJyBqYXIgZW50cnkuIiApOwotICAgIAotICAgIGlmICggamYuZ2V0RW50cnkoICJjbGFzc2VzMS90ZXN0L0FwcC5jbGFzcyIgKSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImNsYXNzZXMxL3Rlc3QvQXBwLmNsYXNzIGVudHJ5IGlzIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgYWJzZW5jZSBvZiAnY2xhc3NlczEvdGVzdC9BcHAyLmNsYXNzJyBqYXIgZW50cnkuIiApOwotICAgIAotICAgIGlmICggamYuZ2V0RW50cnkoICJjbGFzc2VzMS90ZXN0L0FwcDIuY2xhc3MiICkgIT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJjbGFzc2VzMS90ZXN0L0FwcDIuY2xhc3Mgc2hvdWxkIG5vdCBiZSBwcmVzZW50LiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkxvb2tpbmcgZm9yICdjbGFzc2VzMi90ZXN0L0FwcDIuY2xhc3MnIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggImNsYXNzZXMyL3Rlc3QvQXBwMi5jbGFzcyIgKSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImNsYXNzZXMyL3Rlc3QvQXBwMi5jbGFzcyBlbnRyeSBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkxvb2tpbmcgZm9yIGFic2VuY2Ugb2YgJ2NsYXNzZXMyL3Rlc3QvQXBwLmNsYXNzJyBqYXIgZW50cnkuIiApOwotICAgIAotICAgIGlmICggamYuZ2V0RW50cnkoICJjbGFzc2VzMi90ZXN0L0FwcC5jbGFzcyIgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImNsYXNzZXMyL3Rlc3QvQXBwLmNsYXNzIHNob3VsZCBub3QgYmUgcHJlc2VudC4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3QvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NTIxZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9jaGlsZDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPk1hdmVuIFF1aWNrIFN0YXJ0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3QvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3QvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC13aXRoRXhlY3V0ZWRQcm9qZWN0L2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3QvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3QvY2hpbGQyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZWE4YWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmRlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmF0dGFjaC1iaW5hcnktYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC13aXRoRXhlY3V0ZWRQcm9qZWN0L2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmZGYxNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC13aXRoRXhlY3V0ZWRQcm9qZWN0L2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC13aXRoRXhlY3V0ZWRQcm9qZWN0L2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC13aXRoRXhlY3V0ZWRQcm9qZWN0L2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3QvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MDJlNTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9aW5zdGFsbApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWNmZTRjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3QvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmRlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC13aXRoRXhlY3V0ZWRQcm9qZWN0L3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjMmQ0Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvZGVwZW5kZW5jeVNldC13aXRoRXhlY3V0ZWRQcm9qZWN0L3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmphcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3Qvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2RlcGVuZGVuY3lTZXQtd2l0aEV4ZWN1dGVkUHJvamVjdC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjRhZWJhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9kZXBlbmRlbmN5U2V0LXdpdGhFeGVjdXRlZFByb2plY3QvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICByZXN1bHQgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMi90YXJnZXQvY2hpbGQyLTEuMC1TTkFQU0hPVC1iaW4vbGliL2NoaWxkMS5qYXIiICkuZXhpc3RzKCk7ICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXJ0aWZhY3QvUkVBRE1FLWppcmEudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hcnRpZmFjdC9SRUFETUUtamlyYS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzdjMGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hcnRpZmFjdC9SRUFETUUtamlyYS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NQVNTRU1CTFktMTExCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXJ0aWZhY3QvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXJ0aWZhY3QvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXJ0aWZhY3QvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXJ0aWZhY3QvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc4MDc4MC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+aW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXR0YWNoLWJpbmFyeS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXJ0aWZhY3Qvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXJ0aWZhY3Qvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTUxM2VhYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hcnRpZmFjdC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hcnRpZmFjdC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjOWZkNDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hcnRpZmFjdC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0LTEuMC1TTkFQU0hPVC1iaW4iICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ2hlY2tpbmcgZm9yIGV4aXN0ZW5jZSBhbmQgZmlsZS1pc2huZXNzIG9mOiAiICsgZGlyICk7Ci0gICAgCi0gICAgaWYgKCAhZGlyLmV4aXN0cygpIHx8ICFkaXIuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJhc3NlbWJsZWQgZGlyZWN0b3J5IGlzIG1pc3Npbmcgb3Igbm90IGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBGaWxlIHByb2plY3RBcnRpZmFjdCA9IG5ldyBGaWxlKCBkaXIsICJsaWIvaW5jbHVkZS1wcm9qZWN0LWFydGlmYWN0LTEuMC1TTkFQU0hPVC5qYXIiICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgJ2xpYi9pbmNsdWRlLXByb2plY3QtYXJ0aWZhY3QtMS4wLVNOQVBTSE9ULmphciBmaWxlIGluIGFzc2VtYmx5LiIgKTsKLSAgICAKLSAgICBpZiAoICFwcm9qZWN0QXJ0aWZhY3QuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAicHJvamVjdC1hcnRpZmFjdCBlbnRyeSBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBhYnNlbmNlIG9mICdsaWIvanVuaXQuamFyJyBqYXIgZW50cnkuIiApOwotICAgIAotICAgIGlmICggbmV3IEZpbGUoIGRpciwgImxpYi9qdW5pdC0zLjguMS5qYXIiICkuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAianVuaXQgamFyIHNob3VsZCBub3QgYmUgcHJlc2VudC4iICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvUkVBRE1FLWppcmEudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hdHRhY2htZW50cy9SRUFETUUtamlyYS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiNzdjMGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hdHRhY2htZW50cy9SRUFETUUtamlyYS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NQVNTRU1CTFktMTExCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWF0dGFjaG1lbnRzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NGU0YS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWF0dGFjaG1lbnRzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+aW5jbHVkZS1wcm9qZWN0LWF0dGFjaG1lbnRzPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+Y29tcGlsZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hdHRhY2htZW50cy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hdHRhY2htZW50cy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTYxNjYxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICA8dXNlUHJvamVjdEF0dGFjaG1lbnRzPnRydWU8L3VzZVByb2plY3RBdHRhY2htZW50cz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hdHRhY2htZW50cy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvamVjdC1hdHRhY2htZW50cy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTc0ZTg2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT50YXJnZXQ8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWF0dGFjaG1lbnRzL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWF0dGFjaG1lbnRzL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQxNzZhZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm9qZWN0LWF0dGFjaG1lbnRzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgRmlsZSBkaXIgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMtMS4wLVNOQVBTSE9ULWJpbiIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBmb3IgZXhpc3RlbmNlIGFuZCBmaWxlLWlzaG5lc3Mgb2Y6ICIgKyBkaXIgKTsKLSAgICAKLSAgICBpZiAoICFkaXIuZXhpc3RzKCkgfHwgIWRpci5pc0RpcmVjdG9yeSgpICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImFzc2VtYmxlZCBkaXJlY3RvcnkgaXMgbWlzc2luZyBvciBub3QgYSBkaXJlY3RvcnkuIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIEZpbGUgcHJvamVjdEFydGlmYWN0ID0gbmV3IEZpbGUoIGRpciwgImxpYi9pbmNsdWRlLXByb2plY3QtYXR0YWNobWVudHMtMS4wLVNOQVBTSE9ULmphciIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciAnbGliL2luY2x1ZGUtcHJvamVjdC1hdHRhY2htZW50cy0xLjAtU05BUFNIT1QuamFyIGZpbGUgaW4gYXNzZW1ibHkuIiApOwotICAgIAotICAgIGlmICggIXByb2plY3RBcnRpZmFjdC5leGlzdHMoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJwcm9qZWN0LWF0dGFjaG1lbnRzIGVudHJ5IGlzIG1pc3NpbmcuIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIEZpbGUgYXR0YWNobWVudCA9IG5ldyBGaWxlKCBkaXIsICJsaWIvaW5jbHVkZS1wcm9qZWN0LWF0dGFjaG1lbnRzLTEuMC1TTkFQU0hPVC1zcmMuemlwIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkxvb2tpbmcgZm9yICdsaWIvaW5jbHVkZS1wcm9qZWN0LWF0dGFjaG1lbnRzLTEuMC1TTkFQU0hPVC1zcmMuemlwIGZpbGUgaW4gYXNzZW1ibHkuIiApOwotICAgIAotICAgIGlmICggIWF0dGFjaG1lbnQuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAicHJvamVjdCBhdHRhY2htZW50IGVudHJ5IGlzIG1pc3NpbmcuIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkxvb2tpbmcgZm9yIGFic2VuY2Ugb2YgJ2xpYi9qdW5pdC5qYXInIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBuZXcgRmlsZSggZGlyLCAibGliL2p1bml0LTMuOC4xLmphciIgKS5leGlzdHMoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJqdW5pdCBqYXIgc2hvdWxkIG5vdCBiZSBwcmVzZW50LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvUkVBRE1FLWppcmEudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvUkVBRE1FLWppcmEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjc3YzBlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL1JFQURNRS1qaXJhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLU1BU1NFTUJMWS0xMTEKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NWNkZTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5pbmNsdWRlLXByb3ZpZGVkPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm92aWRlZC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm92aWRlZC9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzQzMzI5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5pbmNsdWRlLXByb3ZpZGVkPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjNkYmQyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMi9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm92aWRlZC9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm92aWRlZC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm92aWRlZC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm92aWRlZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFkYjNjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRlLXByb3ZpZGVkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+aW5jbHVkZS1wcm92aWRlZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm92aWRlZC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGUtcHJvdmlkZWQvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyOWYyNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkZS1wcm92aWRlZC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNyZWF0aW5nIEphckZpbGUgamF2YS5pby5GaWxlLiIgKTsKLSAgICAKLSAgICBGaWxlIGphckZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMi90YXJnZXQvY2hpbGQyLTEuMC1TTkFQU0hPVC1iaW4uamFyIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIGphckZpbGUgKTsKLSAgICAKLSAgICBpZiAoICFqYXJGaWxlLmV4aXN0cygpIHx8IGphckZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJqYXIgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBKYXJGaWxlIGpmID0gbmV3IEphckZpbGUoIGphckZpbGUgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciAnbGliL2NoaWxkMS5qYXInIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggImxpYi9jaGlsZDEuamFyIiApID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiY2hpbGQxIGVudHJ5IGlzIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgYWJzZW5jZSBvZiAnbGliL2p1bml0LmphcicgamFyIGVudHJ5LiIgKTsKLSAgICAKLSAgICBpZiAoIGpmLmdldEVudHJ5KCAibGliL2p1bml0LmphciIgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImp1bml0IGphciBzaG91bGQgbm90IGJlIHByZXNlbnQuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctcG9tLWRlcGVuZGVuY3kvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1wb20tZGVwZW5kZW5jeS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NjdhMWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1wb20tZGVwZW5kZW5jeS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnkKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctcG9tLWRlcGVuZGVuY3kvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctcG9tLWRlcGVuZGVuY3kvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdmZjBkNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXBvbS1kZXBlbmRlbmN5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5pbmNsdWRpbmctcG9tLWRlcGVuZGVuY3k8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLWNvbnRhaW5lci1kZWZhdWx0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTk8L3ZlcnNpb24+Ci0gICAgICA8dHlwZT5wb208L3R5cGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctcG9tLWRlcGVuZGVuY3kvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXBvbS1kZXBlbmRlbmN5L3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDY0NGI2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctcG9tLWRlcGVuZGVuY3kvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWIvJHthcnRpZmFjdC5hcnRpZmFjdElkfTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPio6cG9tPC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPio6cG9tPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1wb20tZGVwZW5kZW5jeS9zcmMvbWFpbi9qYXZhL2NvbS9uZi9hc3MvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXBvbS1kZXBlbmRlbmN5L3NyYy9tYWluL2phdmEvY29tL25mL2Fzcy9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1OGM1My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXBvbS1kZXBlbmRlbmN5L3NyYy9tYWluL2phdmEvY29tL25mL2Fzcy9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgY29tLm5mLmFzczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXBvbS1kZXBlbmRlbmN5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXBvbS1kZXBlbmRlbmN5L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMGUzNDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1wb20tZGVwZW5kZW5jeS92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLS8vIHZlcmlmeSB0aGF0IHRyYW5zaXRpdmUgZGVwcyBvZiB0aGUgUE9NIGRlcCB3ZXJlIGluY2x1ZGVkLgotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2luY2x1ZGluZy1wb20tZGVwZW5kZW5jeS0xLjAtU05BUFNIT1QtYmluL2xpYi9wbGV4dXMtdXRpbHMiICkuZXhpc3RzKCk7Ci1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvaW5jbHVkaW5nLXBvbS1kZXBlbmRlbmN5LTEuMC1TTkFQU0hPVC1iaW4vbGliL2NsYXNzd29ybGRzIiApLmV4aXN0cygpOwotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2luY2x1ZGluZy1wb20tZGVwZW5kZW5jeS0xLjAtU05BUFNIT1QtYmluL2xpYi9qdW5pdCIgKS5leGlzdHMoKTsKLQotLy8gdmVyaWZ5IHRoYXQgdGhlIFBPTSBkZXAgd2FzIGluY2x1ZGVkIHdpdGhvdXQgZXh0cmFjdGluZy4KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9pbmNsdWRpbmctcG9tLWRlcGVuZGVuY3ktMS4wLVNOQVBTSE9ULWJpbi9saWIvcGxleHVzLWNvbnRhaW5lci1kZWZhdWx0LnBvbSIgKS5leGlzdHMoKTsKLQotLy8gdmVyaWZ5IHRoYXQgdGhlIGphciBhc3NvY2lhdGVkIHdpdGggdGhlIFBPTSBkZXAgd2Fzbid0IGluY2x1ZGVkIGVpdGhlci4KLXJlc3VsdCA9IHJlc3VsdCAmJiAhbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvaW5jbHVkaW5nLXBvbS1kZXBlbmRlbmN5LTEuMC1TTkFQU0hPVC1iaW4vbGliL3BsZXh1cy1jb250YWluZXItZGVmYXVsdCIgKS5leGlzdHMoKTsKLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctc2FyLWRlcGVuZGVuY3kvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1zYXItZGVwZW5kZW5jeS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NjdhMWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1zYXItZGVwZW5kZW5jeS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnkKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctc2FyLWRlcGVuZGVuY3kvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctc2FyLWRlcGVuZGVuY3kvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZhZTNhYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXNhci1kZXBlbmRlbmN5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5pbmNsdWRpbmctc2FyLWRlcGVuZGVuY3k8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1hcHBzZXJ2ZXItc2VydmljZS14bWxycGM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAtYWxwaGEtMzwvdmVyc2lvbj4KLSAgICAgIDx0eXBlPnNhcjwvdHlwZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1zYXItZGVwZW5kZW5jeS9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9pbmNsdWRpbmctc2FyLWRlcGVuZGVuY3kvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzY2RhNTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1zYXItZGVwZW5kZW5jeS9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYi8ke2FydGlmYWN0LmFydGlmYWN0SWR9PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8dW5wYWNrPnRydWU8L3VucGFjaz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1zYXItZGVwZW5kZW5jeS9zcmMvbWFpbi9qYXZhL2NvbS9uZi9hc3MvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXNhci1kZXBlbmRlbmN5L3NyYy9tYWluL2phdmEvY29tL25mL2Fzcy9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1OGM1My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXNhci1kZXBlbmRlbmN5L3NyYy9tYWluL2phdmEvY29tL25mL2Fzcy9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgY29tLm5mLmFzczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXNhci1kZXBlbmRlbmN5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvaW5jbHVkaW5nLXNhci1kZXBlbmRlbmN5L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NDJiZGYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL2luY2x1ZGluZy1zYXItZGVwZW5kZW5jeS92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLS8vIHZlcmlmeSB0aGF0IHRyYW5zaXRpdmUgZGVwcyBvZiB0aGUgUE9NIGRlcCB3ZXJlIGluY2x1ZGVkLgotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2luY2x1ZGluZy1zYXItZGVwZW5kZW5jeS0xLjAtU05BUFNIT1QtYmluL2xpYi94bWxycGMiICkuZXhpc3RzKCk7Ci1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvaW5jbHVkaW5nLXNhci1kZXBlbmRlbmN5LTEuMC1TTkFQU0hPVC1iaW4vbGliL3BsZXh1cy14bWxycGMiICkuZXhpc3RzKCk7Ci0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9pbmNsdWRpbmctc2FyLWRlcGVuZGVuY3ktMS4wLVNOQVBTSE9ULWJpbi9saWIvcGxleHVzLWFwcHNlcnZlci1zZXJ2aWNlLXhtbHJwYy9saWIvY29tbW9ucy1jb2RlYy0xLjMuamFyIiApLmV4aXN0cygpOwotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMDEvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMDEvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjAxL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIwMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExNzc4My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIwMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yMDE8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLW1vZGVsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjk8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLW1vZGVsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjk8L3ZlcnNpb24+Ci0gICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1tb2RlbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC45PC92ZXJzaW9uPgotICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5zaW5nbGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIwMS9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMDEvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWU1OTdkNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIwMS9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+b3JnLmFwYWNoZS5tYXZlbjptYXZlbi1tb2RlbDpqYXI8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUubWF2ZW46bWF2ZW4tbW9kZWw6amFyOnNvdXJjZXM8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUubWF2ZW46bWF2ZW4tbW9kZWw6amFyOmphdmFkb2M8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIwMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIwMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjAxL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIwMS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGY2MzkyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjAxL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgbWFpbiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS0yMDEtMS1iaW4vbWF2ZW4tbW9kZWwtMi4wLjkuamFyIiApOwotRmlsZSBzb3VyY2VzID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvbWFzc2VtYmx5LTIwMS0xLWJpbi9tYXZlbi1tb2RlbC0yLjAuOS1zb3VyY2VzLmphciIgKTsKLUZpbGUgamF2YWRvY3MgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9tYXNzZW1ibHktMjAxLTEtYmluL21hdmVuLW1vZGVsLTIuMC45LWphdmFkb2MuamFyIiApOwotCi1pZiAoICFtYWluLmV4aXN0cygpICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJNYWluICh1bmNsYXNzaWZpZWQpIGRlcGVuZGVuY3kgamFyIGlzIG1pc3Npbmc6ICIgKyBtYWluICk7Ci19Ci0KLWlmICggIXNvdXJjZXMuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlNvdXJjZXMgZGVwZW5kZW5jeSBqYXIgaXMgbWlzc2luZzogIiArIHNvdXJjZXMgKTsKLX0KLQotaWYgKCAhamF2YWRvY3MuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkphdmFEb2NzIGRlcGVuZGVuY3kgamFyIGlzIG1pc3Npbmc6ICIgKyBqYXZhZG9jcyApOwotfQotCi1yZXR1cm4gbWFpbi5leGlzdHMoKSAmJiBzb3VyY2VzLmV4aXN0cygpICYmIGphdmFkb2NzLmV4aXN0cygpOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzIvYXNzZW1ibHkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzIvYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmIwMWQ4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjMyL2Fzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+ZGlzdDwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9ldGM8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bWFzc2VtYmx5LTIzMi0ke3ZlcnNpb259L2V0Yzwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzMi9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzMi9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzIvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjMyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGQ5YmViLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjMyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yMzI8L2FydGlmYWN0SWQ+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPjxnb2FsPnNpbmdsZTwvZ29hbD48L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzMi9zcmMvbWFpbi9ldGMvaGVsbG8udHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzIvc3JjL21haW4vZXRjL2hlbGxvLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDViOTgzYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzMi9zcmMvbWFpbi9ldGMvaGVsbG8udHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotaGkKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjMyL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzMi92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjMxMjhiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjMyL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgZmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS0yMzItMS1kaXN0L21hc3NlbWJseS0yMzItMS9ldGMvaGVsbG8udHh0IiApOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oICJUZXN0IGZpbGUgZXhpc3RzPyAiICsgZmlsZS5leGlzdHMoKSApOwotCi1yZXR1cm4gZmlsZS5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjM1L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjM1L2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzNS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzUvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjM1L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1OTY2YjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxuYW1lPlRlc3QgZm9yIEFzc2VtYmx5IEJ1ZzwvbmFtZT4KLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5MjM1LXRlc3Q8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnhtbHdyaXRlcjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnhtbHdyaXRlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIHhtbHdyaXRlciAyLjIgd2lsbCB1c2UgdW5hdmFpbGFibGUgdmVyc2lvbiAwLjM5IC0tPgotICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgIDxncm91cElkPnhtbGVuYzwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+eG1sZW5jPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4wLjUyPC92ZXJzaW9uPgotICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotICA8L2RlcGVuZGVuY3lNYW5hZ2VtZW50PgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvcmVsZWFzZS54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzUvc3JjL21haW4vYXNzZW1ibHkvcmVsZWFzZS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzNS9zcmMvbWFpbi9hc3NlbWJseS9yZWxlYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4NTFmMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzNS9zcmMvbWFpbi9hc3NlbWJseS9yZWxlYXNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnJlbGVhc2U8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0PC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzUvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzNS9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU4Yjk5MC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTIzNS9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcHVibGljIGNsYXNzIEhlbGxvV29ybGQKLXsKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzYXlIZWxsbyhTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiSGVsbG8gIiArIG5hbWUgKyAiISI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzUvc3JjL3Rlc3QvamF2YS9IZWxsb1dvcmxkVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzUvc3JjL3Rlc3QvamF2YS9IZWxsb1dvcmxkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI2NzllLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjM1L3NyYy90ZXN0L2phdmEvSGVsbG9Xb3JsZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEhlbGxvV29ybGRUZXN0IGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHZvaWQgdGVzdFNheUhlbGxvKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhIiwgSGVsbG9Xb3JsZC5zYXlIZWxsbygiV29ybGQiKSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMjM1L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MjY2NTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0yMzUvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotRmlsZSBkaXIgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9tYXNzZW1ibHkyMzUtdGVzdC0xLXJlbGVhc2UiICk7Ci0KLUZpbGUgZ29vZEphciA9IG5ldyBGaWxlKCBkaXIsICJ4bWxlbmMtMC41Mi5qYXIiICk7Ci1GaWxlIGJhZEphciA9IG5ldyBGaWxlKCBkaXIsICJ4bWxlbmMtMC4zOS5qYXIiICk7Ci0KLVN5c3RlbS5vdXQucHJpbnRsbiggIkdvb2QgdmVyc2lvbiBvZiB4bWxlbmMgZXhpc3RzPyAiICsgZ29vZEphci5leGlzdHMoKSApOwotU3lzdGVtLm91dC5wcmludGxuKCAiQmFkIHZlcnNpb24gb2YgeG1sZW5jIGRvZXNuJ3QgZXhpc3Q/ICIgKyAoIWJhZEphci5leGlzdHMoKSkgKTsKLQotcmV0dXJuIGdvb2RKYXIuZXhpc3RzKCkgJiYgIWJhZEphci5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzQ1L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzQ1L2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2FhNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM0NS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zNDUvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzQ1L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5MmM5ZjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zNDUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0zNDU8L2FydGlmYWN0SWQ+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8YXJjaGl2ZXJDb25maWc+Ci0gICAgICAgICAgICA8YXBweG1sPnNyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi54bWw8L2FwcHhtbD4KLSAgICAgICAgICA8L2FyY2hpdmVyQ29uZmlnPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz48Z29hbD5zaW5nbGU8L2dvYWw+PC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zNDUvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM0NS9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE4MjlhMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM0NS9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgCi0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZWFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIAotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluLzwvZGlyZWN0b3J5PgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLSAKLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM0NS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zNDUvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ1N2JlNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM0NS9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotVGVzdApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zNDUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzQ1L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhODIwZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zNDUvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotLy8gdmVyaWZ5IHRoYXQgdGhlIGVhciBpcyBjcmVhdGVkCi1yZXN1bHQgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9tYXNzZW1ibHktMzQ1LTEtYmluLmVhciIgKS5leGlzdHMoKTsKLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zOTUvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOTQxMjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zOTUvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+Y29tLm15Y29tcGFueS5hcHA8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15LWFwcC1tb2R1bGUxPC9hcnRpZmFjdElkPgotICA8bmFtZT5teS1hcHAtbW9kdWxlMTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxhcnRpZmFjdElkPm15LWFwcC1tb2R1bGUyPC9hcnRpZmFjdElkPgotICAgICAgPGdyb3VwSWQ+Y29tLm15Y29tcGFueS5hcHA8L2dyb3VwSWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM5NS9jaGlsZDEvc3JjL21haW4vamF2YS9jb20vbXljb21wYW55L2FwcC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L2NoaWxkMS9zcmMvbWFpbi9qYXZhL2NvbS9teWNvbXBhbnkvYXBwL0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTc5MzdkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L2NoaWxkMS9zcmMvbWFpbi9qYXZhL2NvbS9teWNvbXBhbnkvYXBwL0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotcGFja2FnZSBjb20ubXljb21wYW55LmFwcDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsJCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM5NS9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMDY2Y2M4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+Y29tLm15Y29tcGFueS5hcHA8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15LWFwcC1tb2R1bGUyPC9hcnRpZmFjdElkPgotICA8bmFtZT5teS1hcHAtbW9kdWxlMjwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zOTUvY2hpbGQyL3NyYy9tYWluL2phdmEvY29tL215Y29tcGFueS9hcHAvQXBwMi5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zOTUvY2hpbGQyL3NyYy9tYWluL2phdmEvY29tL215Y29tcGFueS9hcHAvQXBwMi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTBjNWU5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L2NoaWxkMi9zcmMvbWFpbi9qYXZhL2NvbS9teWNvbXBhbnkvYXBwL0FwcDIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLXBhY2thZ2UgY29tLm15Y29tcGFueS5hcHA7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwMiAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zOTUvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxNDJhZGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zOTUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+Y29tLm15Y29tcGFueS5hcHA8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15LWFwcDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8bmFtZT5teS1hcHA8L25hbWU+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tLm15Y29tcGFueS5hcHA8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5teS1hcHAtbW9kdWxlMjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+ICAKLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotICA8YnVpbGQ+Ci0gICAgICA8cGx1Z2lucz4KLSAgICAgICAgPHBsdWdpbj4KLQkgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0JICA8dmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLQkgICAgPGRlc2NyaXB0b3JzPgotCSAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3ppcC54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgPGlkPm1ha2UtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM5NS9zcmMvbWFpbi9hc3NlbWJseS96aXAueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS0zOTUvc3JjL21haW4vYXNzZW1ibHkvemlwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA4N2Q0NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM5NS9zcmMvbWFpbi9hc3NlbWJseS96aXAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi0NCi08YXNzZW1ibHk+DQotCTxpZD5iaW48L2lkPg0KLQk8Zm9ybWF0cz4NCi0JCTxmb3JtYXQ+emlwPC9mb3JtYXQ+DQotCTwvZm9ybWF0cz4NCi0JPG1vZHVsZVNldHM+DQotCQk8bW9kdWxlU2V0Pg0KLQkJCTxpbmNsdWRlcz4NCi0JCQkJPGluY2x1ZGU+Y29tLm15Y29tcGFueS5hcHA6bXktYXBwLW1vZHVsZTE8L2luY2x1ZGU+DQotCQkJPC9pbmNsdWRlcz4NCi0JCQk8YmluYXJpZXM+DQotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pm1vZHVsZXM8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgIDwhLS0gb3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmcgLS0+DQotDQotCQkJCTx1bnBhY2s+ZmFsc2U8L3VucGFjaz4NCi0JCQkJPGluY2x1ZGVEZXBlbmRlbmNpZXM+dHJ1ZTwvaW5jbHVkZURlcGVuZGVuY2llcz4NCi0JCQk8L2JpbmFyaWVzPg0KLQkJPC9tb2R1bGVTZXQ+DQotCTwvbW9kdWxlU2V0cz4NCi08L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTM5NS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQ1M2JmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktMzk1L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotCi1GaWxlIGYgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9teS1hcHAtMS4wLVNOQVBTSE9ULWJpbi56aXAiICk7Ci1aaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIGYgKTsKLQotWmlwRW50cnkgY2hpbGQxSW5jbEVudHJ5ID0gemYuZ2V0RW50cnkoICJteS1hcHAtMS4wLVNOQVBTSE9UL21vZHVsZXMvanVuaXQtMy44LjEuamFyIiApOwotCi1pZiAoIGNoaWxkMUluY2xFbnRyeSA9PSBudWxsICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJFeHBlY3RlZCBqdW5pdC5qYXIhIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS02MTkvYXNzZW1ibHkueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS02MTkvYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2FiYjlmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktNjE5L2Fzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08YXNzZW1ibHkNCi0JeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIg0KLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPg0KLQ0KLQk8aWQ+ZGVwbG95LXppcDwvaWQ+DQotCTxmb3JtYXRzPg0KLQkJPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0JPC9mb3JtYXRzPg0KLQ0KLQk8ZGVwZW5kZW5jeVNldHM+DQotCQk8ZGVwZW5kZW5jeVNldD4NCi0JCQk8b3V0cHV0RGlyZWN0b3J5PmRpcjE8L291dHB1dERpcmVjdG9yeT4NCi0JCQk8aW5jbHVkZXM+DQotCQkJCTxpbmNsdWRlPmNvbW1vbnMtY29uZmlndXJhdGlvbjpjb21tb25zLWNvbmZpZ3VyYXRpb248L2luY2x1ZGU+DQotCQkJPC9pbmNsdWRlcz4NCi0JCTwvZGVwZW5kZW5jeVNldD4NCi0JCTxkZXBlbmRlbmN5U2V0Pg0KLQkJCTxvdXRwdXREaXJlY3Rvcnk+ZGlyMjwvb3V0cHV0RGlyZWN0b3J5Pg0KLQkJCTx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPmZhbHNlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPg0KLQkJCTxleGNsdWRlcz4NCi0JCQkJPGV4Y2x1ZGU+Y29tbW9ucy1jb25maWd1cmF0aW9uOmNvbW1vbnMtY29uZmlndXJhdGlvbjwvZXhjbHVkZT4NCi0JCQk8L2V4Y2x1ZGVzPg0KLQkJPC9kZXBlbmRlbmN5U2V0Pg0KLQk8L2RlcGVuZGVuY3lTZXRzPg0KLQ0KLTwvYXNzZW1ibHk+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS02MTkvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS02MTkvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTAyZTUwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktNjE5L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1pbnN0YWxsCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTYxOS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS02MTkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlNTEwYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTYxOS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4NCi0JPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLQ0KLQk8bmFtZT5idWctdGVzdDwvbmFtZT4NCi0JPGdyb3VwSWQ+Y29tLmV4YW1wbGUuYXNzZW1ibHk8L2dyb3VwSWQ+DQotCTxhcnRpZmFjdElkPmJ1Zy10ZXN0PC9hcnRpZmFjdElkPg0KLQk8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+DQotCQ0KLQk8ZGVwZW5kZW5jaWVzPg0KLQkJPGRlcGVuZGVuY3k+DQotCQkJPGdyb3VwSWQ+Y29tbW9ucy1jb25maWd1cmF0aW9uPC9ncm91cElkPg0KLQkJCTxhcnRpZmFjdElkPmNvbW1vbnMtY29uZmlndXJhdGlvbjwvYXJ0aWZhY3RJZD4NCi0JCQk8dmVyc2lvbj4xLjEwPC92ZXJzaW9uPg0KLQkJPC9kZXBlbmRlbmN5Pg0KLQkJPGRlcGVuZGVuY3k+DQotCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4NCi0JCQk8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoaXZlcjwvYXJ0aWZhY3RJZD4NCi0JCQk8dmVyc2lvbj4yLjY8L3ZlcnNpb24+DQotCQk8L2RlcGVuZGVuY3k+DQotCTwvZGVwZW5kZW5jaWVzPg0KLQkNCi0JPGJ1aWxkPg0KLQkJPHBsdWdpbnM+DQotCQkJPHBsdWdpbj4NCi0JCQkJPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLQkJCQk8dmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdmVyc2lvbj4NCi0JCQkJPGV4ZWN1dGlvbnM+DQotCQkJCQk8ZXhlY3V0aW9uPg0KLQkJCQkJCTxpZD5tYWtlLWFzc2VtYmx5PC9pZD4NCi0JCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotCQkJCQkJPGdvYWxzPg0KLQkJCQkJCQk8Z29hbD5zaW5nbGU8L2dvYWw+DQotCQkJCQkJPC9nb2Fscz4NCi0JCQkJCQk8Y29uZmlndXJhdGlvbj4NCi0JCQkJCQkJPGRlc2NyaXB0b3JzPg0KLQkJCQkJCQkJPGRlc2NyaXB0b3I+YXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPg0KLQkJCQkJCQk8L2Rlc2NyaXB0b3JzPg0KLQkJCQkJCTwvY29uZmlndXJhdGlvbj4NCi0JCQkJCTwvZXhlY3V0aW9uPg0KLQkJCQk8L2V4ZWN1dGlvbnM+DQotCQkJPC9wbHVnaW4+DQotCQk8L3BsdWdpbnM+DQotCTwvYnVpbGQ+DQotDQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktNjE5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTYxOS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTk2ZjRmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktNjE5L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1aaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2J1Zy10ZXN0LTEuMC1TTkFQU0hPVC1kZXBsb3ktemlwLnppcCIgKSApOwotCi1aaXBFbnRyeSBjaGlsZDFJbmNsRW50cnkgPSB6Zi5nZXRFbnRyeSggImJ1Zy10ZXN0LTEuMC1TTkFQU0hPVC9kaXIyL2NsYXNzd29ybGRzLTEuMS5qYXIiICk7Ci0KLWlmICggY2hpbGQxSW5jbEVudHJ5ICE9IG51bGwgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlVuZXhwZWN0ZWQgZmlsZSBpbiBqYXIgISIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXJldHVybiB0cnVlOwotCi0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmJmZmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tYXNzZW1ibHktcGx1Z2luOiR7dGVzdFZlcnNpb259OmRpcmVjdG9yeS1pbmxpbmUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM0YmMxZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTk5L21vZHVsZS1hL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm1hc3NlbWJseS05OTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+bW9kdWxlLWE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPkFzc2VtYmx5IFNwaWtlIE1vZHVsZSBBPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+amRvbTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmpkb208L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWEvc3JjL21haW4vamF2YS9jb20vbmYvYXNzL0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9tb2R1bGUtYS9zcmMvbWFpbi9qYXZhL2NvbS9uZi9hc3MvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlNThjNTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9tb2R1bGUtYS9zcmMvbWFpbi9qYXZhL2NvbS9uZi9hc3MvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIGNvbS5uZi5hc3M7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9tb2R1bGUtYS9zcmMvdGVzdC9qYXZhL2NvbS9uZi9hc3MvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9tb2R1bGUtYS9zcmMvdGVzdC9qYXZhL2NvbS9uZi9hc3MvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTEyNjY2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWEvc3JjL3Rlc3QvamF2YS9jb20vbmYvYXNzL0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgY29tLm5mLmFzczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9tb2R1bGUtYi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9tb2R1bGUtYi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDliNDk0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTk5PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5tb2R1bGUtYjwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+QXNzZW1ibHkgU3Bpa2UgTW9kdWxlIEI8L25hbWU+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD52ZWxvY2l0eTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnZlbG9jaXR5PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTk5L21vZHVsZS1iL3NyYy9tYWluL2phdmEvY29tL25mL2Fzcy9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWIvc3JjL21haW4vamF2YS9jb20vbmYvYXNzL0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTU4YzUzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWIvc3JjL21haW4vamF2YS9jb20vbmYvYXNzL0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBjb20ubmYuYXNzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWIvc3JjL3Rlc3QvamF2YS9jb20vbmYvYXNzL0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvbW9kdWxlLWIvc3JjL3Rlc3QvamF2YS9jb20vbmYvYXNzL0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMjY2Ni4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTk5L21vZHVsZS1iL3NyYy90ZXN0L2phdmEvY29tL25mL2Fzcy9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIGNvbS5uZi5hc3M7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tYXNzZW1ibHktOTkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE1MzI2ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTk5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTk5PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPkFzc2VtYmx5IFNwaWtlPC9uYW1lPgotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPm1vZHVsZS1hPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5tb2R1bGUtYjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICA8cGx1Z2lucz4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICA8L3BsdWdpbnM+Ci0gICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmxpZXMvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+ICAKLSAgPHBsdWdpblJlcG9zaXRvcmllcz4KLSAgICA8cGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgIDx1cmw+aHR0cDovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9zbmFwc2hvdHM8L3VybD4KLSAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gIDwvcGx1Z2luUmVwb3NpdG9yaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS9zcmMvbWFpbi9hc3NlbWJsaWVzL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTk5L3NyYy9tYWluL2Fzc2VtYmxpZXMvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZkMDlkNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTk5L3NyYy9tYWluL2Fzc2VtYmxpZXMvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgCi0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIAotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pm1vZHVsZXM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke21vZHVsZS5hcnRpZmFjdElkfS4ke21vZHVsZS5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLQotICAgICAgICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICAgICAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgICAgIDwvYmluYXJpZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLSAKLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTk5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWFzc2VtYmx5LTk5L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNmMwNGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21hc3NlbWJseS05OS92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9tYXNzZW1ibHktOTktMS4wLVNOQVBTSE9ULWJpbi9saWIvamRvbS5qYXIiICkuZXhpc3RzKCk7Ci1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvbWFzc2VtYmx5LTk5LTEuMC1TTkFQU0hPVC1iaW4vbGliL3ZlbG9jaXR5LmphciIgKS5leGlzdHMoKTsKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS05OS0xLjAtU05BUFNIT1QtYmluL21vZHVsZXMvbW9kdWxlLWEuamFyIiApLmV4aXN0cygpOwotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS05OS0xLjAtU05BUFNIT1QtYmluL21vZHVsZXMvbW9kdWxlLWIuamFyIiApLmV4aXN0cygpOwotCi0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWlkLWFydGlmYWN0SWQtd2lsZGNhcmQtbWFzc2VtYmx5NTcwL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9taWQtYXJ0aWZhY3RJZC13aWxkY2FyZC1tYXNzZW1ibHk1NzAvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9taWQtYXJ0aWZhY3RJZC13aWxkY2FyZC1tYXNzZW1ibHk1NzAvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9taWQtYXJ0aWZhY3RJZC13aWxkY2FyZC1tYXNzZW1ibHk1NzAvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9taWQtYXJ0aWZhY3RJZC13aWxkY2FyZC1tYXNzZW1ibHk1NzAvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjg4ZDlmZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWlkLWFydGlmYWN0SWQtd2lsZGNhcmQtbWFzc2VtYmx5NTcwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxhcnRpZmFjdElkPm1pZC1hcnRpZmFjdElkLXdpbGRjYXJkLW1hc3NlbWJseTU3MDwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+bWlkLWFydGlmYWN0SWQtd2lsZGNhcmQtbWFzc2VtYmx5NTcwPC9uYW1lPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2xlYW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi40LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMy4yPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWlkLWFydGlmYWN0SWQtd2lsZGNhcmQtbWFzc2VtYmx5NTcwL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbWlkLWFydGlmYWN0SWQtd2lsZGNhcmQtbWFzc2VtYmx5NTcwL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkZjY3ZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21pZC1hcnRpZmFjdElkLXdpbGRjYXJkLW1hc3NlbWJseTU3MC9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIAotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAKLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5tYXZlbi1saWJzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi0qLXBsdWdpbjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9taWQtYXJ0aWZhY3RJZC13aWxkY2FyZC1tYXNzZW1ibHk1NzAvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21pZC1hcnRpZmFjdElkLXdpbGRjYXJkLW1hc3NlbWJseTU3MC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21pZC1hcnRpZmFjdElkLXdpbGRjYXJkLW1hc3NlbWJseTU3MC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21pZC1hcnRpZmFjdElkLXdpbGRjYXJkLW1hc3NlbWJseTU3MC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21pZC1hcnRpZmFjdElkLXdpbGRjYXJkLW1hc3NlbWJseTU3MC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9taWQtYXJ0aWZhY3RJZC13aWxkY2FyZC1tYXNzZW1ibHk1NzAvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21pZC1hcnRpZmFjdElkLXdpbGRjYXJkLW1hc3NlbWJseTU3MC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL21pZC1hcnRpZmFjdElkLXdpbGRjYXJkLW1hc3NlbWJseTU3MC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2NkM2IzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9taWQtYXJ0aWZhY3RJZC13aWxkY2FyZC1tYXNzZW1ibHk1NzAvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotRmlsZSBkaXIgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9taWQtYXJ0aWZhY3RJZC13aWxkY2FyZC1tYXNzZW1ibHk1NzAtMS1iaW4vbWF2ZW4tbGlicyIgKTsKLQotRmlsZVtdIGZpbGVzID0gewotICBuZXcgRmlsZSggZGlyLCAibWF2ZW4tY2xlYW4tcGx1Z2luLTIuNC4xLmphciIgKSwKLSAgbmV3IEZpbGUoIGRpciwgIm1hdmVuLWphci1wbHVnaW4tMi4zLjIuamFyIikKLX07Ci0KLWJvb2xlYW4gbWlzc2luZyA9IGZhbHNlOwotZm9yKCBpbnQgaSA9IDA7IGk8ZmlsZXMubGVuZ3RoOyBpKysgKQotewotICAgIGlmICggIWZpbGVzW2ldLmV4aXN0cygpICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIk1pc3NpbmcgamFyOiAiICsgZmlsZXNbaV0gKyAiIChzaG91bGQgYmUgaW5jbHVkZWQgdmlhIHdpbGRjYXJkIHBhdHRlcm4pLiIgKTsKLSAgICAgICAgbWlzc2luZyA9IHRydWU7Ci0gICAgfQotfQotCi1yZXR1cm4gIW1pc3Npbmc7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbXVsdGlwbGUtd2lsZGNhcmQtaW5jbHVkZXMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL211bHRpcGxlLXdpbGRjYXJkLWluY2x1ZGVzL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2FhNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbXVsdGlwbGUtd2lsZGNhcmQtaW5jbHVkZXMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tdWx0aXBsZS13aWxkY2FyZC1pbmNsdWRlcy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL211bHRpcGxlLXdpbGRjYXJkLWluY2x1ZGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjI3YmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL211bHRpcGxlLXdpbGRjYXJkLWluY2x1ZGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yNDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPm1hc3NlbWJseS0yNDE8L25hbWU+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLndhZ29uPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tcHJvdmlkZXItYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+IDEuMC1iZXRhLTQ8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi53YWdvbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPndhZ29uLXdlYmRhdi1qYWNrcmFiYml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLWJldGEtNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlcG9ydGluZy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjQuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLXZmczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtdmZzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+IDEuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtbHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbXVsdGlwbGUtd2lsZGNhcmQtaW5jbHVkZXMvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tdWx0aXBsZS13aWxkY2FyZC1pbmNsdWRlcy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTE4NmM4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tdWx0aXBsZS13aWxkY2FyZC1pbmNsdWRlcy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIAotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAKLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5tYXZlbi1saWJzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb24qPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5vcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZyo8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbXVsdGlwbGUtd2lsZGNhcmQtaW5jbHVkZXMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL211bHRpcGxlLXdpbGRjYXJkLWluY2x1ZGVzL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvbXVsdGlwbGUtd2lsZGNhcmQtaW5jbHVkZXMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tdWx0aXBsZS13aWxkY2FyZC1pbmNsdWRlcy9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL211bHRpcGxlLXdpbGRjYXJkLWluY2x1ZGVzL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL211bHRpcGxlLXdpbGRjYXJkLWluY2x1ZGVzL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9tdWx0aXBsZS13aWxkY2FyZC1pbmNsdWRlcy92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL211bHRpcGxlLXdpbGRjYXJkLWluY2x1ZGVzL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMzEwZDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL211bHRpcGxlLXdpbGRjYXJkLWluY2x1ZGVzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgd2Fnb25Qcm92aWRlckphciA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS0yNDEtMS1iaW4vbWF2ZW4tbGlicy93YWdvbi1wcm92aWRlci1hcGktMS4wLWJldGEtNC5qYXIiICk7Ci1GaWxlIHJlcG9ydGluZ0ltcGxKYXIgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9tYXNzZW1ibHktMjQxLTEtYmluL21hdmVuLWxpYnMvbWF2ZW4tcmVwb3J0aW5nLWltcGwtMi4wLjQuMS5qYXIiICk7Ci0KLWlmICggIXdhZ29uUHJvdmlkZXJKYXIuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIldhZ29uIHByb3ZpZGVyIGphciBpcyBtaXNzaW5nIChzaG91bGQgYmUgaW5jbHVkZWQgdmlhIGluY2x1ZGUgd2lsZGNhcmQgcGF0dGVybikuIiApOwotfQotCi1pZiAoICFyZXBvcnRpbmdJbXBsSmFyLmV4aXN0cygpICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJSZXBvcnRpbmcgaW1wbGVtZW50YXRpb24gamFyIGlzIG1pc3NpbmcgKHNob3VsZCBiZSBpbmNsdWRlZCB2aWEgaW5jbHVkZSB3aWxkY2FyZCBwYXR0ZXJuKS4iICk7Ci19Ci0KLXJldHVybiB3YWdvblByb3ZpZGVySmFyLmV4aXN0cygpICYmIHJlcG9ydGluZ0ltcGxKYXIuZXhpc3RzKCk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nV2l0aFVucGFjay9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nV2l0aFVucGFjay9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDNhYTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL291dHB1dEZpbGVOYW1lTWFwcGluZ1dpdGhVbnBhY2svaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9vdXRwdXRGaWxlTmFtZU1hcHBpbmdXaXRoVW5wYWNrL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nV2l0aFVucGFjay9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjZmMjk3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9vdXRwdXRGaWxlTmFtZU1hcHBpbmdXaXRoVW5wYWNrL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+NC40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz48Z29hbD5zaW5nbGU8L2dvYWw+PC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL291dHB1dEZpbGVOYW1lTWFwcGluZ1dpdGhVbnBhY2svc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy9vdXRwdXRGaWxlTmFtZU1hcHBpbmdXaXRoVW5wYWNrL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1N2MzNmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL291dHB1dEZpbGVOYW1lTWFwcGluZ1dpdGhVbnBhY2svc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICAKLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgIDxvdXRwdXREaXJlY3Rvcnk+c29tZV9kaXJlY3Rvcnk8L291dHB1dERpcmVjdG9yeT4KLSAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotICAKLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nV2l0aFVucGFjay92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL291dHB1dEZpbGVOYW1lTWFwcGluZ1dpdGhVbnBhY2svdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyNGY1MS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvb3V0cHV0RmlsZU5hbWVNYXBwaW5nV2l0aFVucGFjay92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi0vLyB2ZXJpZnkgdGhhdCB0aGUgZWFyIGlzIGNyZWF0ZWQKLUZpbGUgZGlyV2l0aE1hcHBpbmcgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9wcm9qZWN0LTEtYmluL3NvbWVfZGlyZWN0b3J5L2p1bml0Lmphci8iICk7Ci0KLWlmICggZGlyV2l0aE1hcHBpbmcuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIjxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+IHNob3VsZCBOT1QgYmUgdXNlZCB3aGVuIHVucGFjayA9PSB0cnVlLiIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLUZpbGUgZGlyID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvcHJvamVjdC0xLWJpbi9zb21lX2RpcmVjdG9yeS9qdW5pdC9mcmFtZXdvcmsvVGVzdENhc2UuY2xhc3MiICk7Ci0KLWlmICggIWRpci5leGlzdHMoKSApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiRXhwZWN0ZWQgdW5wYWNrZWQgY2xhc3MgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGFwcHJvcHJpYXRlIG91dHB1dERpcmVjdG9yeSB3aXRoaW4gdGhlIGFzc2VtYmx5LiIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VucGFjay1kZXBzLWNvcnJlY3QtZGlyL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91bnBhY2stZGVwcy1jb3JyZWN0LWRpci9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDNhYTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VucGFjay1kZXBzLWNvcnJlY3QtZGlyL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdW5wYWNrLWRlcHMtY29ycmVjdC1kaXIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91bnBhY2stZGVwcy1jb3JyZWN0LWRpci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmJjOGYyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91bnBhY2stZGVwcy1jb3JyZWN0LWRpci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPmNvbS5naXRodWIucnVuZWZsb2Jha2s8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+YXNzZW1ibHktcGx1Z2luLWJ1Zy1kZW1vPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAgIDxuYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvbmFtZT4KLQotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5za2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlZmF1bHQtc2tpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmJ1bmRsZS11bnBhY2tlZC1kZXBlbmRlbmN5PC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz48Z29hbD5zaW5nbGU8L2dvYWw+PC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvdW5wYWNrLWRlcHMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcnM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXI+c3JjL21haW4vZmlsdGVycy9teS5wcm9wZXJ0aWVzPC9maWx0ZXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWx0ZXJzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91bnBhY2stZGVwcy1jb3JyZWN0LWRpci9zcmMvbWFpbi9hc3NlbWJseS91bnBhY2stZGVwcy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdW5wYWNrLWRlcHMtY29ycmVjdC1kaXIvc3JjL21haW4vYXNzZW1ibHkvdW5wYWNrLWRlcHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTc5ZmVkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91bnBhY2stZGVwcy1jb3JyZWN0LWRpci9zcmMvbWFpbi9hc3NlbWJseS91bnBhY2stZGVwcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMi54c2QiPgotCi0KLSAgICA8aWQ+bXktYXNzZW1ibHk8L2lkPgotICAgIDxmb3JtYXRzPgotICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICAgIDwvZm9ybWF0cz4KLQotICAgIDxkZXBlbmRlbmN5U2V0cz4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PmZhbHNlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KjptYXZlbi1kZWZhdWx0LXNraW46KjoqPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZGVwczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICAgICAgICA8dW5wYWNrT3B0aW9ucz4KLSAgICAgICAgICAgICAgICA8ZmlsdGVyZWQ+dHJ1ZTwvZmlsdGVyZWQ+Ci0gICAgICAgICAgICA8L3VucGFja09wdGlvbnM+Ci0gICAgICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICA8L2RlcGVuZGVuY3lTZXRzPgotCi08L2Fzc2VtYmx5PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91bnBhY2stZGVwcy1jb3JyZWN0LWRpci9zcmMvbWFpbi9maWx0ZXJzL215LnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdW5wYWNrLWRlcHMtY29ycmVjdC1kaXIvc3JjL21haW4vZmlsdGVycy9teS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM1MjllLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91bnBhY2stZGVwcy1jb3JyZWN0LWRpci9zcmMvbWFpbi9maWx0ZXJzL215LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLW15Lm5hbWU9Sm9obiBEb2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91bnBhY2stZGVwcy1jb3JyZWN0LWRpci92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VucGFjay1kZXBzLWNvcnJlY3QtZGlyL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZjI5MjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VucGFjay1kZXBzLWNvcnJlY3QtZGlyL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1aaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2Fzc2VtYmx5LXBsdWdpbi1idWctZGVtby0xLjAtU05BUFNIT1QtbXktYXNzZW1ibHkuemlwIiApICk7Ci0KLVppcEVudHJ5IGNoaWxkMUluY2xFbnRyeSA9IHpmLmdldEVudHJ5KCAiYXNzZW1ibHktcGx1Z2luLWJ1Zy1kZW1vLTEuMC1TTkFQU0hPVC9kZXBzL01FVEEtSU5GL21hdmVuL29yZy5hcGFjaGUubWF2ZW4uc2tpbnMvbWF2ZW4tZGVmYXVsdC1za2luL3BvbS54bWwiICk7Ci0KLWlmICggY2hpbGQxSW5jbEVudHJ5ID09IG51bGwgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkluY29ycmVjdCBwYXRoIG9mIHVucGFja2VkIGphciBmaWxlIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZiZmZhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnktaW5saW5lCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1hL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1hL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYTI5ZmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldC9tb2R1bGUtYS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD51c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPm1vZHVsZS1hPC9hcnRpZmFjdElkPgotICA8bmFtZT5Bc3NlbWJseSBTcGlrZSBNb2R1bGUgQTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmpkb208L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qZG9tPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1hL3NyYy9tYWluL2phdmEvY29tL25mL2Fzcy9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvbW9kdWxlLWEvc3JjL21haW4vamF2YS9jb20vbmYvYXNzL0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTU4YzUzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvbW9kdWxlLWEvc3JjL21haW4vamF2YS9jb20vbmYvYXNzL0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBjb20ubmYuYXNzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvbW9kdWxlLWEvc3JjL3Rlc3QvamF2YS9jb20vbmYvYXNzL0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvbW9kdWxlLWEvc3JjL3Rlc3QvamF2YS9jb20vbmYvYXNzL0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjExMjY2Ni4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1hL3NyYy90ZXN0L2phdmEvY29tL25mL2Fzcy9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIGNvbS5uZi5hc3M7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvbW9kdWxlLWIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvbW9kdWxlLWIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQzNTdjMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1iL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnVzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+bW9kdWxlLWI8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPkFzc2VtYmx5IFNwaWtlIE1vZHVsZSBCPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dmVsb2NpdHk8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD52ZWxvY2l0eTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldC9tb2R1bGUtYi9zcmMvbWFpbi9qYXZhL2NvbS9uZi9hc3MvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1iL3NyYy9tYWluL2phdmEvY29tL25mL2Fzcy9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU1OGM1My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1iL3NyYy9tYWluL2phdmEvY29tL25mL2Fzcy9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgY29tLm5mLmFzczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1iL3NyYy90ZXN0L2phdmEvY29tL25mL2Fzcy9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L21vZHVsZS1iL3NyYy90ZXN0L2phdmEvY29tL25mL2Fzcy9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxMTI2NjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldC9tb2R1bGUtYi9zcmMvdGVzdC9qYXZhL2NvbS9uZi9hc3MvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBjb20ubmYuYXNzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDllODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnVzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPm1vZHVsZS1hPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5tb2R1bGUtYjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuNDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbk1hbmFnZW1lbnQ+Ci0gICAgICA8cGx1Z2lucz4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICA8L3BsdWdpbnM+Ci0gICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmxpZXMvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+ICAKLSAgPHBsdWdpblJlcG9zaXRvcmllcz4KLSAgICA8cGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgIDx1cmw+aHR0cDovL3JlcG9zaXRvcnkuYXBhY2hlLm9yZy9zbmFwc2hvdHM8L3VybD4KLSAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gIDwvcGx1Z2luUmVwb3NpdG9yaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldC9zcmMvbWFpbi9hc3NlbWJsaWVzL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L3NyYy9tYWluL2Fzc2VtYmxpZXMvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM5NzgyYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXBlbmRlbmN5LXNldHMvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0L3NyYy9tYWluL2Fzc2VtYmxpZXMvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgCi0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIAotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pm1vZHVsZXM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICAgIDxpbmNsdWRlRGVwZW5kZW5jaWVzPnRydWU8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICA8L2JpbmFyaWVzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci0gCi08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVwZW5kZW5jeS1zZXRzL3VzaW5nLW1vZHVsZVNldC1pbXBsaWVkLWRlcFNldC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDNmZWNjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2RlcGVuZGVuY3ktc2V0cy91c2luZy1tb2R1bGVTZXQtaW1wbGllZC1kZXBTZXQvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0LTEuMC1TTkFQU0hPVC1iaW4vbW9kdWxlcy9qZG9tLTEuMC5qYXIiICkuZXhpc3RzKCk7Ci1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0LTEuMC1TTkFQU0hPVC1iaW4vbW9kdWxlcy92ZWxvY2l0eS0xLjQuamFyIiApLmV4aXN0cygpOwotCi1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0LTEuMC1TTkFQU0hPVC1iaW4vbW9kdWxlcy9tb2R1bGUtYS5qYXIiICkuZXhpc3RzKCk7Ci1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdXNpbmctbW9kdWxlU2V0LWltcGxpZWQtZGVwU2V0LTEuMC1TTkFQU0hPVC1iaW4vbW9kdWxlcy9tb2R1bGUtYi5qYXIiICkuZXhpc3RzKCk7Ci0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9iaW4vamFycy1pbi1hcmNoaXZlLXJvb3QvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjk3MWI1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9iaW4vamFycy1pbi1hcmNoaXZlLXJvb3QvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhzaTpzY2hlbWFMb2NhdGlvbj0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QnIHhtbG5zPSdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmphcnMtaW4tYXJjaGl2ZS1yb290PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPk1hdmVuIFF1aWNrIFN0YXJ0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmJpbjwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT5wb3NpeDwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9iaW4vamFycy1pbi1hcmNoaXZlLXJvb3Qvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9iaW4vamFycy1pbi1hcmNoaXZlLXJvb3Qvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2Jpbi9qYXJzLWluLWFyY2hpdmUtcm9vdC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNGMzNDM4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9iaW4vamFycy1pbi1hcmNoaXZlLXJvb3QvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi1TdHJpbmcgYmFzZW5hbWUgPSAiamFycy1pbi1hcmNoaXZlLXJvb3QtMS4wLVNOQVBTSE9UIjsKLQotdHJ5Ci17Ci0gICAgRmlsZSB6aXBGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvIiArIGJhc2VuYW1lICsgIi1iaW4uemlwIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIHppcEZpbGUgKTsKLSAgICAKLSAgICBpZiAoICF6aXBGaWxlLmV4aXN0cygpIHx8IHppcEZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJ6aXAgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyB6aXBGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIHppcEZpbGUgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBwcm9qZWN0LWFydGlmYWN0IGphciB6aXAgZW50cnkuIiApOwotICAgIAotICAgIFppcEVudHJ5IGplID0gemYuZ2V0RW50cnkoIGJhc2VuYW1lICsgIi8iICsgYmFzZW5hbWUgKyAiLmphciIgKTsgCi0KLSAgICBpZiAoIGplID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAicHJvamVjdCBhcnRpZmFjdCBpcyBtaXNzaW5nIGZyb20gYXJjaGl2ZSByb290IGRpci4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgIAotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0ub3V0ICk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2NvbXBvbmVudC1kZXNjcmlwdG9ycy1tZXJnZWQvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2NvbXBvbmVudC1kZXNjcmlwdG9ycy1tZXJnZWQvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOGI1MWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPk1hdmVuIFF1aWNrIFN0YXJ0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcENoaWxkMS5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwQ2hpbGQxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMDk1OWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwQ2hpbGQxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcENoaWxkMSAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjU2ZDQ0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9jaGlsZDEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxjb21wb25lbnQtc2V0PgotICA8Y29tcG9uZW50cz4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+Y2hpbGQ8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50Pm9uZTwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPnRlc3QvQXBwQ2hpbGQxPC9pbXBsZW1lbnRhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgPC9jb21wb25lbnRzPgotPC9jb21wb25lbnQtc2V0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDc0MTgyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+Y29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2NvbXBvbmVudC1kZXNjcmlwdG9ycy1tZXJnZWQvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWFlOWE2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT50ZXN0OmNoaWxkMTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8dW5wYWNrPnRydWU8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHthcnRpZmFjdC5hcnRpZmFjdElkfTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT5qdW5pdDpqdW5pdDwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTU0MGM1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9jaGlsZDIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxjb21wb25lbnQtc2V0PgotICA8Y29tcG9uZW50cz4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+Y2hpbGQ8L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PnR3bzwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPnRlc3QvQXBwPC9pbXBsZW1lbnRhdGlvbj4KLSAgICA8L2NvbXBvbmVudD4KLSAgPC9jb21wb25lbnRzPgotPC9jb21wb25lbnQtc2V0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDNhYTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2NvbXBvbmVudC1kZXNjcmlwdG9ycy1tZXJnZWQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzlmOTA3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvY29tcG9uZW50LWRlc2NyaXB0b3JzLW1lcmdlZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNvbXBvbmVudC1kZXNjcmlwdG9ycy1tZXJnZWQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9jb21wb25lbnQtZGVzY3JpcHRvcnMtbWVyZ2VkL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2NvbXBvbmVudC1kZXNjcmlwdG9ycy1tZXJnZWQvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZhMDNkZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2NvbXBvbmVudC1kZXNjcmlwdG9ycy1tZXJnZWQvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGphdmEuaW8uRmlsZS4iICk7Ci0gICAgCi0gICAgRmlsZSBqYXJGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZDIvdGFyZ2V0L2NoaWxkMi0xLjAtU05BUFNIT1QtamFyLXdpdGgtZGVwZW5kZW5jaWVzLmphciIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBmb3IgZXhpc3RlbmNlIGFuZCBmaWxlLWlzaG5lc3Mgb2Y6ICIgKyBqYXJGaWxlICk7Ci0gICAgCi0gICAgaWYgKCAhamFyRmlsZS5leGlzdHMoKSB8fCBqYXJGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiamFyIGZpbGUgaXMgbWlzc2luZyBvciBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ3JlYXRpbmcgSmFyRmlsZSBpbnN0YW5jZS4iICk7Ci0gICAgCi0gICAgSmFyRmlsZSBqZiA9IG5ldyBKYXJGaWxlKCBqYXJGaWxlICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgY29tcG9uZW50IGRlc2NyaXB0b3IgamFyIGVudHJ5LiIgKTsKLSAgICAKLSAgICBKYXJFbnRyeSBqZSA9IGpmLmdldEVudHJ5KCAiTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJjb21wb25lbnQgZGVzY3JpcHRvciBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIElucHV0U3RyZWFtIGluc3RyZWFtID0gamYuZ2V0SW5wdXRTdHJlYW0oIGplICk7Ci0KLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxNl07Ci0gICAgICAgIGludCByZWFkID0gLTE7Ci0KLSAgICAgICAgd2hpbGUoICggcmVhZCA9IGluc3RyZWFtLnJlYWQoIGJ1ZiApICkgPiAtMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJhb3Mud3JpdGUoIGJ1ZiwgMCwgcmVhZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRlc3QgPSBuZXcgU3RyaW5nKCBiYW9zLnRvQnl0ZUFycmF5KCkgKTsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCB0ZXN0ICk7Ci0KLSAgICAgICAgcmVzdWx0ID0gdGVzdC5pbmRleE9mKCAib25lIiApID4gLTEgJiYgdGVzdC5pbmRleE9mKCAidHdvIiApID4gLTE7Ci0gICAgfQotICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYwY2UxZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2RlcHMtdW5wYWNrZWQtdG8tcm9vdC1kaXIvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5qYXItd2l0aC1kZXBlbmRlbmNpZXMtdW5wYWNrZWQtdG8tcm9vdC1kaXI8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICA8bmFtZT5NYXZlbiBRdWljayBTdGFydCBBcmNoZXR5cGU8L25hbWU+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2RlcHMtdW5wYWNrZWQtdG8tcm9vdC1kaXIvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHBDaGlsZDEuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcENoaWxkMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYjA5NTliLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcENoaWxkMS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBDaGlsZDEgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjcwMjAwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2RlcHMtdW5wYWNrZWQtdG8tcm9vdC1kaXIvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmphci13aXRoLWRlcGVuZGVuY2llcy11bnBhY2tlZC10by1yb290LWRpcjwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hdHRhY2gtYmluYXJ5LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2RlcHMtdW5wYWNrZWQtdG8tcm9vdC1kaXIvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWFlOWE2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT50ZXN0OmNoaWxkMTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8dW5wYWNrPnRydWU8L3VucGFjaz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHthcnRpZmFjdC5hcnRpZmFjdElkfTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT5qdW5pdDpqdW5pdDwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9kZXBzLXVucGFja2VkLXRvLXJvb3QtZGlyL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9kZXBzLXVucGFja2VkLXRvLXJvb3QtZGlyL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9kZXBzLXVucGFja2VkLXRvLXJvb3QtZGlyL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9kZXBzLXVucGFja2VkLXRvLXJvb3QtZGlyL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9kZXBzLXVucGFja2VkLXRvLXJvb3QtZGlyL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9kZXBzLXVucGFja2VkLXRvLXJvb3QtZGlyL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1wYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2RlcHMtdW5wYWNrZWQtdG8tcm9vdC1kaXIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDdjNTdiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmphci13aXRoLWRlcGVuZGVuY2llcy11bnBhY2tlZC10by1yb290LWRpcjwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL2RlcHMtdW5wYWNrZWQtdG8tcm9vdC1kaXIvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzY5ZGM5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvZGVwcy11bnBhY2tlZC10by1yb290LWRpci92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNyZWF0aW5nIEphckZpbGUgamF2YS5pby5GaWxlLiIgKTsKLSAgICAKLSAgICBGaWxlIGphckZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMi90YXJnZXQvY2hpbGQyLTEuMC1TTkFQU0hPVC1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIGphckZpbGUgKTsKLSAgICAKLSAgICBpZiAoICFqYXJGaWxlLmV4aXN0cygpIHx8IGphckZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJqYXIgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBKYXJGaWxlIGpmID0gbmV3IEphckZpbGUoIGphckZpbGUgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciAndGVzdC9BcHBDaGlsZDEuY2xhc3MnIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggInRlc3QvQXBwQ2hpbGQxLmNsYXNzIiApID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiY2hpbGQxIGNsYXNzIGlzIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIGpmLmdldEVudHJ5KCAidGVzdC9BcHAuY2xhc3MiICkgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJjaGlsZDIgY2xhc3MgaXMgbWlzc2luZy4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBhYnNlbmNlIG9mICdqdW5pdC8nIGphciBlbnRyeS4iICk7Ci0gICAgCi0gICAgaWYgKCBqZi5nZXRFbnRyeSggImp1bml0L2ZyYW1ld29yay9UZXN0Q2FzZS5jbGFzcyIgKSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImp1bml0IGphciBzaG91bGQgbm90IGJlIHByZXNlbnQuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvbm8tdGFyZ2V0LWRpci9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL25vLXRhcmdldC1kaXIvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvbm8tdGFyZ2V0LWRpci9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9uby10YXJnZXQtZGlyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL25vLXRhcmdldC1kaXIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0Nzg0Mi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL25vLXRhcmdldC1kaXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5qYXItd2l0aC1kZXBlbmRlbmNpZXMtbm8tdGFyZ2V0LWRpcjwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmphci13aXRoLWRlcGVuZGVuY2llczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvbm8tdGFyZ2V0LWRpci9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvbm8tdGFyZ2V0LWRpci9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODExMjY0Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL25vLXRhcmdldC1kaXIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHk+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmphcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+dGVzdDpjaGlsZDE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH08L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+anVuaXQ6anVuaXQ8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL25vLXRhcmdldC1kaXIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9uby10YXJnZXQtZGlyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvamFyLXdpdGgtZGVwZW5kZW5jaWVzL25vLXRhcmdldC1kaXIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMvbm8tdGFyZ2V0LWRpci92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9uby10YXJnZXQtZGlyL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZGE0YTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL2phci13aXRoLWRlcGVuZGVuY2llcy9uby10YXJnZXQtZGlyL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ3JlYXRpbmcgSmFyRmlsZSBqYXZhLmlvLkZpbGUuIiApOwotICAgIAotICAgIEZpbGUgamFyRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2phci13aXRoLWRlcGVuZGVuY2llcy1uby10YXJnZXQtZGlyLTEuMC1TTkFQU0hPVC1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIGphckZpbGUgKTsKLSAgICAKLSAgICBpZiAoICFqYXJGaWxlLmV4aXN0cygpIHx8IGphckZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJqYXIgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyBKYXJGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBKYXJGaWxlIGpmID0gbmV3IEphckZpbGUoIGphckZpbGUgKTsKLSAgICAKLSAgICBpZiAoIGpmLmdldEVudHJ5KCAidGVzdC9BcHAuY2xhc3MiICkgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJBcHAgY2xhc3MgaXMgbWlzc2luZy4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBhYnNlbmNlIG9mICd0YXJnZXQvY2xhc3Nlcy90ZXN0L0FwcC5jbGFzcycgamFyIGVudHJ5LiIgKTsKLSAgICAKLSAgICBpZiAoIGpmLmdldEVudHJ5KCAidGFyZ2V0L2NsYXNzZXMvdGVzdC9BcHAuY2xhc3MiICkgIT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJ0YXJnZXQgZGlyZWN0b3J5IHNob3VsZCBub3QgYmUgcHJlc2VudC4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3QvbXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlkYmUyNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC9jaGlsZDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPm11bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3QvbXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3QvbXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDQ1Nzk3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+bXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotICA8bmFtZT5NYXZlbiBRdWljayBTdGFydCBBcmNoZXR5cGU8L25hbWU+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3QvbXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3QvbXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3QvbXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3QvbXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MGIxODYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3QvbXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4c2k6c2NoZW1hTG9jYXRpb249J2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkJyB4bWxucz0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJz4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8bmFtZT5NYXZlbiBRdWljayBTdGFydCBBcmNoZXR5cGU8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+cHJvamVjdDwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT5wb3NpeDwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzJiNjkwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L211bHRpbW9kdWxlLXNvdXJjZXMtY29waWVkL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLVN0cmluZyBiYXNlbmFtZSA9ICJtdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC0xLjAtU05BUFNIT1QiOwotCi10cnkKLXsKLSAgICBGaWxlIHppcEZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC8iICsgYmFzZW5hbWUgKyAiLXByb2plY3QuemlwIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIHppcEZpbGUgKTsKLSAgICAKLSAgICBpZiAoICF6aXBGaWxlLmV4aXN0cygpIHx8IHppcEZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJ6aXAgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyB6aXBGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIHppcEZpbGUgKTsKLSAgICAKLSAgICBTdHJpbmcgY2hpbGRQYXRoID0gYmFzZW5hbWUgKyAiL2NoaWxkMSI7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ2hlY2tpbmcgY2hpbGQxIHByb2plY3QgZmlsZXMuLi4iICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcHJvamVjdCBzb3VyY2UgZmlsZS4iICk7Ci0gICAgCi0gICAgWmlwRW50cnkgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEiICk7IAotCi0gICAgaWYgKCBqZSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggY2hpbGRQYXRoICsgIiBzb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcHJvamVjdCB0ZXN0LXNvdXJjZSBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGNoaWxkUGF0aCArICIgdGVzdC1zb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcG9tLnhtbCBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9wb20ueG1sIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGNoaWxkUGF0aCArICIgUE9NIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICBjaGlsZFBhdGggPSBiYXNlbmFtZSArICIvY2hpbGQyIjsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBjaGlsZDIgcHJvamVjdCBmaWxlcy4uLiIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBwcm9qZWN0IHNvdXJjZSBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEiICk7IAotCi0gICAgaWYgKCBqZSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggY2hpbGRQYXRoICsgIiBzb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcHJvamVjdCB0ZXN0LXNvdXJjZSBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGNoaWxkUGF0aCArICIgdGVzdC1zb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcG9tLnhtbCBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9wb20ueG1sIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGNoaWxkUGF0aCArICIgUE9NIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBtYWluIHBvbS54bWwgZmlsZS4iICk7Ci0gICAgCi0gICAgamUgPSBudWxsOwotICAgIGplID0gemYuZ2V0RW50cnkoIGJhc2VuYW1lICsgIi9wb20ueG1sIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJwcm9qZWN0IFBPTSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0ub3V0ICk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci1tdWx0aW1vZHVsZS9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjMjA1ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+bXVsdGltb2R1bGUtc291cmNlcy1jb3BpZWQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci1tdWx0aW1vZHVsZS9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTBiNzI3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci1tdWx0aW1vZHVsZS9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci1tdWx0aW1vZHVsZS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci1tdWx0aW1vZHVsZS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci1tdWx0aW1vZHVsZS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci1tdWx0aW1vZHVsZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGQ3MzQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4c2k6c2NoZW1hTG9jYXRpb249J2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkJyB4bWxucz0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJz4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5tdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+cHJvamVjdDwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgPHRhckxvbmdGaWxlTW9kZT5wb3NpeDwvdGFyTG9uZ0ZpbGVNb2RlPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXItbXVsdGltb2R1bGUvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjRkNzZmNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyLW11bHRpbW9kdWxlL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLVN0cmluZyBiYXNlbmFtZSA9ICJtdWx0aW1vZHVsZS1zb3VyY2VzLWNvcGllZC0xLjAtU05BUFNIT1QiOwotCi10cnkKLXsKLSAgICBGaWxlIHppcEZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC8iICsgYmFzZW5hbWUgKyAiLXByb2plY3QuemlwIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIHppcEZpbGUgKTsKLSAgICAKLSAgICBpZiAoICF6aXBGaWxlLmV4aXN0cygpIHx8IHppcEZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJ6aXAgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyB6aXBGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIHppcEZpbGUgKTsKLSAgICAKLSAgICBTdHJpbmcgY2hpbGRQYXRoID0gYmFzZW5hbWUgKyAiL2NoaWxkMSI7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ2hlY2tpbmcgY2hpbGQxIHByb2plY3QgZmlsZXMuLi4iICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcHJvamVjdCBzb3VyY2UgZmlsZS4iICk7Ci0gICAgCi0gICAgWmlwRW50cnkgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEiICk7IAotCi0gICAgaWYgKCBqZSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggY2hpbGRQYXRoICsgIiBzb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcHJvamVjdCB0ZXN0LXNvdXJjZSBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGNoaWxkUGF0aCArICIgdGVzdC1zb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcG9tLnhtbCBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9wb20ueG1sIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGNoaWxkUGF0aCArICIgUE9NIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi90YXJnZXQvY2hpbGQxLTEuMC1TTkFQU0hPVC5qYXIiICk7IAotCi0gICAgaWYgKCBqZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggY2hpbGRQYXRoICsgIiB0YXJnZXQgZGlyZWN0b3J5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICBjaGlsZFBhdGggPSBiYXNlbmFtZSArICIvY2hpbGQyIjsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBjaGlsZDIgcHJvamVjdCBmaWxlcy4uLiIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBwcm9qZWN0IHNvdXJjZSBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEiICk7IAotCi0gICAgaWYgKCBqZSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggY2hpbGRQYXRoICsgIiBzb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcHJvamVjdCB0ZXN0LXNvdXJjZSBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGNoaWxkUGF0aCArICIgdGVzdC1zb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcG9tLnhtbCBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi9wb20ueG1sIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGNoaWxkUGF0aCArICIgUE9NIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggY2hpbGRQYXRoICsgIi90YXJnZXQvY2hpbGQyLTEuMC1TTkFQU0hPVC5qYXIiICk7IAotCi0gICAgaWYgKCBqZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggY2hpbGRQYXRoICsgIiB0YXJnZXQgZGlyZWN0b3J5IHNob3VsZCBub3QgYmUgaW5jbHVkZWQuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBtYWluIHBvbS54bWwgZmlsZS4iICk7Ci0gICAgCi0gICAgamUgPSBudWxsOwotICAgIGplID0gemYuZ2V0RW50cnkoIGJhc2VuYW1lICsgIi9wb20ueG1sIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJwcm9qZWN0IFBPTSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0ub3V0ICk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXIvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXIvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L25vLXRhcmdldC1kaXIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk2NDlhMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4c2k6c2NoZW1hTG9jYXRpb249J2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkJyB4bWxucz0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJz4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5uby10YXJnZXQtZGlyPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5wcm9qZWN0PC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPnBvc2l4PC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9uby10YXJnZXQtZGlyL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNWQ1MzcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvbm8tdGFyZ2V0LWRpci92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLVN0cmluZyBiYXNlbmFtZSA9ICJuby10YXJnZXQtZGlyLTEuMC1TTkFQU0hPVCI7Ci0KLXRyeQotewotICAgIEZpbGUgemlwRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0LyIgKyBiYXNlbmFtZSArICItcHJvamVjdC56aXAiICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ2hlY2tpbmcgZm9yIGV4aXN0ZW5jZSBhbmQgZmlsZS1pc2huZXNzIG9mOiAiICsgemlwRmlsZSApOwotICAgIAotICAgIGlmICggIXppcEZpbGUuZXhpc3RzKCkgfHwgemlwRmlsZS5pc0RpcmVjdG9yeSgpICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggInppcCBmaWxlIGlzIG1pc3Npbmcgb3IgYSBkaXJlY3RvcnkuIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNyZWF0aW5nIHppcEZpbGUgaW5zdGFuY2UuIiApOwotICAgIAotICAgIFppcEZpbGUgemYgPSBuZXcgWmlwRmlsZSggemlwRmlsZSApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkxvb2tpbmcgZm9yIHByb2plY3QgY2xhc3Nlcy4iICk7Ci0gICAgCi0gICAgWmlwRW50cnkgamUgPSB6Zi5nZXRFbnRyeSggYmFzZW5hbWUgKyAiL3RhcmdldC9jbGFzc2VzL3Rlc3QvQXBwLmphdmEiICk7IAotCi0gICAgaWYgKCBqZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInByb2plY3QgY2xhc3NlcyBzaG91bGQgbm90IGJlIGluY2x1ZGVkLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0ub3V0ICk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9zb3VyY2VzLWNvcGllZC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9zb3VyY2VzLWNvcGllZC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvc291cmNlcy1jb3BpZWQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L3NvdXJjZXMtY29waWVkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9zb3VyY2VzLWNvcGllZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDY0NWQxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L3NvdXJjZXMtY29waWVkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4c2k6c2NoZW1hTG9jYXRpb249J2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkJyB4bWxucz0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJz4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5zb3VyY2VzLWNvcGllZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8bmFtZT5NYXZlbiBRdWljayBTdGFydCBBcmNoZXR5cGU8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5wcm9qZWN0PC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPnBvc2l4PC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvc291cmNlcy1jb3BpZWQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvc291cmNlcy1jb3BpZWQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9wcm9qZWN0L3NvdXJjZXMtY29waWVkL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9zb3VyY2VzLWNvcGllZC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvc291cmNlcy1jb3BpZWQvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9zb3VyY2VzLWNvcGllZC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9zb3VyY2VzLWNvcGllZC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3Byb2plY3Qvc291cmNlcy1jb3BpZWQvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJhZDdhNi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvcHJvamVjdC9zb3VyY2VzLWNvcGllZC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsODMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLnppcC4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLVN0cmluZyBiYXNlbmFtZSA9ICJzb3VyY2VzLWNvcGllZC0xLjAtU05BUFNIT1QiOwotCi10cnkKLXsKLSAgICBGaWxlIHppcEZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC8iICsgYmFzZW5hbWUgKyAiLXByb2plY3QuemlwIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIHppcEZpbGUgKTsKLSAgICAKLSAgICBpZiAoICF6aXBGaWxlLmV4aXN0cygpIHx8IHppcEZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJ6aXAgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyB6aXBGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIHppcEZpbGUgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBwcm9qZWN0IHNvdXJjZSBmaWxlLiIgKTsKLSAgICAKLSAgICBaaXBFbnRyeSBqZSA9IHpmLmdldEVudHJ5KCBiYXNlbmFtZSArICIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIiApOyAKLQotICAgIGlmICggamUgPT0gbnVsbCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJwcm9qZWN0IHNvdXJjZSBmaWxlIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBwcm9qZWN0IHRlc3Qtc291cmNlIGZpbGUuIiApOwotICAgIAotICAgIGplID0gbnVsbDsKLSAgICBqZSA9IHpmLmdldEVudHJ5KCBiYXNlbmFtZSArICIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSIgKTsgCi0KLSAgICBpZiAoIGplID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAicHJvamVjdCB0ZXN0LXNvdXJjZSBmaWxlIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBwb20ueG1sIGZpbGUuIiApOwotICAgIAotICAgIGplID0gbnVsbDsKLSAgICBqZSA9IHpmLmdldEVudHJ5KCBiYXNlbmFtZSArICIvcG9tLnhtbCIgKTsgCi0KLSAgICBpZiAoIGplID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAicHJvamVjdCBQT00gbWlzc2luZy4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgIAotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCBTeXN0ZW0ub3V0ICk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL25vLXRhcmdldC1kaXIvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9uby10YXJnZXQtZGlyL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL25vLXRhcmdldC1kaXIvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvbm8tdGFyZ2V0LWRpci9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9uby10YXJnZXQtZGlyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5YWE3MmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9uby10YXJnZXQtZGlyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4c2k6c2NoZW1hTG9jYXRpb249J2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkJyB4bWxucz0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJz4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5uby10YXJnZXQtZGlyPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5zcmM8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+cG9zaXg8L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL25vLXRhcmdldC1kaXIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9uby10YXJnZXQtZGlyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL25vLXRhcmdldC1kaXIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvbm8tdGFyZ2V0LWRpci9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9uby10YXJnZXQtZGlyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9uby10YXJnZXQtZGlyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvbm8tdGFyZ2V0LWRpci92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9uby10YXJnZXQtZGlyL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhMDhmZmUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9uby10YXJnZXQtZGlyL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotU3RyaW5nIGJhc2VuYW1lID0gIm5vLXRhcmdldC1kaXItMS4wLVNOQVBTSE9UIjsKLQotdHJ5Ci17Ci0gICAgRmlsZSB6aXBGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvIiArIGJhc2VuYW1lICsgIi1zcmMuemlwIiApOwotICAgIAotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNoZWNraW5nIGZvciBleGlzdGVuY2UgYW5kIGZpbGUtaXNobmVzcyBvZjogIiArIHppcEZpbGUgKTsKLSAgICAKLSAgICBpZiAoICF6aXBGaWxlLmV4aXN0cygpIHx8IHppcEZpbGUuaXNEaXJlY3RvcnkoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oICJ6aXAgZmlsZSBpcyBtaXNzaW5nIG9yIGEgZGlyZWN0b3J5LiIgKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDcmVhdGluZyB6aXBGaWxlIGluc3RhbmNlLiIgKTsKLSAgICAKLSAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIHppcEZpbGUgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMb29raW5nIGZvciBwcm9qZWN0IGNsYXNzZXMuIiApOwotICAgIAotICAgIFppcEVudHJ5IGplID0gemYuZ2V0RW50cnkoIGJhc2VuYW1lICsgIi90YXJnZXQvY2xhc3Nlcy90ZXN0L0FwcC5jbGFzcyIgKTsgCi0KLSAgICBpZiAoIGplICE9IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAicHJvamVjdCBjbGFzc2VzIHNob3VsZCBub3QgYmUgcHJlc2VudC4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSggU3lzdGVtLm91dCApOwotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9zcmMtZGlyLWNvcGllZC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL3NyYy1kaXItY29waWVkL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL3NyYy1kaXItY29waWVkL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1wYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL3NyYy1kaXItY29waWVkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL3NyYy1kaXItY29waWVkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5OWIzNjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZGVzY3JpcHRvci1yZWZzL3NyYy9zcmMtZGlyLWNvcGllZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM6eHNpPSdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZScgeHNpOnNjaGVtYUxvY2F0aW9uPSdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCcgeG1sbnM9J2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCc+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+c3JjLWRpci1jb3BpZWQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5zcmM8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+cG9zaXg8L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL3NyYy1kaXItY29waWVkL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvc3JjLWRpci1jb3BpZWQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvc3JjLWRpci1jb3BpZWQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvc3JjLWRpci1jb3BpZWQvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvc3JjLWRpci1jb3BpZWQvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL3NyYy1kaXItY29waWVkL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvc3JjLWRpci1jb3BpZWQvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2Rlc2NyaXB0b3ItcmVmcy9zcmMvc3JjLWRpci1jb3BpZWQvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE0OGVkYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9kZXNjcmlwdG9yLXJlZnMvc3JjL3NyYy1kaXItY29waWVkL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotU3RyaW5nIGJhc2VuYW1lID0gInNyYy1kaXItY29waWVkLTEuMC1TTkFQU0hPVCI7Ci0KLXRyeQotewotICAgIEZpbGUgemlwRmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0LyIgKyBiYXNlbmFtZSArICItc3JjLnppcCIgKTsKLSAgICAKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGVja2luZyBmb3IgZXhpc3RlbmNlIGFuZCBmaWxlLWlzaG5lc3Mgb2Y6ICIgKyB6aXBGaWxlICk7Ci0gICAgCi0gICAgaWYgKCAhemlwRmlsZS5leGlzdHMoKSB8fCB6aXBGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiemlwIGZpbGUgaXMgbWlzc2luZyBvciBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ3JlYXRpbmcgemlwRmlsZSBpbnN0YW5jZS4iICk7Ci0gICAgCi0gICAgWmlwRmlsZSB6ZiA9IG5ldyBaaXBGaWxlKCB6aXBGaWxlICk7Ci0gICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcHJvamVjdCBzb3VyY2UgZmlsZS4iICk7Ci0gICAgCi0gICAgWmlwRW50cnkgamUgPSB6Zi5nZXRFbnRyeSggYmFzZW5hbWUgKyAiL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSIgKTsgCi0KLSAgICBpZiAoIGplID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAicHJvamVjdCBzb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTG9va2luZyBmb3IgcHJvamVjdCB0ZXN0LXNvdXJjZSBmaWxlLiIgKTsKLSAgICAKLSAgICBqZSA9IG51bGw7Ci0gICAgamUgPSB6Zi5nZXRFbnRyeSggYmFzZW5hbWUgKyAiL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEiICk7IAotCi0gICAgaWYgKCBqZSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInByb2plY3QgdGVzdC1zb3VyY2UgZmlsZSBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoIFN5c3RlbS5vdXQgKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZS1zZXQtZmlsZU1vZGUvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlLXNldC1maWxlTW9kZS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiMzBiODkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlLXNldC1maWxlTW9kZS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnkKLWludm9rZXIub3MuZmFtaWx5ID0gIXdpbmRvd3MKLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlLXNldC1maWxlTW9kZS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlLXNldC1maWxlTW9kZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzEwYzYwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZS1zZXQtZmlsZU1vZGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmZpbGUtc2V0LWZpbGVNb2RlPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPk1hdmVuIFF1aWNrIFN0YXJ0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGUtc2V0LWZpbGVNb2RlL3NyYy9hc3NlbWJsZS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlLXNldC1maWxlTW9kZS9zcmMvYXNzZW1ibGUvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNhMmIzZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGUtc2V0LWZpbGVNb2RlL3NyYy9hc3NlbWJsZS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgotICAgICAgPGZpbGVNb2RlPjA0MDA8L2ZpbGVNb2RlPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGUtc2V0LWZpbGVNb2RlL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZS1zZXQtZmlsZU1vZGUvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZS1zZXQtZmlsZU1vZGUvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZS1zZXQtZmlsZU1vZGUvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZS1zZXQtZmlsZU1vZGUvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGUtc2V0LWZpbGVNb2RlL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZS1zZXQtZmlsZU1vZGUvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZS1zZXQtZmlsZU1vZGUvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI3OWI4My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGUtc2V0LWZpbGVNb2RlL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotRmlsZVdyaXRlciB3cml0ZXIgPSBudWxsOwotCi10cnkKLXsKLQlGaWxlIGZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9maWxlLXNldC1maWxlTW9kZS0xLjAtU05BUFNIT1Qtc3JjL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSIgKTsKLQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRmlsZTogIiArIGZpbGUgKyAiIGV4cGVjdGVkLiIgKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkKLSAgICB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlciggZmlsZSApOwotICAgIHdyaXRlci53cml0ZSggIlRoaXMgaXMgYSB0ZXN0LiIgKTsKLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBmaWxlICsgIiBzaG91bGQgbm90IGJlIHdyaXRhYmxlLiIgKTsKLQotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIHJlc3VsdCA9IHRydWU7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZUl0ZW0tZmlsZU1vZGUvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjQ3NmM0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZUl0ZW0tZmlsZU1vZGUvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPW9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06ZGlyZWN0b3J5CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiNzYzNzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlSXRlbS1maWxlTW9kZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+ZmlsZUl0ZW0tZmlsZU1vZGU8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZUl0ZW0tZmlsZU1vZGUvc3JjL2Fzc2VtYmxlL3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3NyYy9hc3NlbWJsZS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTk0MTFiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtbW9kZXMvZmlsZUl0ZW0tZmlsZU1vZGUvc3JjL2Fzc2VtYmxlL3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVzPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT5zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmE8L3NvdXJjZT4KLSAgICAgIDxmaWxlTW9kZT4wNDAwPC9maWxlTW9kZT4KLSAgICA8L2ZpbGU+Ci0gIDwvZmlsZXM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlSXRlbS1maWxlTW9kZS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlSXRlbS1maWxlTW9kZS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLW1vZGVzL2ZpbGVJdGVtLWZpbGVNb2RlL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NTBiMmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1tb2Rlcy9maWxlSXRlbS1maWxlTW9kZS92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLUZpbGVXcml0ZXIgd3JpdGVyID0gbnVsbDsKLQotdHJ5Ci17Ci0gICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZmlsZUl0ZW0tZmlsZU1vZGUtMS4wLVNOQVBTSE9ULXNyYy9BcHAuamF2YSIgKTsKLQlpZiAoIWZpbGUuZXhpc3RzKCkpIHsKLQkgICAgU3lzdGVtLm91dC5wcmludGxuKCAiRmlsZTogIiArIGZpbGUgKyAiIGV4cGVjdGVkLiIgKTsKLQkgICAgcmV0dXJuIGZhbHNlOwotCX0KLQkgICAgCi0gICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoIGZpbGUgKTsKLSAgICB3cml0ZXIud3JpdGUoICJUaGlzIGlzIGEgdGVzdC4iICk7Ci0KLSAgICBpZiAoIFN5c3RlbS5nZXRQcm9wZXJ0eSggIm9zLm5hbWUiICkudG9Mb3dlckNhc2UoIExvY2FsZS5FTkdMSVNIICkuaW5kZXhPZiggIndpbmRvd3MiICkgPj0gMCApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJEZXRlY3RlZCBXaW5kb3dzIC0gc2tpcHBpbmciICk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbGU6ICIgKyBmaWxlICsgIiBzaG91bGQgbm90IGJlIHdyaXRhYmxlLiIgKTsKLQotICAgIHJlc3VsdCA9IGZhbHNlOwotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIHJlc3VsdCA9IHRydWU7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1kaXJlY3RvcnktdW5zcGVjaWZpZWQvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZGlyZWN0b3J5LXVuc3BlY2lmaWVkL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4NmQ1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1kaXJlY3RvcnktdW5zcGVjaWZpZWQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06ZGlyZWN0b3J5LWlubGluZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZGlyZWN0b3J5LXVuc3BlY2lmaWVkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1kaXJlY3RvcnktdW5zcGVjaWZpZWQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM2NTg2Zi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1kaXJlY3RvcnktdW5zcGVjaWZpZWQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmRlZmF1bHQtZGlyZWN0b3J5LXVuc3BlY2lmaWVkPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWRpcmVjdG9yeS11bnNwZWNpZmllZC9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZGlyZWN0b3J5LXVuc3BlY2lmaWVkL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMjU1ZmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZGlyZWN0b3J5LXVuc3BlY2lmaWVkL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLio8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1kaXJlY3RvcnktdW5zcGVjaWZpZWQvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWRpcmVjdG9yeS11bnNwZWNpZmllZC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MjY0ODIzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWRpcmVjdG9yeS11bnNwZWNpZmllZC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLVN0cmluZyBhc3NlbWJseURpciA9ICJ0YXJnZXQvZGVmYXVsdC1kaXJlY3RvcnktdW5zcGVjaWZpZWQtMS4wLVNOQVBTSE9ULXNyYy8iOwotCi1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsIGFzc2VtYmx5RGlyICsgImJ1aWxkLmxvZyIgKS5leGlzdHMoKTsKLXJlc3VsdCA9IHJlc3VsdCAmJiAhbmV3IEZpbGUoIGJhc2VkaXIsIGFzc2VtYmx5RGlyICsgIi5zdm4iICkuZXhpc3RzKCk7Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1leGNsdWRlcy11bnNwZWNpZmllZC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1leGNsdWRlcy11bnNwZWNpZmllZC9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODZkNWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZXhjbHVkZXMtdW5zcGVjaWZpZWQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06ZGlyZWN0b3J5LWlubGluZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZXhjbHVkZXMtdW5zcGVjaWZpZWQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWV4Y2x1ZGVzLXVuc3BlY2lmaWVkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZTJhYTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZXhjbHVkZXMtdW5zcGVjaWZpZWQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmRlZmF1bHQtZXhjbHVkZXMtdW5zcGVjaWZpZWQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZXhjbHVkZXMtdW5zcGVjaWZpZWQvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWV4Y2x1ZGVzLXVuc3BlY2lmaWVkL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjMzQxMjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZXhjbHVkZXMtdW5zcGVjaWZpZWQvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PnNyYzwvZGlyZWN0b3J5PgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1leGNsdWRlcy11bnNwZWNpZmllZC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1leGNsdWRlcy11bnNwZWNpZmllZC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RlZmF1bHQtZXhjbHVkZXMtdW5zcGVjaWZpZWQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWV4Y2x1ZGVzLXVuc3BlY2lmaWVkL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1leGNsdWRlcy11bnNwZWNpZmllZC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWV4Y2x1ZGVzLXVuc3BlY2lmaWVkL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWV4Y2x1ZGVzLXVuc3BlY2lmaWVkL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZGVmYXVsdC1leGNsdWRlcy11bnNwZWNpZmllZC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDc0MjZkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kZWZhdWx0LWV4Y2x1ZGVzLXVuc3BlY2lmaWVkL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotU3RyaW5nIGFzc2VtYmx5RGlyID0gInRhcmdldC9kZWZhdWx0LWV4Y2x1ZGVzLXVuc3BlY2lmaWVkLTEuMC1TTkFQU0hPVC1zcmMvc3JjL21haW4vYXNzZW1ibHkvIjsKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCBhc3NlbWJseURpciArICJzcmMueG1sIiApLmV4aXN0cygpOwotcmVzdWx0ID0gcmVzdWx0ICYmICFuZXcgRmlsZSggYmFzZWRpciwgYXNzZW1ibHlEaXIgKyAiLnN2biIgKS5leGlzdHMoKTsKLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kb250LXVzZS1kZWZhdWx0LWV4Y2x1ZGVzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kb250LXVzZS1kZWZhdWx0LWV4Y2x1ZGVzL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4NmQ1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnktaW5saW5lCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RvbnQtdXNlLWRlZmF1bHQtZXhjbHVkZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNiMjk1Zi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+ZG9udC11c2UtZGVmYXVsdC1leGNsdWRlczwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy9zZXR1cC5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy9zZXR1cC5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiM2JkMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RvbnQtdXNlLWRlZmF1bHQtZXhjbHVkZXMvc2V0dXAuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1GaWxlIHNyY1N2bkRpciA9IG5ldyBGaWxlKCBiYXNlZGlyLCAic3JjL21haW4vYXNzZW1ibHkvLnN2biIgKTsKLXNyY1N2bkRpci5ta2RpcnMoKTsKLQotRmlsZSBzcmNTdm5GaWxlID0gbmV3IEZpbGUoIHNyY1N2bkRpciwgImVudHJpZXMiICk7Ci0KLUZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoIHNyY1N2bkZpbGUgKTsKLXdyaXRlci53cml0ZSggIlRlc3QsIFRlc3QiICk7Ci13cml0ZXIuZmx1c2goKTsKLXdyaXRlci5jbG9zZSgpOwotCi1yZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kb250LXVzZS1kZWZhdWx0LWV4Y2x1ZGVzL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2Q2MTg0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kb250LXVzZS1kZWZhdWx0LWV4Y2x1ZGVzL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPHVzZURlZmF1bHRFeGNsdWRlcz5mYWxzZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgotICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RvbnQtdXNlLWRlZmF1bHQtZXhjbHVkZXMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RvbnQtdXNlLWRlZmF1bHQtZXhjbHVkZXMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9kb250LXVzZS1kZWZhdWx0LWV4Y2x1ZGVzL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RvbnQtdXNlLWRlZmF1bHQtZXhjbHVkZXMvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy92ZXJpZnkuZ3Jvb3Z5IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2RvbnQtdXNlLWRlZmF1bHQtZXhjbHVkZXMvdmVyaWZ5Lmdyb292eQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiODQxZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy92ZXJpZnkuZ3Jvb3Z5CisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1GaWxlIGFzc2VtYmx5RGlyID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvZG9udC11c2UtZGVmYXVsdC1leGNsdWRlcy0xLjAtU05BUFNIT1Qtc3JjL3NyYy9tYWluL2Fzc2VtYmx5IiApOwotCi1hc3NlcnQgbmV3IEZpbGUoIGFzc2VtYmx5RGlyLCAic3JjLnhtbCIgKS5leGlzdHMoKTsKLWFzc2VydCBuZXcgRmlsZSggYXNzZW1ibHlEaXIsICIuc3ZuIiApLmV4aXN0cygpOwotCi1yZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC9jaGlsZC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L2NoaWxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZmU4NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L2NoaWxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG5hbWU+Q2hpbGQ8L25hbWU+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC9jaGlsZC9zcmMvbWFpbi9yZXNvdXJjZXMvdGFyZ2V0L2ZpbGUudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L2NoaWxkL3NyYy9tYWluL3Jlc291cmNlcy90YXJnZXQvZmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0NWU2YWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L2NoaWxkL3NyYy9tYWluL3Jlc291cmNlcy90YXJnZXQvZmlsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UZXN0CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkZXMtdXNpbmctcmVnZXgvY2hpbGQvdGFyZ2V0L2NsYXNzZXMvc3JjL29taXQudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L2NoaWxkL3RhcmdldC9jbGFzc2VzL3NyYy9vbWl0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhZWFmYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkZXMtdXNpbmctcmVnZXgvY2hpbGQvdGFyZ2V0L2NsYXNzZXMvc3JjL29taXQudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGVzdApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L2NoaWxkL3RhcmdldC9vbWl0LnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC9jaGlsZC90YXJnZXQvb21pdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYWVhZmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L2NoaWxkL3RhcmdldC9vbWl0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRlc3QKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkZXMtdXNpbmctcmVnZXgvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkZXMtdXNpbmctcmVnZXgvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM4YjdiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkZXMtdXNpbmctcmVnZXgvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIAotICA8bmFtZT5QYXJlbnQ8L25hbWU+Ci0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQ8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8cnVuT25seUF0RXhlY3V0aW9uUm9vdD50cnVlPC9ydW5Pbmx5QXRFeGVjdXRpb25Sb290PgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3NyYy9hc3NlbWJsZS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3NyYy9hc3NlbWJsZS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTAwNGYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC9zcmMvYXNzZW1ibGUvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseT4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPioqLyoubG9nPC9leGNsdWRlPgotICAgICAgICA8ZXhjbHVkZT4lcmVnZXhbKD8hKCg/IXRhcmdldC8pW14vXSsvKSpzcmMvKS4qdGFyZ2V0LipdPC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvdGFyZ2V0L2ZpbGUucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L3RhcmdldC9maWxlLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNzJkMDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvdGFyZ2V0L2ZpbGUucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1UZXN0CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkZXMtdXNpbmctcmVnZXgvdGFyZ2V0L2NsYXNzZXMvc3JjL29taXQudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3RhcmdldC9jbGFzc2VzL3NyYy9vbWl0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhZWFmYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkZXMtdXNpbmctcmVnZXgvdGFyZ2V0L2NsYXNzZXMvc3JjL29taXQudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotdGVzdApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3RhcmdldC9vbWl0LnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC90YXJnZXQvb21pdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYWVhZmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3RhcmdldC9vbWl0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXRlc3QKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRlcy11c2luZy1yZWdleC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDZkMTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGVzLXVzaW5nLXJlZ2V4L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgRmlsZSBmID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvcGFyZW50LTEuMC1zcmMuamFyIiApOwotICAgIGlmICggIWYuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiamFyIGlzIG1pc3NpbmciICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBKYXJGaWxlIGpmID0gbmV3IEphckZpbGUoIGYgKTsKLSAgICBKYXJFbnRyeSBqZSA9IGpmLmdldEVudHJ5KCAicGFyZW50LTEuMC9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L3RhcmdldC9maWxlLnByb3BlcnRpZXMiICk7Ci0KLSAgICBpZiAoIGplID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAic291cmNlcyBmb3Igb3JnLnRlc3QudGFyZ2V0IHBhY2thZ2UgaW4gcGFyZW50IHByb2plY3QgYXJlIG1pc3NpbmcgZnJvbSBqYXIiICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBqZSA9IGpmLmdldEVudHJ5KCAicGFyZW50LTEuMC9jaGlsZC9zcmMvbWFpbi9yZXNvdXJjZXMvdGFyZ2V0L2ZpbGUudHh0IiApOwotCi0gICAgaWYgKCBqZSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInRhcmdldC9maWxlLnR4dCBpbiBjaGlsZCByZXNvdXJjZXMgaXMgbWlzc2luZyBmcm9tIHRoZSBqYXIuIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgamUgPSBqZi5nZXRFbnRyeSggInBhcmVudC0xLjAvdGFyZ2V0L29taXQudHh0IiApOwotCi0gICAgaWYgKCBqZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInRhcmdldC9vbWl0LnR4dCBpbiBwYXJlbnQgcHJvamVjdCB3YXMgaW5jbHVkZWQgdGhlIGphci4iICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBqZSA9IGpmLmdldEVudHJ5KCAicGFyZW50LTEuMC9jaGlsZC90YXJnZXQvb21pdC50eHQiICk7Ci0KLSAgICBpZiAoIGplICE9IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAidGFyZ2V0L29taXQudHh0IGluIGNoaWxkIHByb2plY3Qgd2FzIGluY2x1ZGVkIHRoZSBqYXIuIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgamUgPSBqZi5nZXRFbnRyeSggInBhcmVudC0xLjAvdGFyZ2V0L2NsYXNzZXMvc3JjL29taXQudHh0IiApOwotCi0gICAgaWYgKCBqZSAhPSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInRhcmdldC9jbGFzc2VzL3NyYy9vbWl0LnR4dCBpbiBwYXJlbnQgcHJvamVjdCB3YXMgaW5jbHVkZWQgdGhlIGphci4iICk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBqZSA9IGpmLmdldEVudHJ5KCAicGFyZW50LTEuMC9jaGlsZC90YXJnZXQvY2xhc3Nlcy9zcmMvb21pdC50eHQiICk7Ci0KLSAgICBpZiAoIGplICE9IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAidGFyZ2V0L2NsYXNzZXMvc3JjL29taXQudHh0IGluIGNoaWxkIHByb2plY3Qgd2FzIGluY2x1ZGVkIHRoZSBqYXIuIiApOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkaW5nLXN2bi1kaXJzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg2ZDViLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06ZGlyZWN0b3J5LWlubGluZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGluZy1zdm4tZGlycy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGluZy1zdm4tZGlycy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDMzM2UxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmV4Y2x1ZGluZy1zdm4tZGlyczwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkaW5nLXN2bi1kaXJzL3NldHVwLmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvc2V0dXAuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjNiZDA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvc2V0dXAuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1GaWxlIHNyY1N2bkRpciA9IG5ldyBGaWxlKCBiYXNlZGlyLCAic3JjL21haW4vYXNzZW1ibHkvLnN2biIgKTsKLXNyY1N2bkRpci5ta2RpcnMoKTsKLQotRmlsZSBzcmNTdm5GaWxlID0gbmV3IEZpbGUoIHNyY1N2bkRpciwgImVudHJpZXMiICk7Ci0KLUZpbGVXcml0ZXIgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIoIHNyY1N2bkZpbGUgKTsKLXdyaXRlci53cml0ZSggIlRlc3QsIFRlc3QiICk7Ci13cml0ZXIuZmx1c2goKTsKLXdyaXRlci5jbG9zZSgpOwotCi1yZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0N2E5ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZXhjbHVkaW5nLXN2bi1kaXJzL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+KiovLnN2bi8qKjwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGluZy1zdm4tZGlycy9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGluZy1zdm4tZGlycy9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGluZy1zdm4tZGlycy9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGluZy1zdm4tZGlycy9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGluZy1zdm4tZGlycy92ZXJpZnkuZ3Jvb3Z5IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2V4Y2x1ZGluZy1zdm4tZGlycy92ZXJpZnkuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDgwYjU1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9leGNsdWRpbmctc3ZuLWRpcnMvdmVyaWZ5Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotYXNzZXJ0IG5ldyBGaWxlKCBiYXNlZGlyLCAic3JjL21haW4vYXNzZW1ibHkvLnN2biIgKS5leGlzdHMoKTsKLQotRmlsZSBhc3NlbWJseURpciA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2V4Y2x1ZGluZy1zdm4tZGlycy0xLjAtU05BUFNIT1Qtc3JjL3NyYy9tYWluL2Fzc2VtYmx5IiApOwotCi1hc3NlcnQgbmV3IEZpbGUoIGFzc2VtYmx5RGlyLCAic3JjLnhtbCIgKS5leGlzdHMoKTsKLWFzc2VydCAhbmV3IEZpbGUoIGFzc2VtYmx5RGlyLCAiLnN2biIgKS5leGlzdHMoKTsKLQotcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbW9kdWxlLXNvdXJjZXMvY2hpbGQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy9jaGlsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWJjMDc2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy9jaGlsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPmNoaWxkPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAKLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy9jaGlsZC9zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbW9kdWxlLXNvdXJjZXMvY2hpbGQvc3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmFiNDVjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy9jaGlsZC9zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0ke3Byb2plY3QudmVyc2lvbn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbW9kdWxlLXNvdXJjZXMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2ZpbHRlcmVkLW1vZHVsZS1zb3VyY2VzL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2FhNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbW9kdWxlLXNvdXJjZXMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2ZpbHRlcmVkLW1vZHVsZS1zb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNmQ5ZDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2ZpbHRlcmVkLW1vZHVsZS1zb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnNpbmdsZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbW9kdWxlLXNvdXJjZXMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjRhYmQwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxtb2R1bGVTZXRzPgotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q6Y2hpbGQ8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPHNvdXJjZXM+Ci0gICAgICAgIDxmaWxlU2V0cz4KLSAgICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDwvZmlsZVNldHM+Ci0gICAgICA8L3NvdXJjZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbW9kdWxlLXNvdXJjZXMvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Mjg5ODkxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tb2R1bGUtc291cmNlcy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1GaWxlIGYgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9wYXJlbnQtMS1zcmMvY2hpbGQvdGVzdC50eHQiICk7Ci0KLWlmICggIWYuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbHRlcmVkIGZpbGUgZnJvbSBmaWxlLXNldDogIiArIGYgKyAiIGlzIG1pc3NpbmcuIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotU3RyaW5nIGxpbmUgPSBudWxsOwotCi1CdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKCBmICkgKTsKLWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLXJlYWRlci5jbG9zZSgpOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oICJGaXJzdCBsaW5lIG9mIHRlc3QudHh0OiAnIiArIGxpbmUgKyAiJyBzaG91bGQgZXF1YWwgdGhlIHByb2plY3QgdmVyc2lvbjogJzEnLiIgKTsKLQotcmV0dXJuICIxIi5lcXVhbHMoIGxpbmUudHJpbSgpICk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvY2hpbGQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tdWx0aW1vZHVsZS9jaGlsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzFkZDU5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tdWx0aW1vZHVsZS9jaGlsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPmNoaWxkPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5zaW5nbGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvY2hpbGQvc3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2ZpbHRlcmVkLW11bHRpbW9kdWxlL2NoaWxkL3NyYy9tYWluL2Fzc2VtYmx5LXJlc291cmNlcy90ZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJhYjQ1Yy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvY2hpbGQvc3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotJHtwcm9qZWN0LnZlcnNpb259ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2ZpbHRlcmVkLW11bHRpbW9kdWxlL2NoaWxkL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvY2hpbGQvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZiZmRiZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvY2hpbGQvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8ZmlsdGVyZWQ+dHJ1ZTwvZmlsdGVyZWQ+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tdWx0aW1vZHVsZS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tdWx0aW1vZHVsZS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2ZpbHRlcmVkLW11bHRpbW9kdWxlL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4YmU3ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5maWx0ZXJlZC1tdWx0aW1vZHVsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tdWx0aW1vZHVsZS9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTliOTUyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tdWx0aW1vZHVsZS9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxzY29wZT4ke3Rlc3R9PC9zY29wZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tdWx0aW1vZHVsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjU2OGMzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9maWx0ZXJlZC1tdWx0aW1vZHVsZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2ZpbHRlcmVkLW11bHRpbW9kdWxlL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ExMDBlZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvZmlsdGVyZWQtbXVsdGltb2R1bGUvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotRmlsZSBmID0gbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZC90YXJnZXQvY2hpbGQtMS1zcmMvdGVzdC50eHQiICk7Ci0KLWlmICggIWYuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbHRlcmVkIGZpbGUgZnJvbSBmaWxlLXNldDogIiArIGYgKyAiIGlzIG1pc3NpbmcuIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotU3RyaW5nIGxpbmUgPSBudWxsOwotCi1CdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBGaWxlUmVhZGVyKCBmICkgKTsKLWxpbmUgPSByZWFkZXIucmVhZExpbmUoKTsKLXJlYWRlci5jbG9zZSgpOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oICJGaXJzdCBsaW5lIG9mIHRlc3QudHh0OiAnIiArIGxpbmUgKyAiJyBzaG91bGQgZXF1YWwgdGhlIHByb2plY3QgdmVyc2lvbjogJzEnLiIgKTsKLQotcmV0dXJuICIxIi5lcXVhbHMoIGxpbmUudHJpbSgpICk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1iYXNlLWRpcmVjdG9yeS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1iYXNlLWRpcmVjdG9yeS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODZkNWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtYmFzZS1kaXJlY3RvcnkvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06ZGlyZWN0b3J5LWlubGluZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtYmFzZS1kaXJlY3RvcnkvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLWJhc2UtZGlyZWN0b3J5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTg3YmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtYmFzZS1kaXJlY3RvcnkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmluY2x1ZGUtYmFzZS1kaXJlY3Rvcnk8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtYmFzZS1kaXJlY3Rvcnkvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLWJhc2UtZGlyZWN0b3J5L3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYjE3OWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtYmFzZS1kaXJlY3Rvcnkvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+dHJ1ZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPioqLy5zdm4vKio8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1iYXNlLWRpcmVjdG9yeS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1iYXNlLWRpcmVjdG9yeS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtYmFzZS1kaXJlY3Rvcnkvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLWJhc2UtZGlyZWN0b3J5L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1iYXNlLWRpcmVjdG9yeS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLWJhc2UtZGlyZWN0b3J5L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLWJhc2UtZGlyZWN0b3J5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1iYXNlLWRpcmVjdG9yeS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2I3MTFlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLWJhc2UtZGlyZWN0b3J5L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotU3RyaW5nIGFzc2VtYmx5RGlyID0gInRhcmdldC9pbmNsdWRlLWJhc2UtZGlyZWN0b3J5LTEuMC1TTkFQU0hPVC1zcmMvaW5jbHVkZS1iYXNlLWRpcmVjdG9yeS0xLjAtU05BUFNIT1Qvc3JjL21haW4vYXNzZW1ibHkvIjsKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCBhc3NlbWJseURpciArICJzcmMueG1sIiApLmV4aXN0cygpOwotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9jaGlsZC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9jaGlsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGZkOWIyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLXBhcmVudC1kaXIvY2hpbGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmluY2x1ZGUtcGFyZW50LWRpcjwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9wYXJlbnQueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5idWlsZC1wYXJlbnQtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5kaXJlY3Rvcnktc2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9jaGlsZC9zcmMvYXNzZW1ibGUvcGFyZW50LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLXBhcmVudC1kaXIvY2hpbGQvc3JjL2Fzc2VtYmxlL3BhcmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZGY1Y2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9jaGlsZC9zcmMvYXNzZW1ibGUvcGFyZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+cGFyZW50PC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5Pi4uPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHVzZURlZmF1bHRFeGNsdWRlcz50cnVlPC91c2VEZWZhdWx0RXhjbHVkZXM+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPioqL3RhcmdldC8qKjwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLXBhcmVudC1kaXIvY2hpbGQvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9jaGlsZC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9jaGlsZC9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9jaGlsZC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9jaGlsZC9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLXBhcmVudC1kaXIvY2hpbGQvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1wYXJlbnQtZGlyL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1wYXJlbnQtZGlyL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1wYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1wYXJlbnQtZGlyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1wYXJlbnQtZGlyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMjVhMWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL2luY2x1ZGUtcGFyZW50LWRpci9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmluY2x1ZGUtcGFyZW50LWRpcjwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8bmFtZT5NYXZlbiBRdWljayBTdGFydCBBcmNoZXR5cGU8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLXBhcmVudC1kaXIvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9pbmNsdWRlLXBhcmVudC1kaXIvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU0MmYyNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvaW5jbHVkZS1wYXJlbnQtZGlyL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLXJldHVybiBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkL3RhcmdldC9jaGlsZC0xLjAtU05BUFNIT1QtcGFyZW50L2NoaWxkL3BvbS54bWwiICkuZXhpc3RzKCk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbWFzc2VtYmx5LTY2NS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbWFzc2VtYmx5LTY2NS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODA3OWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL21hc3NlbWJseS02NjUvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06c2luZ2xlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbWFzc2VtYmx5LTY2NS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL21hc3NlbWJseS02NjUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJkN2IwMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbWFzc2VtYmx5LTY2NS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTY2NTwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbWFzc2VtYmx5LTY2NS9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL21hc3NlbWJseS02NjUvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZjZDUyMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbWFzc2VtYmx5LTY2NS9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gICA8ZmlsZVNldHM+Ci0JPGZpbGVTZXQ+Ci0JCTxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YS90ZXN0PC9kaXJlY3Rvcnk+Ci0JCTxvdXRwdXREaXJlY3Rvcnk+YmluPC9vdXRwdXREaXJlY3Rvcnk+Ci0JCTxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLQkJPGluY2x1ZGVzPgotCQkJPGluY2x1ZGU+KjwvaW5jbHVkZT4KLQkJPC9pbmNsdWRlcz4KLQk8L2ZpbGVTZXQ+Ci0JPGZpbGVTZXQ+Ci0JCTxkaXJlY3Rvcnk+L3NyYy90ZXN0L2phdmEvdGVzdDwvZGlyZWN0b3J5PgotCQk8b3V0cHV0RGlyZWN0b3J5PmNvbmY8L291dHB1dERpcmVjdG9yeT4KLQkJPGluY2x1ZGVzPgotCQkJPGluY2x1ZGU+KjwvaW5jbHVkZT4KLQkJPC9pbmNsdWRlcz4KLQk8L2ZpbGVTZXQ+Ci0gICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tYXNzZW1ibHktNjY1L3NyYy90ZXN0L2phdmEvdGVzdC9hRmlsZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbWFzc2VtYmx5LTY2NS9zcmMvdGVzdC9qYXZhL3Rlc3QvYUZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDE5YTQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tYXNzZW1ibHktNjY1L3NyYy90ZXN0L2phdmEvdGVzdC9hRmlsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BIHRlc3QgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvY2hpbGQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS11bml4LWxpbmVFbmRpbmdzL2NoaWxkL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOWViYmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvY2hpbGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgICA8cmVsYXRpdmVQYXRoPi4uLy4uLy4uLy4uL2l0LXByb2plY3QtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5jaGlsZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+c2luZ2xlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvY2hpbGQvc3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvY2hpbGQvc3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2I3ZGRiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS11bml4LWxpbmVFbmRpbmdzL2NoaWxkL3NyYy9tYWluL2Fzc2VtYmx5LXJlc291cmNlcy90ZXN0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotJHtwcm9qZWN0LnZlcnNpb259Ci0ke3Byb2plY3QuYXJ0aWZhY3RJZH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtdW5peC1saW5lRW5kaW5ncy9jaGlsZC9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvY2hpbGQvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNlMmY1Zi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtdW5peC1saW5lRW5kaW5ncy9jaGlsZC9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICAgIDxsaW5lRW5kaW5nPnVuaXg8L2xpbmVFbmRpbmc+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS11bml4LWxpbmVFbmRpbmdzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS11bml4LWxpbmVFbmRpbmdzL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2FhNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtdW5peC1saW5lRW5kaW5ncy9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS11bml4LWxpbmVFbmRpbmdzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyNTYyYjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgICA8cmVsYXRpdmVQYXRoPi4uLy4uLy4uL2l0LXByb2plY3QtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5maWx0ZXJlZC1tdWx0aW1vZHVsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLSAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtdW5peC1saW5lRW5kaW5ncy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3Mvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2U5Yjk1Mi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtdW5peC1saW5lRW5kaW5ncy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxzY29wZT4ke3Rlc3R9PC9zY29wZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS11bml4LWxpbmVFbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS11bml4LWxpbmVFbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I1NjhjMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtdW5peC1saW5lRW5kaW5ncy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS11bml4LWxpbmVFbmRpbmdzL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MWE4ZTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXVuaXgtbGluZUVuZGluZ3MvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotRmlsZSBmID0gbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZC90YXJnZXQvY2hpbGQtMS1zcmMvdGVzdC50eHQiICk7Ci0KLWlmICggIWYuZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkZpbHRlcmVkIGZpbGUgZnJvbSBmaWxlLXNldDogIiArIGYgKyAiIGlzIG1pc3NpbmcuIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi1GaWxlUmVhZGVyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCBmICk7Ci1jaGFyW10gY2J1ZiA9IG5ldyBjaGFyWzE2XTsKLWludCByZWFkID0gLTE7Ci13aGlsZSggKCByZWFkID0gcmVhZGVyLnJlYWQoIGNidWYgKSApID4gLTEgKQotewotICAgIHNiLmFwcGVuZCggY2J1ZiwgMCwgcmVhZCApOwotfQotCi1yZWFkZXIuY2xvc2UoKTsKLQotU3lzdGVtLm91dC5wcmludGxuKCAiQ29udGVudHMgb2YgdGVzdC50eHQ6ICciICsgc2IudG9TdHJpbmcoKSArICInIHNob3VsZCBjb250YWluIHRoZSB1bml4IG5ld2xpbmU6ICdcXG4nLiIgKTsKLQotaWYgKCBzYi50b1N0cmluZygpLmluZGV4T2YoICIxXG5jaGlsZCIgKSA9PSAtMSApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAidGVzdC50eHQgaGFzIHdyb25nIGxpbmUgZW5kaW5nIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLWlmICggc2IudG9TdHJpbmcoKS5pbmRleE9mKCAiY2hpbGRcbiIgKSA+IC0xICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJ0ZXN0LnR4dCBoYXMgYW4gZXh0cmEgbGluZSBlbmRpbmcgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZSIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci1yZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvY2hpbGQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvY2hpbGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMxZGQ1OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtd2luLWxpbmVFbmRpbmdzL2NoaWxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGFydGlmYWN0SWQ+Y2hpbGQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnNpbmdsZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvY2hpbGQvc3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXdpbi1saW5lRW5kaW5ncy9jaGlsZC9zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjdkZGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXdpbi1saW5lRW5kaW5ncy9jaGlsZC9zcmMvbWFpbi9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyICswLDAgQEAKLSR7cHJvamVjdC52ZXJzaW9ufQotJHtwcm9qZWN0LmFydGlmYWN0SWR9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXdpbi1saW5lRW5kaW5ncy9jaGlsZC9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXdpbi1saW5lRW5kaW5ncy9jaGlsZC9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU3NmY0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvY2hpbGQvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vYXNzZW1ibHktcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICA8ZmlsdGVyZWQ+dHJ1ZTwvZmlsdGVyZWQ+Ci0gICAgICA8bGluZUVuZGluZz5jcmxmPC9saW5lRW5kaW5nPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtd2luLWxpbmVFbmRpbmdzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1NjJiMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtd2luLWxpbmVFbmRpbmdzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgPHJlbGF0aXZlUGF0aD4uLi8uLi8uLi9pdC1wcm9qZWN0LXBhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gIDwvcGFyZW50PgotICAKLSAgPGFydGlmYWN0SWQ+ZmlsdGVyZWQtbXVsdGltb2R1bGUtcGFyZW50PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXdpbi1saW5lRW5kaW5ncy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL211bHRpbW9kdWxlLXdpbi1saW5lRW5kaW5ncy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTliOTUyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3Mvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8c2NvcGU+JHt0ZXN0fTwvc2NvcGU+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtd2luLWxpbmVFbmRpbmdzL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjU2OGMzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3Mvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9tdWx0aW1vZHVsZS13aW4tbGluZUVuZGluZ3MvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmRmYWU2ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvbXVsdGltb2R1bGUtd2luLWxpbmVFbmRpbmdzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgZiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQvdGFyZ2V0L2NoaWxkLTEtc3JjL3Rlc3QudHh0IiApOwotCi1pZiAoICFmLmV4aXN0cygpICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGaWx0ZXJlZCBmaWxlIGZyb20gZmlsZS1zZXQ6ICIgKyBmICsgIiBpcyBtaXNzaW5nLiIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotRmlsZVJlYWRlciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlciggZiApOwotY2hhcltdIGNidWYgPSBuZXcgY2hhclsxNl07Ci1pbnQgcmVhZCA9IC0xOwotd2hpbGUoICggcmVhZCA9IHJlYWRlci5yZWFkKCBjYnVmICkgKSA+IC0xICkKLXsKLSAgICBzYi5hcHBlbmQoIGNidWYsIDAsIHJlYWQgKTsKLX0KLQotcmVhZGVyLmNsb3NlKCk7Ci0KLVN5c3RlbS5vdXQucHJpbnRsbiggIkNvbnRlbnRzIG9mIHRlc3QudHh0OiAnIiArIHNiLnRvU3RyaW5nKCkgKyAiJyBzaG91bGQgY29udGFpbiB0aGUgd2luZG93cyBuZXdsaW5lOiAnXFxyXFxuJy4iICk7Ci0KLWlmICggc2IudG9TdHJpbmcoKS5pbmRleE9mKCAiMVxyXG5jaGlsZCIgKSA9PSAtMSApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAidGVzdC50eHQgaGFzIHdyb25nIGxpbmUgZW5kaW5nIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLWlmICggc2IudG9TdHJpbmcoKS5pbmRleE9mKCAiY2hpbGRcclxuIiApID4gLTEgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggInRlc3QudHh0IGhhcyBhbiBleHRyYSBsaW5lIGVuZGluZyBhdCB0aGUgZW5kIG9mIHRoZSBmaWxlIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3BsYXRmb3Jtc3BlY2lmaWMtZmlsZXNldHMvYWRpci9lbXB0eWZpbGUudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3BsYXRmb3Jtc3BlY2lmaWMtZmlsZXNldHMvYWRpci9lbXB0eWZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wbGF0Zm9ybXNwZWNpZmljLWZpbGVzZXRzL2FkaXIvZW1wdHlmaWxlLnR4dAorKysgL2Rldi9udWxsCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcGxhdGZvcm1zcGVjaWZpYy1maWxlc2V0cy9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcGxhdGZvcm1zcGVjaWZpYy1maWxlc2V0cy9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyODA3OWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3BsYXRmb3Jtc3BlY2lmaWMtZmlsZXNldHMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06c2luZ2xlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcGxhdGZvcm1zcGVjaWZpYy1maWxlc2V0cy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3BsYXRmb3Jtc3BlY2lmaWMtZmlsZXNldHMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJmZDJiZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcGxhdGZvcm1zcGVjaWZpYy1maWxlc2V0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGxhdGZvcm0tc3BlY2lmaWMtZmlsZXNldHM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3BsYXRmb3Jtc3BlY2lmaWMtZmlsZXNldHMvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wbGF0Zm9ybXNwZWNpZmljLWZpbGVzZXRzL3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZmQwYzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3BsYXRmb3Jtc3BlY2lmaWMtZmlsZXNldHMvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+YWRpcjwvZGlyZWN0b3J5PgotICAgIDwvZmlsZVNldD4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+L2FkaXI8L2RpcmVjdG9yeT4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PmM6XGFkaXI8L2RpcmVjdG9yeT4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3BsYXRmb3Jtc3BlY2lmaWMtZmlsZXNldHMvdmVyaWZ5Lmdyb292eSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wbGF0Zm9ybXNwZWNpZmljLWZpbGVzZXRzL3ZlcmlmeS5ncm9vdnkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMzZkODguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3BsYXRmb3Jtc3BlY2lmaWMtZmlsZXNldHMvdmVyaWZ5Lmdyb292eQorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1GaWxlIGFzc2VtYmx5RGlyID0gbmV3IEZpbGUoIGJhc2VkaXIsICJidWlsZC5sb2ciICk7Ci1TdHJpbmcgYnVpbGRPdXRwdXQgID0gb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlscy5maWxlUmVhZChhc3NlbWJseURpcikKLXJldHVybiBidWlsZE91dHB1dC5jb250YWlucygiYXNzZW1ibHkgZGVzY3JpcHRvciBjb250YWlucyBhIik7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcHJlY2VkZW5jZS1jaGVjay9lbXB0eWZpbGUudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3ByZWNlZGVuY2UtY2hlY2svZW1wdHlmaWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZGUyOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcHJlY2VkZW5jZS1jaGVjay9lbXB0eWZpbGUudHh0CisrKyAvZGV2L251bGwKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wcmVjZWRlbmNlLWNoZWNrL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wcmVjZWRlbmNlLWNoZWNrL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY4NmQ1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcHJlY2VkZW5jZS1jaGVjay9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnktaW5saW5lCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcHJlY2VkZW5jZS1jaGVjay9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3ByZWNlZGVuY2UtY2hlY2svcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFjNzkxMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcHJlY2VkZW5jZS1jaGVjay9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+ZXhjbHVkaW5nLXN2bi1kaXJzPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wcmVjZWRlbmNlLWNoZWNrL3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcHJlY2VkZW5jZS1jaGVjay9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTRmZDEzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wcmVjZWRlbmNlLWNoZWNrL3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVzPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT5lbXB0eWZpbGUudHh0PC9zb3VyY2U+Ci0gICAgICA8ZGVzdE5hbWU+ZnVkLnR4dDwvZGVzdE5hbWU+Ci0gICAgPC9maWxlPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT5zcmMueG1sPC9zb3VyY2U+Ci0gICAgICA8ZGVzdE5hbWU+ZnVkLnR4dDwvZGVzdE5hbWU+Ci0gICAgPC9maWxlPgotICA8L2ZpbGVzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wcmVjZWRlbmNlLWNoZWNrL3ZlcmlmeS5ncm9vdnkgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvcHJlY2VkZW5jZS1jaGVjay92ZXJpZnkuZ3Jvb3Z5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjY2YjE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy9wcmVjZWRlbmNlLWNoZWNrL3ZlcmlmeS5ncm9vdnkKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotRmlsZSBhc3NlbWJseURpciA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2V4Y2x1ZGluZy1zdm4tZGlycy0xLjAtU05BUFNIT1Qtc3JjL2Z1ZC50eHQiICk7Ci0KLWFzc2VydCBhc3NlbWJseURpci5sZW5ndGgoICApID09IDA7Ci1yZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy91c2UtZGVmYXVsdC1leGNsdWRlcy9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg2ZDViLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy91c2UtZGVmYXVsdC1leGNsdWRlcy9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnktaW5saW5lCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy91c2UtZGVmYXVsdC1leGNsdWRlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTU1MmU2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy91c2UtZGVmYXVsdC1leGNsdWRlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+dXNlLWRlZmF1bHQtZXhjbHVkZXM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3VzZS1kZWZhdWx0LWV4Y2x1ZGVzL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY4MjljYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KLSAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy91c2UtZGVmYXVsdC1leGNsdWRlcy9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGUtc2V0cy91c2UtZGVmYXVsdC1leGNsdWRlcy9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3VzZS1kZWZhdWx0LWV4Y2x1ZGVzL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZS1zZXRzL3VzZS1kZWZhdWx0LWV4Y2x1ZGVzL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY0YzhlYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlLXNldHMvdXNlLWRlZmF1bHQtZXhjbHVkZXMvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi1TdHJpbmcgYXNzZW1ibHlEaXIgPSAidGFyZ2V0L3VzZS1kZWZhdWx0LWV4Y2x1ZGVzLTEuMC1TTkFQU0hPVC1zcmMvc3JjL21haW4vYXNzZW1ibHkvIjsKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCBhc3NlbWJseURpciArICJzcmMueG1sIiApLmV4aXN0cygpOwotcmVzdWx0ID0gcmVzdWx0ICYmICFuZXcgRmlsZSggYmFzZWRpciwgYXNzZW1ibHlEaXIgKyAiLnN2biIgKS5leGlzdHMoKTsKLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL2ZpbHRlcmVkLXN5c3Byb3AvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL2ZpbHRlcmVkLXN5c3Byb3AvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDc5NWZiZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9maWx0ZXJlZC1zeXNwcm9wL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIAotICA8bmFtZT5QYXJlbnQ8L25hbWU+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvZmlsdGVyZWQtc3lzcHJvcC9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL2ZpbHRlcmVkLXN5c3Byb3Avc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYTliZmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvZmlsdGVyZWQtc3lzcHJvcC9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZXM+Ci0gICAgPGZpbGU+Ci0gICAgICA8c291cmNlPnNyYy9jb25maWcvYS9maWx0ZXJlZC50eHQ8L3NvdXJjZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGZpbHRlcmVkPnRydWU8L2ZpbHRlcmVkPgotICAgIDwvZmlsZT4KLSAgPC9maWxlcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9maWx0ZXJlZC1zeXNwcm9wL3NyYy9jb25maWcvYS9maWx0ZXJlZC50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9maWx0ZXJlZC1zeXNwcm9wL3NyYy9jb25maWcvYS9maWx0ZXJlZC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGY4NGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvZmlsdGVyZWQtc3lzcHJvcC9zcmMvY29uZmlnL2EvZmlsdGVyZWQudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotT1MgVmVyc2lvbjogJHtvcy52ZXJzaW9ufQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL2ZpbHRlcmVkLXN5c3Byb3AvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL2ZpbHRlcmVkLXN5c3Byb3AvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU3NjRlZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9maWx0ZXJlZC1zeXNwcm9wL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLXRyeQotewotICBTdHJpbmcgb3NWZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCAib3MudmVyc2lvbiIgKTsKLSAgRmlsZSBhID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvcGFyZW50LTEuMC1iaW4vYS9maWx0ZXJlZC50eHQiKTsKLSAgCi0gIEJ1ZmZlcmVkUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYSkpOwotICBTdHJpbmcgbGluZSA9IHIucmVhZExpbmUoKTsKLSAgaWYgKCAhIGxpbmUuZW5kc1dpdGgoIG9zVmVyc2lvbiApICkKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkV4cGVjdGVkIE9TIHZlcnNpb246ICIgKyBvc1ZlcnNpb24gKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMaW5lIHdhczogIiArIGxpbmUgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotfQotCi1yZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL211bHRpbW9kdWxlLXJlbGF0aXZlUGF0aC9hLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9tdWx0aW1vZHVsZS1yZWxhdGl2ZVBhdGgvYS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTBhY2E1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL211bHRpbW9kdWxlLXJlbGF0aXZlUGF0aC9hLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotdGVzdFByb3A9Ym9vCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9tdWx0aW1vZHVsZS1yZWxhdGl2ZVBhdGgvY2hpbGQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL211bHRpbW9kdWxlLXJlbGF0aXZlUGF0aC9jaGlsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjJlZjI1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL211bHRpbW9kdWxlLXJlbGF0aXZlUGF0aC9jaGlsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPmNoaWxkPC9hcnRpZmFjdElkPgotICA8bmFtZT5DaGlsZDwvbmFtZT4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL211bHRpbW9kdWxlLXJlbGF0aXZlUGF0aC9jaGlsZC9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL211bHRpbW9kdWxlLXJlbGF0aXZlUGF0aC9jaGlsZC9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjJjZDc5MS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9tdWx0aW1vZHVsZS1yZWxhdGl2ZVBhdGgvY2hpbGQvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGZpbGVzPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT5zcmMvY29uZmlnL2EvZmlsZS50eHQ8L3NvdXJjZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YTwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDwvZmlsZT4KLSAgPC9maWxlcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9tdWx0aW1vZHVsZS1yZWxhdGl2ZVBhdGgvY2hpbGQvc3JjL2NvbmZpZy9hL2ZpbGUudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvbXVsdGltb2R1bGUtcmVsYXRpdmVQYXRoL2NoaWxkL3NyYy9jb25maWcvYS9maWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMwMWMzYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9tdWx0aW1vZHVsZS1yZWxhdGl2ZVBhdGgvY2hpbGQvc3JjL2NvbmZpZy9hL2ZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMiArMCwwIEBACi1maWxlIEEKLSR7dGVzdFByb3B9CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9tdWx0aW1vZHVsZS1yZWxhdGl2ZVBhdGgvY2hpbGQvc3JjL2NvbmZpZy9iL2ZpbGUudHh0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvbXVsdGltb2R1bGUtcmVsYXRpdmVQYXRoL2NoaWxkL3NyYy9jb25maWcvYi9maWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZjNjA2Zi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWxlcy9tdWx0aW1vZHVsZS1yZWxhdGl2ZVBhdGgvY2hpbGQvc3JjL2NvbmZpZy9iL2ZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1maWxlIEIKLSR7dGVzdFByb3B9Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL211bHRpbW9kdWxlLXJlbGF0aXZlUGF0aC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvbXVsdGltb2R1bGUtcmVsYXRpdmVQYXRoL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4YzU0YjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvbXVsdGltb2R1bGUtcmVsYXRpdmVQYXRoL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIAotICA8bmFtZT5QYXJlbnQ8L25hbWU+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbGVzL211bHRpbW9kdWxlLXJlbGF0aXZlUGF0aC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvbXVsdGltb2R1bGUtcmVsYXRpdmVQYXRoL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlZWM1NzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsZXMvbXVsdGltb2R1bGUtcmVsYXRpdmVQYXRoL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgYSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQvdGFyZ2V0L2NoaWxkLTEuMC1iaW4vYS9maWxlLnR4dCIpOwotCi1pZiAoICFhLmV4aXN0cygpIHx8ICFhLmlzRmlsZSgpICkKLXsKLSAgU3lzdGVtLm91dC5wcmludGxuKCAiTWlzc2luZyB0ZXN0IGZpbGU6ICIgKyBhICk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWxlc2V0LXRvLXRhci1tYXNzZW1ibHktNzIyL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjJhM2JhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2JlYzYxMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWxlc2V0LXRvLXRhci1tYXNzZW1ibHktNzIyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiDQotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPg0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgPHBhcmVudD4NCi0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+DQotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+DQotICA8L3BhcmVudD4NCi0gIDxncm91cElkPmNvbS5jcmVnZ2FubmEuc2FtcGxlczwvZ3JvdXBJZD4NCi0gIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLjUtY3Jhc2g8L2FydGlmYWN0SWQ+DQotICA8dmVyc2lvbj4wLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gIA0KLSAgPGJ1aWxkPg0KLSAgICAgIA0KLSAgICAgIDxmaWx0ZXJzPg0KLSAgICAgICAgICA8ZmlsdGVyPnNyYy9tYWluL2ZpbHRlcnMvdGVzdC5wcm9wZXJ0aWVzPC9maWx0ZXI+DQotICAgICAgPC9maWx0ZXJzPg0KLSAgDQotICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgIDxwbHVnaW4+DQotICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICA8aWQ+cHJvZC1hc3NlbWJsZTwvaWQ+DQotICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4NCi0gICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPjxnb2FsPnNpbmdsZTwvZ29hbD48L2dvYWxzPg0KLSAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+c3JjL21haW4vYXNzZW1ibGllcy9wcm9kLWFzc2VtYmxlLnhtbDwvZGVzY3JpcHRvcnM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+DQotICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+DQotICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgIDwvcGx1Z2lucz4NCi0gIDwvYnVpbGQ+DQotICANCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsZXNldC10by10YXItbWFzc2VtYmx5LTcyMi9zcmMvbWFpbi9hc3NlbWJsaWVzL3Byb2QtYXNzZW1ibGUueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsZXNldC10by10YXItbWFzc2VtYmx5LTcyMi9zcmMvbWFpbi9hc3NlbWJsaWVzL3Byb2QtYXNzZW1ibGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1N2Y1OTIyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvc3JjL21haW4vYXNzZW1ibGllcy9wcm9kLWFzc2VtYmxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiINCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjIueHNkIj4NCi0gICAgPGlkPnByb2Q8L2lkPg0KLSAgICA8Zm9ybWF0cz4NCi0gICAgICAgIDxmb3JtYXQ+dGFyPC9mb3JtYXQ+DQotICAgIDwvZm9ybWF0cz4NCi0gICAgPGZpbGVTZXRzPg0KLSAgICAgICAgPGZpbGVTZXQ+DQotICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9maWx0ZXJlZC1jb25maWc8L2RpcmVjdG9yeT4NCi0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9jb25maWc8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgICAgICA8ZmlsdGVyZWQ+dHJ1ZTwvZmlsdGVyZWQ+DQotICAgICAgICA8L2ZpbGVTZXQ+DQotICAgIDwvZmlsZVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWxlc2V0LXRvLXRhci1tYXNzZW1ibHktNzIyL3NyYy9tYWluL2ZpbHRlcmVkLWNvbmZpZy9teS5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsZXNldC10by10YXItbWFzc2VtYmx5LTcyMi9zcmMvbWFpbi9maWx0ZXJlZC1jb25maWcvbXkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzdjOWQ4OC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWxlc2V0LXRvLXRhci1tYXNzZW1ibHktNzIyL3NyYy9tYWluL2ZpbHRlcmVkLWNvbmZpZy9teS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotIw0KLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0jDQotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0jIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQ0KLSMgSW4gbWF2ZW4tYXNzZW1ibHktcGx1Z2luOjIuNC4xDQotIwlPbiBGaWx0ZXJpbmcgZHVyaW5nIGFzc2VtYmx5IHRoZSBlbnZpcm9ubWVudCBpcyAidGVzdC1lbnZpcm9ubWVudCIgc2hvd2luZyB0aGF0IHRoZQ0KLSMJcHJvamVjdC5idWlsZC5maWx0ZXJzIGhhdmUgYmVlbiBhcHBsaWVkLg0KLSMgV2l0aCB0aGUgcGF0Y2ggdGhlIGVudmlyb25tZW50IHRoZW4gYmVjb21lcyB0aGUgZGVzaXJlZCAicHJvZC1lbnZpcm9ubWVudCINCi1lbnZpcm9ubWVudD0ke2ZpbHRlcmVkLmVudmlyb25tZW50fQ0KLXZhbHVlLnRlc3Q9JHtmaWx0ZXJlZC50ZXN0fQ0KLXZhbHVlLnByb2Q9JHtmaWx0ZXJlZC5wcm9kfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvc3JjL21haW4vZmlsdGVycy9wcm9kLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWxlc2V0LXRvLXRhci1tYXNzZW1ibHktNzIyL3NyYy9tYWluL2ZpbHRlcnMvcHJvZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZmVlNWVkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvc3JjL21haW4vZmlsdGVycy9wcm9kLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZmlsdGVyZWQuZW52aXJvbm1lbnQ9cHJvZC1lbnZpcm9ubWVudA0KLWZpbHRlcmVkLnByb2Q9cHJvZC52YWx1ZQ0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvc3JjL21haW4vZmlsdGVycy90ZXN0LnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWxlc2V0LXRvLXRhci1tYXNzZW1ibHktNzIyL3NyYy9tYWluL2ZpbHRlcnMvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZTAzMmMwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbGVzZXQtdG8tdGFyLW1hc3NlbWJseS03MjIvc3JjL21haW4vZmlsdGVycy90ZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0jDQotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSMNCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSMgdW5kZXIgdGhlIExpY2Vuc2UuDQotDQotZmlsdGVyZWQuZW52aXJvbm1lbnQ9dGVzdC1lbnZpcm9ubWVudA0KLWZpbHRlcmVkLnRlc3Q9dGVzdC52YWx1ZQ0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlci1jb21wLWRlc2NyaXB0b3ItcGF0aC9hc3NlbWJseS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXItY29tcC1kZXNjcmlwdG9yLXBhdGgvYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODY4YTljLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlci1jb21wLWRlc2NyaXB0b3ItcGF0aC9hc3NlbWJseS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmZpbHRlcmVkLWFzc2VtYmx5PC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8Y29tcG9uZW50RGVzY3JpcHRvcnM+Ci0gICAgPCEtLSBOZWVkcyB0byBiZSBpbnRlcnBvbGF0ZWQgYmVmb3JlIGFjdHVhbCByZXNvbHV0aW9uIC0tPgotICAgIDxjb21wb25lbnREZXNjcmlwdG9yPiR7cHJvamVjdC5iYXNlZGlyfS9jb21wb25lbnQueG1sPC9jb21wb25lbnREZXNjcmlwdG9yPgotICA8L2NvbXBvbmVudERlc2NyaXB0b3JzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlci1jb21wLWRlc2NyaXB0b3ItcGF0aC9jb21wb25lbnQueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyLWNvbXAtZGVzY3JpcHRvci1wYXRoL2NvbXBvbmVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5Y2RlOGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyLWNvbXAtZGVzY3JpcHRvci1wYXRoL2NvbXBvbmVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08Y29tcG9uZW50PgotICA8ZmlsZXM+Ci0gICAgPGZpbGU+Ci0gICAgICA8c291cmNlPnBvbS54bWw8L3NvdXJjZT4KLSAgICA8L2ZpbGU+Ci0gIDwvZmlsZXM+Ci08L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlci1jb21wLWRlc2NyaXB0b3ItcGF0aC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXItY29tcC1kZXNjcmlwdG9yLXBhdGgvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA4OTM1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlci1jb21wLWRlc2NyaXB0b3ItcGF0aC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTphc3NlbWJseQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyLWNvbXAtZGVzY3JpcHRvci1wYXRoL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXItY29tcC1kZXNjcmlwdG9yLXBhdGgvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQyYWVhMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXItY29tcC1kZXNjcmlwdG9yLXBhdGgvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+dGVzdDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8bmFtZT5UZXN0PC9uYW1lPgotICAKLSAgPCEtLQotICBWZXJpZnkgdGhhdCB0aGUgPGNvbXBvbmVudERlc2NyaXB0b3I+IGVsZW1lbnRzIG9mIGFuIGFzc2VtYmx5IGRlc2NyaXB0b3IgZ2V0IGludGVycG9sYXRlZCBiZWZvcmUgcmVzb2x1dGlvbgotICBvZiB0aGUgY29tcG9uZW50IGRlc2NyaXB0b3IgaXMgYXR0ZW1wdGVkIChNQVNTRU1CTFktNDg2KS4KLSAgLS0+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+YXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlci1jb21wLWRlc2NyaXB0b3ItcGF0aC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyLWNvbXAtZGVzY3JpcHRvci1wYXRoL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5Nzg0N2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyLWNvbXAtZGVzY3JpcHRvci1wYXRoL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUgZmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3Rlc3QtMS4wLWZpbHRlcmVkLWFzc2VtYmx5L3BvbS54bWwiICk7Ci1pZiAoICFmaWxlLmlzRmlsZSgpICkKLXsKLSAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCAiTWlzc2luZzogIiArIGZpbGUgKTsKLX0KLQotcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVycy1kZWZpbmVkLWluLWJ1aWxkL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmNDk2Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDcxMjkxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPmZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgCi0gIDxidWlsZD4KLSAgICA8ZmlsdGVycz4KLSAgICAgIDxmaWx0ZXI+JHtiYXNlZGlyfS9zcmMvbWFpbi9maWx0ZXJzL2ZpbHRlci1idWlsZC5wcm9wZXJ0aWVzPC9maWx0ZXI+Ci0gICAgPC9maWx0ZXJzPgotCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7YmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvZGVzY3JpcHRvci54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICA8ZXNjYXBlU3RyaW5nPlw8L2VzY2FwZVN0cmluZz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnNpbmdsZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLSAgPHByb3BlcnRpZXM+Ci0gICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+SVNPLTg4NTktMTwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgPC9wcm9wZXJ0aWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVycy1kZWZpbmVkLWluLWJ1aWxkL3NyYy9tYWluL2Fzc2VtYmx5L2Rlc2NyaXB0b3IueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVycy1kZWZpbmVkLWluLWJ1aWxkL3NyYy9tYWluL2Fzc2VtYmx5L2Rlc2NyaXB0b3IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWVjMjdhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC9zcmMvbWFpbi9hc3NlbWJseS9kZXNjcmlwdG9yLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotCi0gIDxpZD5hc3NlbWJseTwvaWQ+Ci0KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLQotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vY29uZmlnPC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGxpbmVFbmRpbmc+dW5peDwvbGluZUVuZGluZz4KLSAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci0KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvc3JjL21haW4vY29uZmlnL2ZpbGUtMS5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVycy1kZWZpbmVkLWluLWJ1aWxkL3NyYy9tYWluL2NvbmZpZy9maWxlLTEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNkNGQ0NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvc3JjL21haW4vY29uZmlnL2ZpbGUtMS5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi10ZXN0LmJ1aWxkLmZpbHRlci5wcm9wcy4xPSR7ZmlsdGVyLmJ1aWxkfQotZXNjYXBlZFN0cmluZz1cJHtwcm9qZWN0LmFydGlmYWN0SWR9Ci1ub24uYXNjaWkuY2hhcmFjdGVycz1zb21lIGNoYXJhY3RlcnMg5eT2Ci10ZXN0LmFzc2VtYmx5LmZpbHRlci5wcm9wcy4xPSR7ZmlsdGVyLmFzc2VtYmx5fQotdGVzdC5wb20ucHJvcHMuMT0ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LiR7cHJvamVjdC5wYWNrYWdpbmd9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVycy1kZWZpbmVkLWluLWJ1aWxkL3NyYy9tYWluL2NvbmZpZy9maWxlLTIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC9zcmMvbWFpbi9jb25maWcvZmlsZS0yLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZGU3MDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVycy1kZWZpbmVkLWluLWJ1aWxkL3NyYy9tYWluL2NvbmZpZy9maWxlLTIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi10ZXN0LmJ1aWxkLmZpbHRlci5wcm9wcy4yPSR7ZmlsdGVyLmJ1aWxkfQotdGVzdC5hc3NlbWJseS5maWx0ZXIucHJvcHMuMj0ke2ZpbHRlci5hc3NlbWJseX0KLXRlc3QucG9tLnByb3BzLjI9JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS4ke3Byb2plY3QucGFja2FnaW5nfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVycy1kZWZpbmVkLWluLWJ1aWxkL3NyYy9tYWluL2ZpbHRlcnMvZmlsdGVyLWFzc2VtYmx5LnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvc3JjL21haW4vZmlsdGVycy9maWx0ZXItYXNzZW1ibHkucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I0Njc2OC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvc3JjL21haW4vZmlsdGVycy9maWx0ZXItYXNzZW1ibHkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1maWx0ZXIuYXNzZW1ibHk9RmlsdGVyIGRlZmluZWQgaW4gdGhlIEFzc2VtYmx5IHBsdWdpbidzIGNvbmZpZ3VyYXRpb24uCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvc3JjL21haW4vZmlsdGVycy9maWx0ZXItYnVpbGQucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC9zcmMvbWFpbi9maWx0ZXJzL2ZpbHRlci1idWlsZC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNGRkMGEzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC9zcmMvbWFpbi9maWx0ZXJzL2ZpbHRlci1idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZpbHRlci5idWlsZD1GaWx0ZXIgZGVmaW5lZCBpbiB0aGUgcHJvamVjdHMnIGJ1aWxkIHNlY3Rpb24uCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDI5ZWRmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi10cnkKLXsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQtMS9maWxlLTEucHJvcGVydGllcyIpOwotICAgIC8vIFRoaXMgaXMgYSBwcm9wZXJ0aWVzIGZpbGUgZW5jb2RlZCB1c2luZyBJU08tODg1OS0xCi0gICAgQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKCBuZXcgRmlsZUlucHV0U3RyZWFtKCBmaWxlICksICJJU08tODg1OS0xIiApICk7Ci0gICAgU3RyaW5nIHMgPSByLnJlYWRMaW5lKCk7Ci0gICAgaWYocy5jb250YWlucygiZmlsdGVyLmJ1aWxkIikpCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbGUtMS5wcm9wZXJ0aWVzIHdhcyBub3QgZmlsdGVyZWQiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzID0gci5yZWFkTGluZSgpOwotICAgIGlmKCFzLmNvbnRhaW5zKCJlc2NhcGVkU3RyaW5nPSR7cHJvamVjdC5hcnRpZmFjdElkfSIpKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaWxlLTEucHJvcGVydGllcyBkaWQgbm90IGVzY2FwZSBmaWx0ZXJpbmciKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzID0gci5yZWFkTGluZSgpOwotICAgIGlmKCFzLmNvbnRhaW5zKCLDpcOkw7YiKSkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmlsZS0xLnByb3BlcnRpZXMgaGFzIGNvcnJ1cHRlZCBub24gYXNjaWkgY2hhcmFjdGVycyIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2ZpbHRlcnMtZGVmaW5lZC1pbi1idWlsZC0xL2ZpbGUtMi5wcm9wZXJ0aWVzIik7Ci0gICAgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0gICAgcyA9IHIucmVhZExpbmUoKTsKLSAgICBpZihzLmNvbnRhaW5zKCJmaWx0ZXIuYnVpbGQiKSkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmlsZS0yLnByb3BlcnRpZXMgd2FzIG5vdCBmaWx0ZXJlZCIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvZmlsdGVyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvZmlsdGVyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODkwNmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyc0RlZmluZWRJbkFzc2VtYmx5UGx1Z2luQ29uZmlnL2ZpbHRlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLXRlc3QucHJvcGVydGllcz1mb28KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnNEZWZpbmVkSW5Bc3NlbWJseVBsdWdpbkNvbmZpZy9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzA4OTM1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnNEZWZpbmVkSW5Bc3NlbWJseVBsdWdpbkNvbmZpZy9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTphc3NlbWJseQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyc0RlZmluZWRJbkFzc2VtYmx5UGx1Z2luQ29uZmlnL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYwOTgxNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDxuYW1lPlBhcmVudDwvbmFtZT4KLQotCi0gIDwhLS0gUHVycG9zZSBvZiB0aGlzIGludGVncmF0aW9uIHRlc3Q6IHZlcmlmeSB0aGF0IGZpbHRlcnMgY2FuIGJlIGRlZmluZWQgd2l0aGluIHRoZSBwbHVnaW4gY29uZmlndXJhdGlvbiAtLT4KLSAgPCEtLSAoc2VlIE1BU1NFTUJMWS0yMjYgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24pLS0+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgPGZpbHRlcnM+Ci0gICAgICAgICAgICA8ZmlsdGVyPmZpbHRlci5wcm9wZXJ0aWVzPC9maWx0ZXI+Ci0gICAgICAgICAgPC9maWx0ZXJzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMDdiNTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyc0RlZmluZWRJbkFzc2VtYmx5UGx1Z2luQ29uZmlnL3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5maWx0ZXJlZC1hc3NlbWJseTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZXM+Ci0gICAgPGZpbGU+Ci0gICAgICA8c291cmNlPnNyYy9jb25maWcvZmlsZS50eHQ8L3NvdXJjZT4KLSAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICA8L2ZpbGU+Ci0gIDwvZmlsZXM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvZmlsdGVyc0RlZmluZWRJbkFzc2VtYmx5UGx1Z2luQ29uZmlnL3NyYy9jb25maWcvZmlsZS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvc3JjL2NvbmZpZy9maWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRmMmM4Zi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvc3JjL2NvbmZpZy9maWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotJHt0ZXN0LnByb3BlcnRpZXN9Ci1cJHtwcm9qZWN0LmFydGlmYWN0SWR9CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9maWx0ZXJzRGVmaW5lZEluQXNzZW1ibHlQbHVnaW5Db25maWcvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnNEZWZpbmVkSW5Bc3NlbWJseVBsdWdpbkNvbmZpZy92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjBkOTM2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL2ZpbHRlcnNEZWZpbmVkSW5Bc3NlbWJseVBsdWdpbkNvbmZpZy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtZmlsdGVyZWQtYXNzZW1ibHkvZmlsZS50eHQiKTsKLSAgICBpZihyZXN1bHQpIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlKSk7Ci0gICAgICAgIFN0cmluZyBzID0gci5yZWFkTGluZSgpOwotICAgICAgICByZXN1bHQgPSBzLmVxdWFscygiZm9vIik7Ci0gICAgICAgIGlmKHJlc3VsdCkgewotICAgICAgICAgICAgcyA9IHIucmVhZExpbmUoKTsKLSAgICAgICAgICAgIGlmKCFzLmNvbnRhaW5zKCJcXCIpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmlsZS50eHQgZXNjYXBlZCBmaWx0ZXJpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL21hc3NlbWJseS03MzYvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvbWFzc2VtYmx5LTczNi9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllZjQ5NjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvbWFzc2VtYmx5LTczNi9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL21hc3NlbWJseS03MzYvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL21hc3NlbWJseS03MzYvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwOTMzNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGFydGlmYWN0SWQ+ZmlsdGVycy1kZWZpbmVkLWluLWJ1aWxkPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAKLSAgPGJ1aWxkPgotICAgIDxmaWx0ZXJzPgotICAgICAgPGZpbHRlcj4ke2Jhc2VkaXJ9L3NyYy9tYWluL2ZpbHRlcnMvZmlsdGVyLWJ1aWxkLnByb3BlcnRpZXM8L2ZpbHRlcj4KLSAgICA8L2ZpbHRlcnM+Ci0KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+JHtiYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9kZXNjcmlwdG9yLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgIDxlc2NhcGVTdHJpbmc+XDwvZXNjYXBlU3RyaW5nPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+c2luZ2xlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotICA8cHJvcGVydGllcz4KLSAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgICA8YW5FeHByPsO8YmVyPC9hbkV4cHI+Ci0gIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL21hc3NlbWJseS03MzYvc3JjL21haW4vYXNzZW1ibHkvZGVzY3JpcHRvci54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3NyYy9tYWluL2Fzc2VtYmx5L2Rlc2NyaXB0b3IueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmY2JjNGE1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL21hc3NlbWJseS03MzYvc3JjL21haW4vYXNzZW1ibHkvZGVzY3JpcHRvci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLQotICA8aWQ+YXNzZW1ibHk8L2lkPgotCi0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLQotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotCi0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9jb25maWc8L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8bGluZUVuZGluZz51bml4PC9saW5lRW5kaW5nPgotICAgICAgPGZpbHRlcmVkPnRydWU8L2ZpbHRlcmVkPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLQotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL21hc3NlbWJseS03MzYvc3JjL21haW4vY29uZmlnL2FUZXh0RmlsZUlTTzg4NTktMS50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3NyYy9tYWluL2NvbmZpZy9hVGV4dEZpbGVJU084ODU5LTEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTAzOTFjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL21hc3NlbWJseS03MzYvc3JjL21haW4vY29uZmlnL2FUZXh0RmlsZUlTTzg4NTktMS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1CavhybiBpcyBjb29sICR7YW5FeHByfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvbWFzc2VtYmx5LTczNi9zcmMvbWFpbi9jb25maWcvZmlsZS0xLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3NyYy9tYWluL2NvbmZpZy9maWxlLTEucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDliZDVkMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3NyYy9tYWluL2NvbmZpZy9maWxlLTEucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLWL4cz0ke2FuRXhwcn0KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvbWFzc2VtYmx5LTczNi9zcmMvbWFpbi9maWx0ZXJzL2ZpbHRlci1hc3NlbWJseS5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvbWFzc2VtYmx5LTczNi9zcmMvbWFpbi9maWx0ZXJzL2ZpbHRlci1hc3NlbWJseS5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjQ2NzY4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZpbHRlcmluZy1mZWF0dXJlL21hc3NlbWJseS03MzYvc3JjL21haW4vZmlsdGVycy9maWx0ZXItYXNzZW1ibHkucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1maWx0ZXIuYXNzZW1ibHk9RmlsdGVyIGRlZmluZWQgaW4gdGhlIEFzc2VtYmx5IHBsdWdpbidzIGNvbmZpZ3VyYXRpb24uCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3NyYy9tYWluL2ZpbHRlcnMvZmlsdGVyLWJ1aWxkLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3NyYy9tYWluL2ZpbHRlcnMvZmlsdGVyLWJ1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0ZGQwYTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvbWFzc2VtYmx5LTczNi9zcmMvbWFpbi9maWx0ZXJzL2ZpbHRlci1idWlsZC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWZpbHRlci5idWlsZD1GaWx0ZXIgZGVmaW5lZCBpbiB0aGUgcHJvamVjdHMnIGJ1aWxkIHNlY3Rpb24uCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9maWx0ZXJpbmctZmVhdHVyZS9tYXNzZW1ibHktNzM2L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkOGI4ZTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZmlsdGVyaW5nLWZlYXR1cmUvbWFzc2VtYmx5LTczNi92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi10cnkKLXsKLSAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9maWx0ZXJzLWRlZmluZWQtaW4tYnVpbGQtMS9maWxlLTEucHJvcGVydGllcyIpOwotICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCAgKTsKLSAgICBwcm9wZXJ0aWVzLmxvYWQoIG5ldyBGaWxlSW5wdXRTdHJlYW0oIGZpbGUgKSApOwotICAgIFN0cmluZyB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KCJiXHUwMGY4cyIpOwotCi0gICAgaWYgKCF2YWx1ZS5lcXVhbHMoIlx1MDBGQ2JlciIpKXsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHBlY3RlZCDDvGJlciwgZm91bmQ6IiArIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgIHJldHVybiBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmYyYzM5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllczwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYXNzZW1ibHkuaXQ8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPk1hdmVuIFF1aWNrIFN0YXJ0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTk5NjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmFzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hc3NlbWJseS5pdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZjEzODdhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWluc3RhbGwgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTphc3NlbWJseQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTMxZDc2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYXNzZW1ibHkuaXQ8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmFzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzPC9hcnRpZmFjdElkPgotCi0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLQotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGViMmQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pm1vZHVsZXM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke21vZHVsZS5hcnRpZmFjdElkfS4ke21vZHVsZS5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDwvYmluYXJpZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzL3Rlc3QucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBiZGY4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvdGVzdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWRlc2NyaXB0b3I9c3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM0MmNkMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWFzc2VtYmx5LXdpdGgtbW9kdWxlLWJpbmFyaWVzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgRmlsZSB6aXBGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMtMS4wLWJpbi56aXAiICk7Ci0gICAgCi0gICAgaWYgKCAhemlwRmlsZS5leGlzdHMoKSB8fCB6aXBGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiemlwLWZpbGUgaXMgbWlzc2luZyBvciBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIHppcEZpbGUgKTsKLSAgICAKLSAgICBpZiAoIHpmLmdldEVudHJ5KCAiYXNzZW1ibHktYXNzZW1ibHktd2l0aC1tb2R1bGUtYmluYXJpZXMtMS4wL21vZHVsZXMvY2hpbGQxLmphciIgKSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImNoaWxkMSBlbnRyeSBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmICggemYuZ2V0RW50cnkoICJhc3NlbWJseS1hc3NlbWJseS13aXRoLW1vZHVsZS1iaW5hcmllcy0xLjAvbW9kdWxlcy9jaGlsZDIuamFyIiApID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiY2hpbGQyIGVudHJ5IGlzIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDlhNjY5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllczwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYXNzZW1ibHkuaXQ8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPk1hdmVuIFF1aWNrIFN0YXJ0IEFyY2hldHlwZTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzL2NoaWxkMS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3NDE4NTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmFzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hc3NlbWJseS5pdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9jaGlsZDIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzL2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmJkNGQ3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWluc3RhbGwgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTphdHRhY2hlZApkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvZm9ya2luZy10ZXN0cy9hc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOThmOWZiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYXNzZW1ibHkuaXQ8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmFzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzPC9hcnRpZmFjdElkPgotCi0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLQotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NGViMmQ1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pm1vZHVsZXM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke21vZHVsZS5hcnRpZmFjdElkfS4ke21vZHVsZS5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDwvYmluYXJpZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzL3Rlc3QucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvdGVzdC5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBiZGY4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvdGVzdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWRlc2NyaXB0b3I9c3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL2ZvcmtpbmctdGVzdHMvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVmNzJjYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9mb3JraW5nLXRlc3RzL2Fzc2VtYmx5LWF0dGFjaGVkLXdpdGgtbW9kdWxlLWJpbmFyaWVzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotdHJ5Ci17Ci0gICAgRmlsZSB6aXBGaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMtMS4wLWJpbi56aXAiICk7Ci0gICAgCi0gICAgaWYgKCAhemlwRmlsZS5leGlzdHMoKSB8fCB6aXBGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiemlwLWZpbGUgaXMgbWlzc2luZyBvciBhIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIHJlc3VsdCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBaaXBGaWxlIHpmID0gbmV3IFppcEZpbGUoIHppcEZpbGUgKTsKLSAgICAKLSAgICBpZiAoIHpmLmdldEVudHJ5KCAiYXNzZW1ibHktYXR0YWNoZWQtd2l0aC1tb2R1bGUtYmluYXJpZXMtMS4wL21vZHVsZXMvY2hpbGQxLmphciIgKSA9PSBudWxsICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbiggImNoaWxkMSBlbnRyeSBpcyBtaXNzaW5nLiIgKTsKLSAgICAgICAgcmVzdWx0ID0gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGlmICggemYuZ2V0RW50cnkoICJhc3NlbWJseS1hdHRhY2hlZC13aXRoLW1vZHVsZS1iaW5hcmllcy0xLjAvbW9kdWxlcy9jaGlsZDIuamFyIiApID09IG51bGwgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiY2hpbGQyIGVudHJ5IGlzIG1pc3NpbmcuIiApOwotICAgICAgICByZXN1bHQgPSBmYWxzZTsKLSAgICB9Ci0gICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9hcmNoaXZlci1pZ25vcmVQZXJtaXNzaW9ucy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2FyY2hpdmVyLWlnbm9yZVBlcm1pc3Npb25zL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjRmZDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2FyY2hpdmVyLWlnbm9yZVBlcm1pc3Npb25zL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDwhLS0gVGhpcyBpcyB0aGUga2V5IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSB0ZXN0IC0tPgotICAgICAgICAgICAgICA8aWdub3JlUGVybWlzc2lvbnM+dHJ1ZTwvaWdub3JlUGVybWlzc2lvbnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9hcmNoaXZlci1pZ25vcmVQZXJtaXNzaW9ucy9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2FyY2hpdmVyLWlnbm9yZVBlcm1pc3Npb25zL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNDczNTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2FyY2hpdmVyLWlnbm9yZVBlcm1pc3Npb25zL3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHk+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPnRhcmdldC8qKjwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICA8ZmlsZU1vZGU+Nzc3PC9maWxlTW9kZT4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2FyY2hpdmVyLWlnbm9yZVBlcm1pc3Npb25zL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9hcmNoaXZlci1pZ25vcmVQZXJtaXNzaW9ucy9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2FyY2hpdmVyLWlnbm9yZVBlcm1pc3Npb25zL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vYXJjaGl2ZXItaWdub3JlUGVybWlzc2lvbnMvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9hcmNoaXZlci1pZ25vcmVQZXJtaXNzaW9ucy9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9hcmNoaXZlci1pZ25vcmVQZXJtaXNzaW9ucy9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vYXJjaGl2ZXItaWdub3JlUGVybWlzc2lvbnMvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9hcmNoaXZlci1pZ25vcmVQZXJtaXNzaW9ucy92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZmM0MTBiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9hcmNoaXZlci1pZ25vcmVQZXJtaXNzaW9ucy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotCi0vLyBtaW5pbWFsIHRlc3RzOyB0aGUgYmlnIHRoaW5nIGhlcmUgaXMgdGhhdCBpZ25vcmluZyBwZXJtaXNzaW9ucyBkb2Vzbid0IHN0b3AgdGhlIGFzc2VtYmx5IGZyb20gcnVubmluZy4uLgotRmlsZSBwb20gPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9wYXJlbnQtMS1iaW4vcGFyZW50LTEvcG9tLnhtbCIgKTsKLQotaWYgKCAhcG9tLmV4aXN0cygpIHx8ICFwb20uaXNGaWxlKCkgKQotewotICBTeXN0ZW0ub3V0LnByaW50bG4oICJQT00gd2FzIG5vdCBpbmNsdWRlZCBpbiBhc3NlbWJseS4iICk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotRmlsZSBqdW5pdEphciA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLWJpbi9wYXJlbnQtMS9saWIvanVuaXQtMy44LjEuamFyIiApOwotaWYgKCAhanVuaXRKYXIuZXhpc3RzKCkgJiYgIWp1bml0SmFyLmlzRmlsZSgpICkKLXsKLSAgU3lzdGVtLm91dC5wcmludGxuKCAiSlVuaXQgamFyIHdhcyBub3QgaW5jbHVkZWQgaW4gYXNzZW1ibHkuIiApOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9pZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vaWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmNTVjNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vaWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5pZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICAKLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnNyYzwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5zcmMyPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvc3JjMi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgIDxpZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zPmZhbHNlPC9pZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vaWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVhZmMxMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vaWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDx1c2VEZWZhdWx0RXhjbHVkZXM+dHJ1ZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vaWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucy9zcmMvbWFpbi9hc3NlbWJseS9zcmMyLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9pZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zL3NyYy9tYWluL2Fzc2VtYmx5L3NyYzIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDgzNmVkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9pZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zL3NyYy9tYWluL2Fzc2VtYmx5L3NyYzIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zcmMyPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+KiovdGFyZ2V0LyoqPC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9pZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vaWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucy92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjI1NDc0YS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vaWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1GaWxlIHNyYyA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMtMS1zcmMvcG9tLnhtbCIgKTsKLUZpbGUgc3JjMiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L2lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMtMS1zcmMyLmRpci9wb20ueG1sIiApOwotCi17Ci0gICAgRmlsZSBmID0gc3JjOwotCi0gICAgaWYgKCAhZi5leGlzdHMoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJQcm9qZWN0IGFzc2VtYmx5IGRpcmVjdG9yeSBpcyBtaXNzaW5nLiBDaGVjay1maWxlIHdhczogIiArIGYgKTsKLSAgICB9Ci19Ci0KLXsKLSAgICBGaWxlIGYgPSBzcmMyOwotCi0gICAgaWYgKCAhZi5leGlzdHMoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJQcm9qZWN0IGFzc2VtYmx5IGRpcmVjdG9yeSBpcyBtaXNzaW5nLiBDaGVjay1maWxlIHdhczogIiArIGYgKTsKLSAgICB9Ci19Ci0KLXJldHVybiBzcmMuZXhpc3RzKCkgJiYgc3JjMi5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLWN1c3RvbUVudHJ5L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLWN1c3RvbUVudHJ5L2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1jdXN0b21FbnRyeS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hbmlmZXN0LXdpdGgtY3VzdG9tRW50cnkvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLWN1c3RvbUVudHJ5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1YjA1ZWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hbmlmZXN0LXdpdGgtY3VzdG9tRW50cnkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zOnhzaT0naHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UnIHhzaTpzY2hlbWFMb2NhdGlvbj0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QnIHhtbG5zPSdodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAnPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm1hbmlmZXN0LXdpdGgtY3VzdG9tRW50cnk8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPnRlc3QuQXBwPC9tYWluQ2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgotICAgICAgICAgICAgICAgICAgPG1vZGU+ZGV2ZWxvcG1lbnQ8L21vZGU+Ci0gICAgICAgICAgICAgICAgPC9tYW5pZmVzdEVudHJpZXM+Ci0gICAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1jdXN0b21FbnRyeS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1jdXN0b21FbnRyeS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hbmlmZXN0LXdpdGgtY3VzdG9tRW50cnkvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLWN1c3RvbUVudHJ5L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1jdXN0b21FbnRyeS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLWN1c3RvbUVudHJ5L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLWN1c3RvbUVudHJ5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1jdXN0b21FbnRyeS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQzYmUwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLWN1c3RvbUVudHJ5L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotaW1wb3J0IGphdmEudXRpbC4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci0KLUZpbGUgZmlsZSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hbmlmZXN0LXdpdGgtY3VzdG9tRW50cnktMS1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyIiApOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oICJmaWxlOiAiICsgZmlsZSArICIgZXhpc3RzPyAiICsgZmlsZS5leGlzdHMoKSApOwotCi1KYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZSggZmlsZSApOwotCi1NYW5pZmVzdCBtZiA9IGphckZpbGUuZ2V0TWFuaWZlc3QoKTsKLQotQXR0cmlidXRlcyBhdHRycyA9IG1mLmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0KLVN0cmluZyBtb2RlID0gKFN0cmluZykgYXR0cnMuZ2V0KCBuZXcgQXR0cmlidXRlcy5OYW1lKCAibW9kZSIgKSApOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oICJHb3QgbW9kZTogIiArIG1vZGUgKTsKLQotcmV0dXJuICJkZXZlbG9wbWVudCIuZXF1YWxzKCBtb2RlICk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1tYWluQ2xhc3MvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hbmlmZXN0LXdpdGgtbWFpbkNsYXNzL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1tYWluQ2xhc3MvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLW1haW5DbGFzcy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hbmlmZXN0LXdpdGgtbWFpbkNsYXNzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YzA5ZGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hbmlmZXN0LXdpdGgtbWFpbkNsYXNzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxuczp4c2k9J2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlJyB4c2k6c2NoZW1hTG9jYXRpb249J2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkJyB4bWxucz0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wJz4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5tYW5pZmVzdC13aXRoLW1haW5DbGFzczwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPG5hbWU+TWF2ZW4gUXVpY2sgU3RhcnQgQXJjaGV0eXBlPC9uYW1lPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgICA8YXJjaGl2ZT4KLSAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPnRlc3QuQXBwPC9tYWluQ2xhc3M+Ci0gICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLW1haW5DbGFzcy9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1tYWluQ2xhc3Mvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYW5pZmVzdC13aXRoLW1haW5DbGFzcy9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hbmlmZXN0LXdpdGgtbWFpbkNsYXNzL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1tYWluQ2xhc3Mvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1tYWluQ2xhc3Mvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hbmlmZXN0LXdpdGgtbWFpbkNsYXNzL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1tYWluQ2xhc3MvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcxZjA4ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFuaWZlc3Qtd2l0aC1tYWluQ2xhc3MvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotRmlsZSBmaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvbWFuaWZlc3Qtd2l0aC1tYWluQ2xhc3MtMS1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyIiApOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oICJmaWxlOiAiICsgZmlsZSArICIgZXhpc3RzPyAiICsgZmlsZS5leGlzdHMoKSApOwotCi1KYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZSggZmlsZSApOwotCi1NYW5pZmVzdCBtZiA9IGphckZpbGUuZ2V0TWFuaWZlc3QoKTsKLQotQXR0cmlidXRlcyBhdHRycyA9IG1mLmdldE1haW5BdHRyaWJ1dGVzKCk7Ci0KLVN0cmluZyBtYWluQ2xhc3MgPSAoU3RyaW5nKSBhdHRycy5nZXQoIEF0dHJpYnV0ZXMuTmFtZS5NQUlOX0NMQVNTICk7Ci0KLVN5c3RlbS5vdXQucHJpbnRsbiggIkdvdCBNYWluLUNsYXNzOiAiICsgbWFpbkNsYXNzICk7Ci0KLXJldHVybiAidGVzdC5BcHAiLmVxdWFscyggbWFpbkNsYXNzICk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTI5MS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTI5MS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NTUwZTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0yOTEvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIGRlcGxveQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0yOTEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMjkxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YmZhNjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0yOTEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yOTE8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgotICAgICAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPnBvc2l4PC90YXJMb25nRmlsZU1vZGU+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMjkxL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTI5MS9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjIyNTc5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMjkxL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+YnVpbGQubG9nPC9leGNsdWRlPgotICAgICAgICA8ZXhjbHVkZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8qKjwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMjkxL3Rlc3QucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMjkxL3Rlc3QucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2ZWFkNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTI5MS90ZXN0LnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMgCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jIAotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotYWx0RGVwbG95bWVudFJlcG9zaXRvcnk9dGVzdDo6ZGVmYXVsdDo6ZmlsZTovLyR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcGxveQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0yOTEvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMjkxL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODc2MjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0yOTEvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotU3RyaW5nIGJhc2UgPSAidGFyZ2V0L2RlcGxveS9vcmcvdGVzdC9tYXNzZW1ibHktMjkxLzEvbWFzc2VtYmx5LTI5MS0xIjsKLUZpbGUgcG9tID0gbmV3IEZpbGUoIGJhc2VkaXIsIGJhc2UgKyAiLnBvbSIgKTsKLUZpbGUgemlwID0gbmV3IEZpbGUoIGJhc2VkaXIsIGJhc2UgKyAiLnppcCIgKTsKLUZpbGUgdGd6ID0gbmV3IEZpbGUoIGJhc2VkaXIsIGJhc2UgKyAiLnRhci5neiIgKTsKLQotewotICAgIEZpbGUgZiA9IHBvbTsKLSAgICBTdHJpbmcgdHlwZSA9ICJQT00iOwotCi0gICAgaWYgKCAhZi5leGlzdHMoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJQcm9qZWN0ICIgKyB0eXBlICsgIiBpcyBtaXNzaW5nIGluIGRlcGxveW1lbnQgcmVwb3NpdG9yeS4gRmlsZSB3YXM6ICIgKyBmICk7Ci0gICAgfQotfQotCi17Ci0gICAgRmlsZSBmID0gemlwOwotICAgIFN0cmluZyB0eXBlID0gInNvdXJjZXMgemlwIjsKLQotICAgIGlmICggIWYuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiUHJvamVjdCAiICsgdHlwZSArICIgaXMgbWlzc2luZyBpbiBkZXBsb3ltZW50IHJlcG9zaXRvcnkuIEZpbGUgd2FzOiAiICsgZiApOwotICAgIH0KLX0KLQotewotICAgIEZpbGUgZiA9IHRnejsKLSAgICBTdHJpbmcgdHlwZSA9ICJzb3VyY2VzIHRhci5neiI7Ci0KLSAgICBpZiAoICFmLmV4aXN0cygpICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlByb2plY3QgIiArIHR5cGUgKyAiIGlzIG1pc3NpbmcgaW4gZGVwbG95bWVudCByZXBvc2l0b3J5LiBGaWxlIHdhczogIiArIGYgKTsKLSAgICB9Ci19Ci0KLXJldHVybiBwb20uZXhpc3RzKCkgJiYgemlwLmV4aXN0cygpICYmIHRnei5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMzAxL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMzAxL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU1NTBlOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTMwMS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gZGVwbG95CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTMwMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0zMDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZjY2NjYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTMwMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTMwMTwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgIDx0YXJMb25nRmlsZU1vZGU+cG9zaXg8L3RhckxvbmdGaWxlTW9kZT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0zMDEvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMzAxL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiMjI1NzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0zMDEvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDx1c2VEZWZhdWx0RXhjbHVkZXM+dHJ1ZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT5idWlsZC5sb2c8L2V4Y2x1ZGU+Ci0gICAgICAgIDxleGNsdWRlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyoqPC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0zMDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0zMDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMzAxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTMwMS90ZXN0LnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTMwMS90ZXN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4NmVhZDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL21hc3NlbWJseS0zMDEvdGVzdC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jIAotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIyAKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWFsdERlcGxveW1lbnRSZXBvc2l0b3J5PXRlc3Q6OmRlZmF1bHQ6OmZpbGU6Ly8ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kZXBsb3kKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMzAxL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vbWFzc2VtYmx5LTMwMS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjJjOGRmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9tYXNzZW1ibHktMzAxL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLVN0cmluZyBiYXNlID0gInRhcmdldC9kZXBsb3kvb3JnL3Rlc3QvbWFzc2VtYmx5LTMwMS8xL21hc3NlbWJseS0zMDEtMSI7Ci1GaWxlIGphciA9IG5ldyBGaWxlKCBiYXNlZGlyLCBiYXNlICsgIi5qYXIiICk7Ci1GaWxlIHppcCA9IG5ldyBGaWxlKCBiYXNlZGlyLCBiYXNlICsgIi56aXAiICk7Ci1GaWxlIHRneiA9IG5ldyBGaWxlKCBiYXNlZGlyLCBiYXNlICsgIi50YXIuZ3oiICk7Ci0KLXsKLSAgICBGaWxlIGYgPSBqYXI7Ci0gICAgU3RyaW5nIHR5cGUgPSAibWFpbiBqYXIiOwotCi0gICAgaWYgKCAhZi5leGlzdHMoKSApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJQcm9qZWN0ICIgKyB0eXBlICsgIiBpcyBtaXNzaW5nIGluIGRlcGxveW1lbnQgcmVwb3NpdG9yeS4gRmlsZSB3YXM6ICIgKyBmICk7Ci0gICAgfQotfQotCi17Ci0gICAgRmlsZSBmID0gemlwOwotICAgIFN0cmluZyB0eXBlID0gInNvdXJjZXMgemlwIjsKLQotICAgIGlmICggIWYuZXhpc3RzKCkgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiUHJvamVjdCAiICsgdHlwZSArICIgaXMgbWlzc2luZyBpbiBkZXBsb3ltZW50IHJlcG9zaXRvcnkuIEZpbGUgd2FzOiAiICsgZiApOwotICAgIH0KLX0KLQotewotICAgIEZpbGUgZiA9IHRnejsKLSAgICBTdHJpbmcgdHlwZSA9ICJzb3VyY2VzIHRhci5neiI7Ci0KLSAgICBpZiAoICFmLmV4aXN0cygpICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlByb2plY3QgIiArIHR5cGUgKyAiIGlzIG1pc3NpbmcgaW4gZGVwbG95bWVudCByZXBvc2l0b3J5LiBGaWxlIHdhczogIiArIGYgKTsKLSAgICB9Ci19Ci0KLXJldHVybiBqYXIuZXhpc3RzKCkgJiYgemlwLmV4aXN0cygpICYmIHRnei5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9uby1hcHBlbmRBc3NlbWJseUlkLW5vLWNsYXNzaWZpZXIvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2NjNDk0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9uby1hcHBlbmRBc3NlbWJseUlkLW5vLWNsYXNzaWZpZXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bm8tYXBwZW5kQXNzZW1ibHlJZC1uby1jbGFzc2lmaWVyPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+JHt0ZXN0VmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICA8dHlwZT5tYXZlbi1wbHVnaW48L3R5cGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmphci13aXRoLWRlcGVuZGVuY2llczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9uby1hcHBlbmRBc3NlbWJseUlkLW5vLWNsYXNzaWZpZXIvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9uby1hcHBlbmRBc3NlbWJseUlkLW5vLWNsYXNzaWZpZXIvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL25vLWFwcGVuZEFzc2VtYmx5SWQtbm8tY2xhc3NpZmllci92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjdmYzViLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9uby1hcHBlbmRBc3NlbWJseUlkLW5vLWNsYXNzaWZpZXIvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotRmlsZSBmaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvbm8tYXBwZW5kQXNzZW1ibHlJZC1uby1jbGFzc2lmaWVyLTEuamFyIiApOwotCi1TeXN0ZW0ub3V0LnByaW50bG4oICJmaWxlOiAiICsgZmlsZSArICIgZXhpc3RzPyAiICsgZmlsZS5leGlzdHMoKSApOwotCi1KYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZSggZmlsZSApOwotCi1KYXJFbnRyeSBlbnRyeSA9IGphckZpbGUuZ2V0RW50cnkoICJvcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9tb2pvcy9BYnN0cmFjdEFzc2VtYmx5TW9qby5jbGFzcyIgKTsKLQotcmV0dXJuIGVudHJ5ICE9IG51bGw7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vc2tpcEFzc2VtYmx5Q0xJUHJvcGVydHlTZXQvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL3NraXBBc3NlbWJseUNMSVByb3BlcnR5U2V0L2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vc2tpcEFzc2VtYmx5Q0xJUHJvcGVydHlTZXQvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9za2lwQXNzZW1ibHlDTElQcm9wZXJ0eVNldC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL3NraXBBc3NlbWJseUNMSVByb3BlcnR5U2V0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODg5MzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL3NraXBBc3NlbWJseUNMSVByb3BlcnR5U2V0L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnNraXBBc3NlbWJseUNMSVByb3BlcnR5U2V0PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgICA8YXBwZW5kQXNzZW1ibHlJZD5mYWxzZTwvYXBwZW5kQXNzZW1ibHlJZD4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL3NraXBBc3NlbWJseUNMSVByb3BlcnR5U2V0L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vc2tpcEFzc2VtYmx5Q0xJUHJvcGVydHlTZXQvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM1Y2ZmYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vc2tpcEFzc2VtYmx5Q0xJUHJvcGVydHlTZXQvc3JjL21haW4vYXNzZW1ibHkvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICAKLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgCi08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL3NraXBBc3NlbWJseUNMSVByb3BlcnR5U2V0L3Rlc3QucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tY29uZmlndXJhdGlvbi9za2lwQXNzZW1ibHlDTElQcm9wZXJ0eVNldC90ZXN0LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2Y2Q3MDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL3NraXBBc3NlbWJseUNMSVByb3BlcnR5U2V0L3Rlc3QucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIyAKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMgCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1hc3NlbWJseS5za2lwQXNzZW1ibHk9dHJ1ZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby1jb25maWd1cmF0aW9uL3NraXBBc3NlbWJseUNMSVByb3BlcnR5U2V0L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vc2tpcEFzc2VtYmx5Q0xJUHJvcGVydHlTZXQvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODMxYTdmOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLWNvbmZpZ3VyYXRpb24vc2tpcEFzc2VtYmx5Q0xJUHJvcGVydHlTZXQvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLQotRmlsZSBmaWxlID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvc2tpcEFzc2VtYmx5Q0xJUHJvcGVydHlTZXQtMS56aXAiICk7Ci0KLXJldHVybiAhZmlsZS5leGlzdHMoKTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtaW4tb25lLXByb2plY3QtaGllcmFyY2h5L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQyZjNmNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnNpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHk8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5zaW5nbGUtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MmNjZjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtaW4tb25lLXByb2plY3QtaGllcmFyY2h5L3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0uJHthcnRpZmFjdC5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtaW4tb25lLXByb2plY3QtaGllcmFyY2h5L3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtaW4tb25lLXByb2plY3QtaGllcmFyY2h5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJmZjdmYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotcmV0dXJuIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3NpbmdsZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHktMS4wLVNOQVBTSE9ULWJpbi9saWIvanVuaXQuamFyIiApLmV4aXN0cygpOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgzOTE3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+c2luZ2xlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L2NoaWxkMS9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDEvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2MmNjZjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L2NoaWxkMS9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvY2hpbGQxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvY2hpbGQxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIyMDE1Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+c2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnNpbmdsZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjJjY2Y3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L2NoaWxkMi9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvY2hpbGQyL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvY2hpbGQyL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L2NoaWxkMi9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc0M2FhNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1tdWx0aW1vZHVsZS1oaWVyYXJjaHkvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2UKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMjc1NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW11bHRpbW9kdWxlLWhpZXJhcmNoeS92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwODRkNTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tbXVsdGltb2R1bGUtaGllcmFyY2h5L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQxL3RhcmdldC9jaGlsZDEtMS4wLVNOQVBTSE9ULWJpbi9saWIvanVuaXQuamFyIiApLmV4aXN0cygpOwotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQyL3RhcmdldC9jaGlsZDItMS4wLVNOQVBTSE9ULWJpbi9saWIvanVuaXQuamFyIiApLmV4aXN0cygpOwotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tb25lLXByb2plY3QtaGllcmFyY2h5L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NDNhYTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tb25lLXByb2plY3QtaGllcmFyY2h5L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNmQ3M2M0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+c2luZ2xlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeTwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmZpcnN0LWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZmluYWxOYW1lPmZpcnN0PC9maW5hbE5hbWU+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5zZWNvbmQtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDxmaW5hbE5hbWU+c2Vjb25kPC9maW5hbE5hbWU+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYyY2NmNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLSAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tb25lLXByb2plY3QtaGllcmFyY2h5L3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbW9qby10ZXN0cy9zaW5nbGUtdHdpY2UtaW4tb25lLXByb2plY3QtaGllcmFyY2h5L3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tb2pvLXRlc3RzL3NpbmdsZS10d2ljZS1pbi1vbmUtcHJvamVjdC1oaWVyYXJjaHkvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWZmMDM3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL21vam8tdGVzdHMvc2luZ2xlLXR3aWNlLWluLW9uZS1wcm9qZWN0LWhpZXJhcmNoeS92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9maXJzdC1iaW4vbGliL2p1bml0LmphciIgKS5leGlzdHMoKTsKLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9zZWNvbmQtYmluL2xpYi9qdW5pdC5qYXIiICkuZXhpc3RzKCk7Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2IwOTYxMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTI5ODwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+Q2hpbGQgMTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvY2hpbGQxL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvY2hpbGQxL0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDEvc3JjL21haW4vamF2YS9vcmcvdGVzdC9jaGlsZDEvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlODg5YmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDEvc3JjL21haW4vamF2YS9vcmcvdGVzdC9jaGlsZDEvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0LmNoaWxkMTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L2NoaWxkMS9BcHAyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L2NoaWxkMS9BcHAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NWU5ZWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDEvc3JjL21haW4vamF2YS9vcmcvdGVzdC9jaGlsZDEvQXBwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdC5jaGlsZDE7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcDIgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvY2hpbGQxL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWU2MTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ViODA5YS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+bWFzc2VtYmx5LTI5ODwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+Q2hpbGQgMjwvbmFtZT4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvY2hpbGQyL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvY2hpbGQyL0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9jaGlsZDIvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZDU4NTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9jaGlsZDIvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0LmNoaWxkMjsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L290aGVyL0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9vdGhlci9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTlmNzE5OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L290aGVyL0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdC5vdGhlcjsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2NoaWxkMi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvY2hpbGQyL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVlNjE3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvY2hpbGQyL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWYxMzg3YS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1pbnN0YWxsIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczptYXZlbi1hc3NlbWJseS1wbHVnaW46JHt0ZXN0VmVyc2lvbn06YXNzZW1ibHkKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2ZmU1My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0yOTg8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIAotICA8bmFtZT5QYXJlbnQ8L25hbWU+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmRiZWQ3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0yOTgvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5vcmcudGVzdDpjaGlsZDE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH08L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgICAgICA8dW5wYWNrT3B0aW9ucz4KLSAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8aW5jbHVkZT5vcmcvdGVzdC9jaGlsZDEvQXBwMio8L2luY2x1ZGU+Ci0gICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgPC91bnBhY2tPcHRpb25zPgotICAgICAgPC9iaW5hcmllcz4KLSAgICA8L21vZHVsZVNldD4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5vcmcudGVzdDpjaGlsZDI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH08L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+ZmFsc2U8L2luY2x1ZGVEZXBlbmRlbmNpZXM+Ci0gICAgICAgIDx1bnBhY2s+dHJ1ZTwvdW5wYWNrPgotICAgICAgICA8dW5wYWNrT3B0aW9ucz4KLSAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvdGVzdC9vdGhlci8qPC9leGNsdWRlPgotICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvdW5wYWNrT3B0aW9ucz4KLSAgICAgIDwvYmluYXJpZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMjk4L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZGI5ODQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTI5OC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEudXRpbC56aXAuKjsKLQotWmlwRmlsZSB6ZiA9IG5ldyBaaXBGaWxlKCBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9tYXNzZW1ibHktMjk4LTEtYmluLnppcCIgKSApOwotCi1aaXBFbnRyeSBjaGlsZDFJbmNsRW50cnkgPSB6Zi5nZXRFbnRyeSggImNoaWxkMS9vcmcvdGVzdC9jaGlsZDEvQXBwMi5jbGFzcyIgKTsKLQotaWYgKCBjaGlsZDFJbmNsRW50cnkgPT0gbnVsbCApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiSW5jbHVkZWQgZmlsZSBmcm9tIGNoaWxkMSBub3QgZm91bmQuIiApOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotWmlwRW50cnkgY2hpbGQxRXhjbEVudHJ5ID0gemYuZ2V0RW50cnkoICJjaGlsZDEvb3JnL3Rlc3QvY2hpbGQxL0FwcC5jbGFzcyIgKTsKLQotaWYgKCBjaGlsZDFFeGNsRW50cnkgIT0gbnVsbCApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTm9uLWluY2x1ZGVkIGZpbGUgZnJvbSBjaGlsZDEgc2hvdWxkIG5vdCBiZSBwcmVzZW50LCBidXQgd2FzIGZvdW5kLiIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVppcEVudHJ5IGNoaWxkMkluY2xFbnRyeSA9IHpmLmdldEVudHJ5KCAiY2hpbGQyL29yZy90ZXN0L2NoaWxkMi9BcHAuY2xhc3MiICk7Ci0KLWlmICggY2hpbGQySW5jbEVudHJ5ID09IG51bGwgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkluY2x1ZGVkIGZpbGUgZnJvbSBjaGlsZDIgbm90IGZvdW5kLiIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLVppcEVudHJ5IGNoaWxkMkV4Y2xFbnRyeSA9IHpmLmdldEVudHJ5KCAiY2hpbGQyL29yZy90ZXN0L290aGVyL0FwcC5jbGFzcyIgKTsKLQotaWYgKCBjaGlsZDJFeGNsRW50cnkgIT0gbnVsbCApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiTm9uLWluY2x1ZGVkIGZpbGUgZnJvbSBjaGlsZDIgc2hvdWxkIG5vdCBiZSBwcmVzZW50LCBidXQgd2FzIGZvdW5kLiIgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTMxNy9hc3NlbWJseS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMzE3L2Fzc2VtYmx5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5ODA5OC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMzE3L2Fzc2VtYmx5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotDQotPGFzc2VtYmx5Pg0KLSAgPGlkPmJpbjwvaWQ+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4NCi0gIDxtb2R1bGVTZXRzPg0KLSAgICA8bW9kdWxlU2V0Pg0KLSAgICAgIDxiaW5hcmllcz4NCi0gICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c2VydmVyL2RlZmF1bHQ8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgIDwhLS0gb3V0cHV0RmlsZU5hbWVNYXBwaW5nPiR7bW9kdWxlLmFydGlmYWN0SWR9LiR7bW9kdWxlLmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZyAtLT4NCi0gICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4NCi0gICAgICAgIDxkZXBlbmRlbmN5U2V0cz4NCi0gICAgICAgICAgPGRlcGVuZGVuY3lTZXQ+DQotICAgICAgICAgICAgPCEtLSBvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZyAtLT4NCi0gICAgICAgICAgICA8dXNlU3RyaWN0RmlsdGVyaW5nPnRydWU8L3VzZVN0cmljdEZpbHRlcmluZz4NCi0gICAgICAgICAgICA8aW5jbHVkZXM+DQotICAgICAgICAgICAgICA8aW5jbHVkZT4qOmp1bml0PC9pbmNsdWRlPg0KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgICAgIDwvZGVwZW5kZW5jeVNldD4NCi0gICAgICAgIDwvZGVwZW5kZW5jeVNldHM+DQotICAgICAgPC9iaW5hcmllcz4NCi0gICAgPC9tb2R1bGVTZXQ+DQotICA8L21vZHVsZVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMzE3L2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTMxNy9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhMGRlNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMzE3L2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPmNvbS5teWNvbXBhbnkuYXBwPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teS1hcHAtbW9kdWxlMTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+bXktYXBwLW1vZHVsZTE8L25hbWU+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8IS0tIGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5IC0tPgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0zMTcvY2hpbGQxL3NyYy9tYWluL2phdmEvY29tL215Y29tcGFueS9hcHAvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMzE3L2NoaWxkMS9zcmMvbWFpbi9qYXZhL2NvbS9teWNvbXBhbnkvYXBwL0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTc5MzdkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0zMTcvY2hpbGQxL3NyYy9tYWluL2phdmEvY29tL215Y29tcGFueS9hcHAvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1wYWNrYWdlIGNvbS5teWNvbXBhbnkuYXBwOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewkKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0zMTcvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMzE3L2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODEzYTUzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0zMTcvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD5jb20ubXljb21wYW55LmFwcDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXktYXBwLW1vZHVsZTI8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPm15LWFwcC1tb2R1bGUyPC9uYW1lPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0zMTcvY2hpbGQyL3NyYy9tYWluL2phdmEvY29tL215Y29tcGFueS9hcHAvQXBwMi5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTMxNy9jaGlsZDIvc3JjL21haW4vamF2YS9jb20vbXljb21wYW55L2FwcC9BcHAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MGM1ZTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTMxNy9jaGlsZDIvc3JjL21haW4vamF2YS9jb20vbXljb21wYW55L2FwcC9BcHAyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi1wYWNrYWdlIGNvbS5teWNvbXBhbnkuYXBwOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcDIgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0zMTcvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS0zMTcvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYzYjkzOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktMzE3L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPmNvbS5teWNvbXBhbnkuYXBwPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teS1hcHA8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPG5hbWU+bXktYXBwPC9uYW1lPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbS5teWNvbXBhbnkuYXBwPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bXktYXBwLW1vZHVsZTI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PiAgCi0gIDwvZGVwZW5kZW5jaWVzPgotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLSAgPGJ1aWxkPgotICAgICAgPHBsdWdpbnM+Ci0gICAgICAgIDxwbHVnaW4+Ci0JICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotCSAgPHZlcnNpb24+JHt0ZXN0VmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0JICAgIDxkZXNjcmlwdG9ycz4KLQkgICAgICA8ZGVzY3JpcHRvcj5hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+Ci0JICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgPGlkPm1ha2UtYXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KLSAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2NoaWxkLWNsaWVudC9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTQ3NC9jaGlsZC1jbGllbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VkNTVkNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2NoaWxkLWNsaWVudC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4NCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gIDxwYXJlbnQ+DQotICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXRlc3Q8L2FydGlmYWN0SWQ+DQotICAgIDxncm91cElkPm1hdmVuLWFzc2VtYmx5LXRlc3Q8L2dyb3VwSWQ+DQotICAgIDx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgPC9wYXJlbnQ+DQotICA8Z3JvdXBJZD5tYXZlbi1hc3NlbWJseS10ZXN0PC9ncm91cElkPg0KLSAgPGFydGlmYWN0SWQ+bW9kdWwtY2xpZW50PC9hcnRpZmFjdElkPg0KLSAgPHZlcnNpb24+MC4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotICA8ZGVwZW5kZW5jaWVzPg0KLSAgCTxkZXBlbmRlbmN5Pg0KLSAgCQk8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPg0KLSAgCQk8YXJ0aWZhY3RJZD5tYXZlbi1tb25pdG9yPC9hcnRpZmFjdElkPg0KLSAgCQk8dmVyc2lvbj4yLjIuMDwvdmVyc2lvbj4NCi0gIAkJPHR5cGU+amFyPC90eXBlPg0KLSAgCQk8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAJPC9kZXBlbmRlbmN5Pg0KLSAgPC9kZXBlbmRlbmNpZXM+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvY2hpbGQtc2VydmVyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2NoaWxkLXNlcnZlci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWM4OGU4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvY2hpbGQtc2VydmVyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPg0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPg0KLSAgPHBhcmVudD4NCi0gICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktdGVzdDwvYXJ0aWZhY3RJZD4NCi0gICAgPGdyb3VwSWQ+bWF2ZW4tYXNzZW1ibHktdGVzdDwvZ3JvdXBJZD4NCi0gICAgPHZlcnNpb24+MC4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotICA8L3BhcmVudD4NCi0gIDxncm91cElkPm1hdmVuLWFzc2VtYmx5LXRlc3Q8L2dyb3VwSWQ+DQotICA8YXJ0aWZhY3RJZD5tb2R1bC1zZXJ2ZXI8L2FydGlmYWN0SWQ+DQotICA8dmVyc2lvbj4wLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gIDxkZXBlbmRlbmNpZXM+DQotICAJPGRlcGVuZGVuY3k+DQotICAJCTxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uc2tpbnM8L2dyb3VwSWQ+DQotICAJCTxhcnRpZmFjdElkPm1hdmVuLWRlZmF1bHQtc2tpbjwvYXJ0aWZhY3RJZD4NCi0gIAkJPHZlcnNpb24+MS4wPC92ZXJzaW9uPg0KLSAgCQk8dHlwZT5qYXI8L3R5cGU+DQotICAJCTxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gIAk8L2RlcGVuZGVuY3k+DQotICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTQ3NC9kZXNjcmlwdG9yL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2Rlc2NyaXB0b3IvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmFjYWJlYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2Rlc2NyaXB0b3IvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+DQotCTxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0JPHBhcmVudD4NCi0JCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXRlc3Q8L2FydGlmYWN0SWQ+DQotCQk8Z3JvdXBJZD5tYXZlbi1hc3NlbWJseS10ZXN0PC9ncm91cElkPg0KLQkJPHZlcnNpb24+MC4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotCTwvcGFyZW50Pg0KLQk8Z3JvdXBJZD5tYXZlbi1hc3NlbWJseS10ZXN0PC9ncm91cElkPg0KLQk8YXJ0aWZhY3RJZD5kaXN0cmlidXRpb248L2FydGlmYWN0SWQ+DQotCTx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLQk8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLQk8YnVpbGQ+DQotCQk8cGx1Z2lucz4NCi0JCQk8cGx1Z2luPg0KLQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+DQotCQkJCTxleGVjdXRpb25zPg0KLQkJCQkJPGV4ZWN1dGlvbj4NCi0JCQkJCQk8aWQ+ZGlzdHJpYnV0aW9uPC9pZD4NCi0JCQkJCQk8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotCQkJCQkJPGdvYWxzPg0KLQkJCQkJCQk8Z29hbD5zaW5nbGU8L2dvYWw+DQotCQkJCQkJPC9nb2Fscz4NCi0JCQkJCQk8Y29uZmlndXJhdGlvbj4NCi0JCQkJCQkJPGRlc2NyaXB0b3JzPg0KLQkJCQkJCQkJPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWw8L2Rlc2NyaXB0b3I+DQotCQkJCQkJCQk8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibHkvY2xpZW50LnhtbDwvZGVzY3JpcHRvcj4NCi0JCQkJCQkJCTxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9zZXJ2ZXIueG1sPC9kZXNjcmlwdG9yPg0KLQkJCQkJCQk8L2Rlc2NyaXB0b3JzPg0KLQkJCQkJCTwvY29uZmlndXJhdGlvbj4NCi0JCQkJCTwvZXhlY3V0aW9uPg0KLQkJCQk8L2V4ZWN1dGlvbnM+DQotCQkJPC9wbHVnaW4+DQotCQkJPHBsdWdpbj4NCi0JCQkJPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLQkJCQk8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+DQotCQkJCTx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPg0KLQkJCQk8ZXhlY3V0aW9ucz4NCi0JCQkJCTxleGVjdXRpb24+DQotCQkJCQkJPGlkPmVuZm9yY2UtZG9udC1leGlzdDwvaWQ+DQotCQkJCQkJPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLQkJCQkJCTxnb2Fscz4NCi0JCQkJCQkJPGdvYWw+ZW5mb3JjZTwvZ29hbD4NCi0JCQkJCQk8L2dvYWxzPg0KLQkJCQkJCTxjb25maWd1cmF0aW9uPg0KLQkJCQkJCQk8cnVsZXM+DQotCQkJCQkJCQk8cmVxdWlyZUZpbGVzRG9udEV4aXN0Pg0KLQkJCQkJCQkJCTxtZXNzYWdlPkxpYmFyeSBtYXZlbi1kZWZhdWx0LXNraW4tMS4wLmphciBub24gY2xpZW50IGRlcGVuZGVuY3khPC9tZXNzYWdlPg0KLQkJCQkJCQkJCTxmaWxlcz4NCi0JCQkJCQkJCQkJPGZpbGU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGlzdHJpYnV0aW9uLSR7cHJvamVjdC52ZXJzaW9ufS1hbGwvY2xpZW50L2xpYi9tYXZlbi1kZWZhdWx0LXNraW4tMS4wLmphcjwvZmlsZT4NCi0JCQkJCQkJCQkJPGZpbGU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGlzdHJpYnV0aW9uLSR7cHJvamVjdC52ZXJzaW9ufS1jbGllbnQvY2xpZW50L2xpYi9tYXZlbi1kZWZhdWx0LXNraW4tMS4wLmphcjwvZmlsZT4NCi0JCQkJCQkJCQk8L2ZpbGVzPg0KLQkJCQkJCQkJPC9yZXF1aXJlRmlsZXNEb250RXhpc3Q+DQotCQkJCQkJCQk8cmVxdWlyZUZpbGVzRG9udEV4aXN0Pg0KLQkJCQkJCQkJCTxtZXNzYWdlPkxpYmFyeSBtYXZlbi1tb25pdG9yLTIuMi4wLmphciBub24gc2VydmVyIGRlcGVuZGVuY3khPC9tZXNzYWdlPg0KLQkJCQkJCQkJCTxmaWxlcz4NCi0JCQkJCQkJCQkJPGZpbGU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGlzdHJpYnV0aW9uLSR7cHJvamVjdC52ZXJzaW9ufS1hbGwvc2VydmVyL2xpYi9tYXZlbi1tb25pdG9yLTIuMi4wLmphcjwvZmlsZT4NCi0JCQkJCQkJCQkJPGZpbGU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGlzdHJpYnV0aW9uLSR7cHJvamVjdC52ZXJzaW9ufS1zZXJ2ZXIvc2VydmVyL2xpYi9tYXZlbi1tb25pdG9yLTIuMi4wLmphcjwvZmlsZT4NCi0JCQkJCQkJCQk8L2ZpbGVzPg0KLQkJCQkJCQkJPC9yZXF1aXJlRmlsZXNEb250RXhpc3Q+DQotCQkJCQkJCTwvcnVsZXM+DQotCQkJCQkJCTxmYWlsPnRydWU8L2ZhaWw+DQotCQkJCQkJPC9jb25maWd1cmF0aW9uPg0KLQkJCQkJPC9leGVjdXRpb24+DQotCQkJCTwvZXhlY3V0aW9ucz4NCi0JCQk8L3BsdWdpbj4NCi0JCTwvcGx1Z2lucz4NCi0JPC9idWlsZD4NCi0JPG5hbWU+VGVzdCBEaXN0cmlidXRpb248L25hbWU+DQotCTxkZXNjcmlwdGlvbj5EaXN0cmlidXRpb25tb2R1bDwvZGVzY3JpcHRpb24+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvZGVzY3JpcHRvci9zcmMvYXNzZW1ibHkvY2xpZW50LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvZGVzY3JpcHRvci9zcmMvYXNzZW1ibHkvY2xpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc1Y2UxNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2Rlc2NyaXB0b3Ivc3JjL2Fzc2VtYmx5L2NsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGFzc2VtYmx5DQotCXhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiINCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjIueHNkIj4NCi0JPGlkPmNsaWVudDwvaWQ+DQotCTxmb3JtYXRzPg0KLQkJPGZvcm1hdD5kaXI8L2Zvcm1hdD4NCi0JPC9mb3JtYXRzPg0KLQk8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5Pg0KLQ0KLQk8Y29tcG9uZW50RGVzY3JpcHRvcnM+DQotCQk8Y29tcG9uZW50RGVzY3JpcHRvcj5jb21wb25lbnQtY2xpZW50LnhtbDwvY29tcG9uZW50RGVzY3JpcHRvcj4NCi0JPC9jb21wb25lbnREZXNjcmlwdG9ycz4NCi08L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvZGVzY3JpcHRvci9zcmMvYXNzZW1ibHkvY29tcG9uZW50LWNsaWVudC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2Rlc2NyaXB0b3Ivc3JjL2Fzc2VtYmx5L2NvbXBvbmVudC1jbGllbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOThlNDFlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvZGVzY3JpcHRvci9zcmMvYXNzZW1ibHkvY29tcG9uZW50LWNsaWVudC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxjb21wb25lbnQgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2NvbXBvbmVudC8xLjEuMiIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vY29tcG9uZW50LzEuMS4yIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9jb21wb25lbnQtMS4xLjIueHNkIj4NCi0JPG1vZHVsZVNldHM+DQotCQk8bW9kdWxlU2V0Pg0KLQkJCTx1c2VBbGxSZWFjdG9yUHJvamVjdHM+dHJ1ZTwvdXNlQWxsUmVhY3RvclByb2plY3RzPg0KLQkJCTxpbmNsdWRlcz4NCi0JCQkJPGluY2x1ZGU+bWF2ZW4tYXNzZW1ibHktdGVzdDoqLWNsaWVudDwvaW5jbHVkZT4NCi0JCQk8L2luY2x1ZGVzPg0KLQkJCTxiaW5hcmllcz4NCi0JCQkJPHVucGFjaz5mYWxzZTwvdW5wYWNrPg0KLQkJCQk8aW5jbHVkZURlcGVuZGVuY2llcz50cnVlPC9pbmNsdWRlRGVwZW5kZW5jaWVzPg0KLQkJCQk8b3V0cHV0RmlsZU5hbWVNYXBwaW5nPmNsaWVudC9saWIvJHttb2R1bGUuYXJ0aWZhY3RJZH0uJHttb2R1bGUuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPg0KLQkJCQk8ZGVwZW5kZW5jeVNldHM+DQotCQkJCQk8IS0tIEJpYmxpb3RoZWtlbiAtLT4NCi0JCQkJCTxkZXBlbmRlbmN5U2V0Pg0KLQkJCQkJCTxvdXRwdXREaXJlY3Rvcnk+Y2xpZW50L2xpYjwvb3V0cHV0RGlyZWN0b3J5Pg0KLQkJCQkJCTx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4NCi0JCQkJCQk8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPg0KLQkJCQkJCTwhLS0NCi0JCQkJCQk8dXNlU3RyaWN0RmlsdGVyaW5nPnRydWU8L3VzZVN0cmljdEZpbHRlcmluZz4NCi0JCQkJCQk8dXNlVHJhbnNpdGl2ZUZpbHRlcmluZz50cnVlPC91c2VUcmFuc2l0aXZlRmlsdGVyaW5nPg0KLQkJCQkJCSAtLT4NCi0JCQkJCTwvZGVwZW5kZW5jeVNldD4NCi0JCQkJPC9kZXBlbmRlbmN5U2V0cz4NCi0JCQk8L2JpbmFyaWVzPg0KLQkJPC9tb2R1bGVTZXQ+DQotCTwvbW9kdWxlU2V0cz4NCi08L2NvbXBvbmVudD4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2Rlc2NyaXB0b3Ivc3JjL2Fzc2VtYmx5L2NvbXBvbmVudC1zZXJ2ZXIueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTQ3NC9kZXNjcmlwdG9yL3NyYy9hc3NlbWJseS9jb21wb25lbnQtc2VydmVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzcwNDU5Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2Rlc2NyaXB0b3Ivc3JjL2Fzc2VtYmx5L2NvbXBvbmVudC1zZXJ2ZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08Y29tcG9uZW50IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9jb21wb25lbnQvMS4xLjIiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2NvbXBvbmVudC8xLjEuMiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvY29tcG9uZW50LTEuMS4yLnhzZCI+DQotCTxtb2R1bGVTZXRzPg0KLQkJPG1vZHVsZVNldD4NCi0JCQk8dXNlQWxsUmVhY3RvclByb2plY3RzPnRydWU8L3VzZUFsbFJlYWN0b3JQcm9qZWN0cz4NCi0JCQk8aW5jbHVkZXM+DQotCQkJCTxpbmNsdWRlPm1hdmVuLWFzc2VtYmx5LXRlc3Q6bW9kdWwtc2VydmVyPC9pbmNsdWRlPg0KLQkJCTwvaW5jbHVkZXM+DQotCQkJPGJpbmFyaWVzPg0KLQkJCQk8dW5wYWNrPmZhbHNlPC91bnBhY2s+DQotCQkJCTxpbmNsdWRlRGVwZW5kZW5jaWVzPnRydWU8L2luY2x1ZGVEZXBlbmRlbmNpZXM+DQotCQkJCTxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+c2VydmVyL2xpYi8ke21vZHVsZS5hcnRpZmFjdElkfS4ke21vZHVsZS5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+DQotCQkJCTxkZXBlbmRlbmN5U2V0cz4NCi0JCQkJCTwhLS0gQmlibGlvdGhla2VuIC0tPg0KLQkJCQkJPGRlcGVuZGVuY3lTZXQ+DQotCQkJCQkJPG91dHB1dERpcmVjdG9yeT5zZXJ2ZXIvbGliPC9vdXRwdXREaXJlY3Rvcnk+DQotCQkJCQkJPHVzZVByb2plY3RBcnRpZmFjdD5mYWxzZTwvdXNlUHJvamVjdEFydGlmYWN0Pg0KLQkJCQkJCTx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPnRydWU8L3VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+DQotCQkJCQkJPCEtLQ0KLQkJCQkJCTx1c2VTdHJpY3RGaWx0ZXJpbmc+dHJ1ZTwvdXNlU3RyaWN0RmlsdGVyaW5nPg0KLQkJCQkJCTx1c2VUcmFuc2l0aXZlRmlsdGVyaW5nPnRydWU8L3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmc+DQotCQkJCQkJIC0tPg0KLQkJCQkJPC9kZXBlbmRlbmN5U2V0Pg0KLQkJCQk8L2RlcGVuZGVuY3lTZXRzPg0KLQkJCTwvYmluYXJpZXM+DQotCQk8L21vZHVsZVNldD4NCi0JPC9tb2R1bGVTZXRzPg0KLTwvY29tcG9uZW50Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvZGVzY3JpcHRvci9zcmMvYXNzZW1ibHkvZGlzdHJpYnV0aW9uLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvZGVzY3JpcHRvci9zcmMvYXNzZW1ibHkvZGlzdHJpYnV0aW9uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYwMmJiYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2Rlc2NyaXB0b3Ivc3JjL2Fzc2VtYmx5L2Rpc3RyaWJ1dGlvbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGFzc2VtYmx5DQotCXhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiINCi0JeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0JeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjIueHNkIj4NCi0JPGlkPmFsbDwvaWQ+DQotCTxmb3JtYXRzPg0KLQkJPGZvcm1hdD5kaXI8L2Zvcm1hdD4NCi0JPC9mb3JtYXRzPg0KLQk8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5Pg0KLQ0KLQk8Y29tcG9uZW50RGVzY3JpcHRvcnM+DQotCQk8Y29tcG9uZW50RGVzY3JpcHRvcj5jb21wb25lbnQtY2xpZW50LnhtbDwvY29tcG9uZW50RGVzY3JpcHRvcj4NCi0JCTxjb21wb25lbnREZXNjcmlwdG9yPmNvbXBvbmVudC1zZXJ2ZXIueG1sPC9jb21wb25lbnREZXNjcmlwdG9yPg0KLQk8L2NvbXBvbmVudERlc2NyaXB0b3JzPg0KLTwvYXNzZW1ibHk+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTQ3NC9kZXNjcmlwdG9yL3NyYy9hc3NlbWJseS9zZXJ2ZXIueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTQ3NC9kZXNjcmlwdG9yL3NyYy9hc3NlbWJseS9zZXJ2ZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDNiYWM2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS00NzQvZGVzY3JpcHRvci9zcmMvYXNzZW1ibHkvc2VydmVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08YXNzZW1ibHkNCi0JeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIg0KLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLQl4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMi54c2QiPg0KLQk8aWQ+c2VydmVyPC9pZD4NCi0JPGZvcm1hdHM+DQotCQk8Zm9ybWF0PmRpcjwvZm9ybWF0Pg0KLQk8L2Zvcm1hdHM+DQotCTxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQotDQotCTxjb21wb25lbnREZXNjcmlwdG9ycz4NCi0JCTxjb21wb25lbnREZXNjcmlwdG9yPmNvbXBvbmVudC1zZXJ2ZXIueG1sPC9jb21wb25lbnREZXNjcmlwdG9yPg0KLQk8L2NvbXBvbmVudERlc2NyaXB0b3JzPg0KLTwvYXNzZW1ibHk+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTQ3NC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkwMmU1MC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1pbnN0YWxsCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNDc0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4M2YzNWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTQ3NC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4NCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gIDxncm91cElkPm1hdmVuLWFzc2VtYmx5LXRlc3Q8L2dyb3VwSWQ+DQotICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS10ZXN0PC9hcnRpZmFjdElkPg0KLSAgPHZlcnNpb24+MC4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLSAgPGRlc2NyaXB0aW9uPk11bGl0cHJvamVjdCBmb3IgdGVzdGluZyBhc3NlbWJseSA8L2Rlc2NyaXB0aW9uPg0KLSAgPGJ1aWxkPg0KLSAgCTxkZWZhdWx0R29hbD5jbGVhbiBwYWNrYWdlPC9kZWZhdWx0R29hbD4NCi0gIAk8cGx1Z2luTWFuYWdlbWVudD4NCi0gIAkJPHBsdWdpbnM+DQotCSAgCQk8cGx1Z2luPg0KLQkgIAkJCTxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0JICAJCQk8dmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdmVyc2lvbj4NCi0JICAJCTwvcGx1Z2luPg0KLSAgCQk8L3BsdWdpbnM+DQotICAJPC9wbHVnaW5NYW5hZ2VtZW50Pg0KLSAgCSAgCTxwbHVnaW5zPg0KLSAgCTwvcGx1Z2lucz4NCi0JDQotICA8L2J1aWxkPg0KLSAgPG1vZHVsZXM+DQotICAJPG1vZHVsZT5jaGlsZC1jbGllbnQ8L21vZHVsZT4NCi0gIAk8bW9kdWxlPmNoaWxkLXNlcnZlcjwvbW9kdWxlPg0KLSAgCTxtb2R1bGU+ZGVzY3JpcHRvcjwvbW9kdWxlPg0KLSAgPC9tb2R1bGVzPg0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNjE5L2Fzc2VtYmx5LnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvYXNzZW1ibHkueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGUzZWRiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvYXNzZW1ibHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxhc3NlbWJseQ0KLSAgICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiDQotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+DQotDQotICA8aWQ+ZGVwbG95LXppcDwvaWQ+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4NCi0NCi0gIDxkZXBlbmRlbmN5U2V0cz4NCi0gICAgPGRlcGVuZGVuY3lTZXQ+DQotICAgICAgPG91dHB1dERpcmVjdG9yeT5kaXIxPC9vdXRwdXREaXJlY3Rvcnk+DQotICAgICAgPGluY2x1ZGVzPg0KLSAgICAgICAgPGluY2x1ZGU+Y29tbW9ucy1jb25maWd1cmF0aW9uOmNvbW1vbnMtY29uZmlndXJhdGlvbjwvaW5jbHVkZT4NCi0gICAgICA8L2luY2x1ZGVzPg0KLSAgICA8L2RlcGVuZGVuY3lTZXQ+DQotICAgIDxkZXBlbmRlbmN5U2V0Pg0KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZGlyMjwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPmZhbHNlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPg0KLSAgICAgIDxleGNsdWRlcz4NCi0gICAgICAgIDxleGNsdWRlPmNvbW1vbnMtY29uZmlndXJhdGlvbjpjb21tb25zLWNvbmZpZ3VyYXRpb248L2V4Y2x1ZGU+DQotICAgICAgPC9leGNsdWRlcz4NCi0gICAgPC9kZXBlbmRlbmN5U2V0Pg0KLSAgPC9kZXBlbmRlbmN5U2V0cz4NCi0NCi08L2Fzc2VtYmx5Pg0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvY2hpbGQtY2xpZW50L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNjE5L2NoaWxkLWNsaWVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjJhOWJhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvY2hpbGQtY2xpZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+DQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICA8cGFyZW50Pg0KLSAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS10ZXN0PC9hcnRpZmFjdElkPg0KLSAgICA8Z3JvdXBJZD5tYXZlbi1hc3NlbWJseS10ZXN0PC9ncm91cElkPg0KLSAgICA8dmVyc2lvbj4wLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4NCi0gIDwvcGFyZW50Pg0KLSAgPGdyb3VwSWQ+bWF2ZW4tYXNzZW1ibHktdGVzdDwvZ3JvdXBJZD4NCi0gIDxhcnRpZmFjdElkPm1vZHVsLWNsaWVudDwvYXJ0aWZhY3RJZD4NCi0gIDx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgPGRlcGVuZGVuY2llcz4NCi0gICAgPGRlcGVuZGVuY3k+DQotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb25maWd1cmF0aW9uPC9ncm91cElkPg0KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29uZmlndXJhdGlvbjwvYXJ0aWZhY3RJZD4NCi0gICAgICA8dmVyc2lvbj4xLjEwPC92ZXJzaW9uPg0KLSAgICA8L2RlcGVuZGVuY3k+DQotICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+DQotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJjaGl2ZXI8L2FydGlmYWN0SWQ+DQotICAgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPg0KLSAgICA8L2RlcGVuZGVuY3k+DQotICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+DQotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tbW9uaXRvcjwvYXJ0aWZhY3RJZD4NCi0gICAgICA8dmVyc2lvbj4yLjIuMDwvdmVyc2lvbj4NCi0gICAgICA8dHlwZT5qYXI8L3R5cGU+DQotICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPg0KLSAgICA8L2RlcGVuZGVuY3k+DQotICA8L2RlcGVuZGVuY2llcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTYxOS9kZXNjcmlwdG9yL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNjE5L2Rlc2NyaXB0b3IvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkZGYyOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNjE5L2Rlc2NyaXB0b3IvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLTwhLS0NCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSINCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4NCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gIDxwYXJlbnQ+DQotICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXRlc3Q8L2FydGlmYWN0SWQ+DQotICAgIDxncm91cElkPm1hdmVuLWFzc2VtYmx5LXRlc3Q8L2dyb3VwSWQ+DQotICAgIDx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgPC9wYXJlbnQ+DQotICA8Z3JvdXBJZD5tYXZlbi1hc3NlbWJseS10ZXN0PC9ncm91cElkPg0KLSAgPGFydGlmYWN0SWQ+ZGlzdHJpYnV0aW9uPC9hcnRpZmFjdElkPg0KLSAgPHZlcnNpb24+MC4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+DQotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPg0KLSAgPGJ1aWxkPg0KLSAgICA8cGx1Z2lucz4NCi0gICAgICA8cGx1Z2luPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPGV4ZWN1dGlvbnM+DQotICAgICAgICAgIDxleGVjdXRpb24+DQotICAgICAgICAgICAgPGlkPmRpc3RyaWJ1dGlvbjwvaWQ+DQotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPg0KLSAgICAgICAgICAgIDxnb2Fscz4NCi0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4NCi0gICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPg0KLSAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibHkvY2xpZW50LnhtbDwvZGVzY3JpcHRvcj4NCi0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+DQotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICA8L3BsdWdpbj4NCi0gICAgICA8cGx1Z2luPg0KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPg0KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+DQotICAgICAgICA8ZXhlY3V0aW9ucz4NCi0gICAgICAgICAgPGV4ZWN1dGlvbj4NCi0gICAgICAgICAgICA8aWQ+ZW5mb3JjZS1kb250LWV4aXN0PC9pZD4NCi0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+DQotICAgICAgICAgICAgPGdvYWxzPg0KLSAgICAgICAgICAgICAgPGdvYWw+ZW5mb3JjZTwvZ29hbD4NCi0gICAgICAgICAgICA8L2dvYWxzPg0KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgPHJ1bGVzPg0KLSAgICAgICAgICAgICAgICA8cmVxdWlyZUZpbGVzRG9udEV4aXN0Pg0KLSAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPkxpYmFyeSBtYXZlbi1kZWZhdWx0LXNraW4tMS4wLmphciBub24gY2xpZW50IGRlcGVuZGVuY3khPC9tZXNzYWdlPg0KLSAgICAgICAgICAgICAgICAgIDxmaWxlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kaXN0cmlidXRpb24tJHtwcm9qZWN0LnZlcnNpb259LWFsbC9jbGllbnQvbGliL21hdmVuLWRlZmF1bHQtc2tpbi0xLjAuamFyDQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGlzdHJpYnV0aW9uLSR7cHJvamVjdC52ZXJzaW9ufS1jbGllbnQvY2xpZW50L2xpYi9tYXZlbi1kZWZhdWx0LXNraW4tMS4wLmphcg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlPg0KLSAgICAgICAgICAgICAgICAgIDwvZmlsZXM+DQotICAgICAgICAgICAgICAgIDwvcmVxdWlyZUZpbGVzRG9udEV4aXN0Pg0KLSAgICAgICAgICAgICAgICA8cmVxdWlyZUZpbGVzRG9udEV4aXN0Pg0KLSAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPkxpYmFyeSBtYXZlbi1tb25pdG9yLTIuMi4wLmphciBub24gc2VydmVyIGRlcGVuZGVuY3khPC9tZXNzYWdlPg0KLSAgICAgICAgICAgICAgICAgIDxmaWxlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxmaWxlPg0KLSAgICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kaXN0cmlidXRpb24tJHtwcm9qZWN0LnZlcnNpb259LWFsbC9zZXJ2ZXIvbGliL21hdmVuLW1vbml0b3ItMi4yLjAuamFyDQotICAgICAgICAgICAgICAgICAgICA8L2ZpbGU+DQotICAgICAgICAgICAgICAgICAgICA8ZmlsZT4NCi0gICAgICAgICAgICAgICAgICAgICAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGlzdHJpYnV0aW9uLSR7cHJvamVjdC52ZXJzaW9ufS1zZXJ2ZXIvc2VydmVyL2xpYi9tYXZlbi1tb25pdG9yLTIuMi4wLmphcg0KLSAgICAgICAgICAgICAgICAgICAgPC9maWxlPg0KLSAgICAgICAgICAgICAgICAgIDwvZmlsZXM+DQotICAgICAgICAgICAgICAgIDwvcmVxdWlyZUZpbGVzRG9udEV4aXN0Pg0KLSAgICAgICAgICAgICAgPC9ydWxlcz4NCi0gICAgICAgICAgICAgIDxmYWlsPnRydWU8L2ZhaWw+DQotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPg0KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4NCi0gICAgICAgIDwvZXhlY3V0aW9ucz4NCi0gICAgICA8L3BsdWdpbj4NCi0gICAgPC9wbHVnaW5zPg0KLSAgPC9idWlsZD4NCi0gIDxuYW1lPlRlc3QgRGlzdHJpYnV0aW9uPC9uYW1lPg0KLSAgPGRlc2NyaXB0aW9uPkRpc3RyaWJ1dGlvbm1vZHVsPC9kZXNjcmlwdGlvbj4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTYxOS9kZXNjcmlwdG9yL3NyYy9hc3NlbWJseS9jbGllbnQueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTYxOS9kZXNjcmlwdG9yL3NyYy9hc3NlbWJseS9jbGllbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmUxNjI2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvZGVzY3JpcHRvci9zcmMvYXNzZW1ibHkvY2xpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+DQotPCEtLQ0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi11bmRlciB0aGUgTGljZW5zZS4NCi0tLT4NCi08YXNzZW1ibHkNCi0gICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIg0KLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIg0KLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMi54c2QiPg0KLSAgPGlkPmNsaWVudDwvaWQ+DQotICA8Zm9ybWF0cz4NCi0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4NCi0gIDwvZm9ybWF0cz4NCi0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+DQotDQotICA8bW9kdWxlU2V0cz4NCi0gICAgPG1vZHVsZVNldD4NCi0gICAgICA8dXNlQWxsUmVhY3RvclByb2plY3RzPnRydWU8L3VzZUFsbFJlYWN0b3JQcm9qZWN0cz4NCi0gICAgICA8aW5jbHVkZXM+DQotICAgICAgICA8aW5jbHVkZT5tYXZlbi1hc3NlbWJseS10ZXN0OiotY2xpZW50PC9pbmNsdWRlPg0KLSAgICAgIDwvaW5jbHVkZXM+DQotICAgICAgPGJpbmFyaWVzPg0KLSAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPg0KLSAgICAgICAgPCEtLSBpbmNsdWRlRGVwZW5kZW5jaWVzPnRydWU8L2luY2x1ZGVEZXBlbmRlbmNpZXMgLS0+DQotICAgICAgICA8IS0tIG91dHB1dEZpbGVOYW1lTWFwcGluZz50ZXN0ZGVwPC9vdXRwdXRGaWxlTmFtZU1hcHBpbmcgLS0+DQotICAgICAgICA8ZGVwZW5kZW5jeVNldHM+DQotICAgICAgICAgIDxkZXBlbmRlbmN5U2V0Pg0KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+ZGlyMTwvb3V0cHV0RGlyZWN0b3J5Pg0KLSAgICAgICAgICAgIDxpbmNsdWRlcz4NCi0gICAgICAgICAgICAgIDxpbmNsdWRlPmNvbW1vbnMtY29uZmlndXJhdGlvbjpjb21tb25zLWNvbmZpZ3VyYXRpb248L2luY2x1ZGU+DQotICAgICAgICAgICAgPC9pbmNsdWRlcz4NCi0gICAgICAgICAgPC9kZXBlbmRlbmN5U2V0Pg0KLSAgICAgICAgICA8ZGVwZW5kZW5jeVNldD4NCi0gICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmRpcjI8L291dHB1dERpcmVjdG9yeT4NCi0gICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz5mYWxzZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4NCi0gICAgICAgICAgICA8ZXhjbHVkZXM+DQotICAgICAgICAgICAgICA8ZXhjbHVkZT5jb21tb25zLWNvbmZpZ3VyYXRpb246Y29tbW9ucy1jb25maWd1cmF0aW9uPC9leGNsdWRlPg0KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+DQotICAgICAgICAgIDwvZGVwZW5kZW5jeVNldD4NCi0gICAgICAgIDwvZGVwZW5kZW5jeVNldHM+DQotICAgICAgPC9iaW5hcmllcz4NCi0gICAgPC9tb2R1bGVTZXQ+DQotICA8L21vZHVsZVNldHM+DQotPC9hc3NlbWJseT4NCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNjE5L2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTAyZTUwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWluc3RhbGwKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQyZDA5NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tYXNzZW1ibHktNjE5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi08IS0tDQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLXVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+DQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+DQotICA8Z3JvdXBJZD5tYXZlbi1hc3NlbWJseS10ZXN0PC9ncm91cElkPg0KLSAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktdGVzdDwvYXJ0aWZhY3RJZD4NCi0gIDx2ZXJzaW9uPjAuMC4xLVNOQVBTSE9UPC92ZXJzaW9uPg0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4NCi0gIDxkZXNjcmlwdGlvbj5NdWxpdHByb2plY3QgZm9yIHRlc3RpbmcgYXNzZW1ibHk8L2Rlc2NyaXB0aW9uPg0KLSAgPGJ1aWxkPg0KLSAgICA8ZGVmYXVsdEdvYWw+Y2xlYW4gcGFja2FnZTwvZGVmYXVsdEdvYWw+DQotICAgIDxwbHVnaW5NYW5hZ2VtZW50Pg0KLSAgICAgIDxwbHVnaW5zPg0KLSAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICA8dmVyc2lvbj4ke3Rlc3RWZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgIDwvcGx1Z2luPg0KLSAgICAgIDwvcGx1Z2lucz4NCi0gICAgPC9wbHVnaW5NYW5hZ2VtZW50Pg0KLSAgICA8cGx1Z2lucz4NCi0gICAgPC9wbHVnaW5zPg0KLQ0KLSAgPC9idWlsZD4NCi0gIDxtb2R1bGVzPg0KLSAgICA8bW9kdWxlPmNoaWxkLWNsaWVudDwvbW9kdWxlPg0KLSAgICA8bW9kdWxlPmRlc2NyaXB0b3I8L21vZHVsZT4NCi0gIDwvbW9kdWxlcz4NCi08L3Byb2plY3Q+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTYxOS92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbWFzc2VtYmx5LTYxOS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGQ3OWM4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL21hc3NlbWJseS02MTkvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuemlwLio7Ci0KLUZpbGUgZiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAiZGVzY3JpcHRvci90YXJnZXQvZGlzdHJpYnV0aW9uLTAuMC4xLVNOQVBTSE9ULWNsaWVudC9kaXIyL2NsYXNzd29ybGRzLTEuMS5qYXIiICk7Ci0KLXJldHVybiAhZi5leGlzdHMoKTsKLQotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDA0OGM5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPkNoaWxkIDE8L25hbWU+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDEvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIwOTc1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWU2MTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQxL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE0NjNlMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotICA8bmFtZT5DaGlsZCAyPC9uYW1lPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQyL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyMDk3NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQyL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQyL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVlNjE3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMy9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMzJhZjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMzwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+Q2hpbGQgMzwvbmFtZT4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMy9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQzL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjA5NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvY2hpbGQzL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMy9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL2NoaWxkMy9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZTYxNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9jaGlsZDMvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhZmJmZmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnktaW5saW5lCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2UvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhmMGQzMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgCi0gIDxuYW1lPlBhcmVudDwvbmFtZT4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQyPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDM8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2Uvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MmUzMDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtYmluYXJpZXNOb3RTb3VyY2Uvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5vcmcudGVzdDpjaGlsZDE8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy50ZXN0OmNoaWxkMzwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8YmluYXJpZXM+Ci0gICAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLSAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPGluY2x1ZGVEZXBlbmRlbmNpZXM+dHJ1ZTwvaW5jbHVkZURlcGVuZGVuY2llcz4KLSAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPC9iaW5hcmllcz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1iaW5hcmllc05vdFNvdXJjZS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBlOGRiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWJpbmFyaWVzTm90U291cmNlL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtYmluL2xpYi9jaGlsZDEuamFyIiApLmV4aXN0cygpOwotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtYmluL2xpYi9jaGlsZDMuamFyIiApLmV4aXN0cygpOwotCi1yZXN1bHQgPSByZXN1bHQgJiYgIW5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtYmluL2xpYi9jaGlsZDIuamFyIiApLmV4aXN0cygpOwotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtZmlsdGVyZWRGaWxlU2V0L2NoaWxkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1maWx0ZXJlZEZpbGVTZXQvY2hpbGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBiNTk0OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1maWx0ZXJlZEZpbGVTZXQvY2hpbGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8YXJ0aWZhY3RJZD5jaGlsZDwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+Q2hpbGQ8L25hbWU+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1maWx0ZXJlZEZpbGVTZXQvY2hpbGQvc3JjL2NvbmZpZy9hL2ZpbHRlcmVkLnR4dCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWZpbHRlcmVkRmlsZVNldC9jaGlsZC9zcmMvY29uZmlnL2EvZmlsdGVyZWQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzRmODRhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWZpbHRlcmVkRmlsZVNldC9jaGlsZC9zcmMvY29uZmlnL2EvZmlsdGVyZWQudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotT1MgVmVyc2lvbjogJHtvcy52ZXJzaW9ufQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWZpbHRlcmVkRmlsZVNldC9jaGlsZC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtZmlsdGVyZWRGaWxlU2V0L2NoaWxkL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYTBkNDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtZmlsdGVyZWRGaWxlU2V0L2NoaWxkL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLXRyeQotewotICBTdHJpbmcgamF2YVZlcnNpb24gPSBTeXN0ZW0uZ2V0UHJvcGVydHkoICJqYXZhLnZlcnNpb24iICk7Ci0gIEZpbGUgYSA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtYmluL2EvZmlsdGVyZWQudHh0Iik7Ci0gIAotICBCdWZmZXJlZFJlYWRlciByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGEpKTsKLSAgU3RyaW5nIGxpbmUgPSByLnJlYWRMaW5lKCk7Ci0gIGlmICggISBsaW5lLmVuZHNXaXRoKCBqYXZhVmVyc2lvbiApICkKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkV4cGVjdGVkIGphdmEgdmVyc2lvbjogIiArIGphdmFWZXJzaW9uICsgIlxuTGluZSB3YXM6ICIgKyBsaW5lICk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLX0KLQotcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1maWx0ZXJlZEZpbGVTZXQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWZpbHRlcmVkRmlsZVNldC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzA0YTJlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWZpbHRlcmVkRmlsZVNldC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAKLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLSAgPG5hbWU+UGFyZW50PC9uYW1lPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWZpbHRlcmVkRmlsZVNldC9zcmMvYXNzZW1ibGUvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWZpbHRlcmVkRmlsZVNldC9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyNDVmYi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1maWx0ZXJlZEZpbGVTZXQvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgCi0gIDxtb2R1bGVTZXRzPgotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICA8c291cmNlcz4KLSAgICAgICAgPGZpbGVTZXRzPgotICAgICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvY29uZmlnL2E8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+YTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICAgICAgPGZpbHRlcmVkPnRydWU8L2ZpbHRlcmVkPgotICAgICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPC9maWxlU2V0cz4KLSAgICAgIDwvc291cmNlcz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLWZpbHRlcmVkRmlsZVNldC92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtZmlsdGVyZWRGaWxlU2V0L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyMGFhODAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtZmlsdGVyZWRGaWxlU2V0L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLXRyeQotewotICBTdHJpbmcgb3NWZXJzaW9uID0gU3lzdGVtLmdldFByb3BlcnR5KCAib3MudmVyc2lvbiIgKTsKLSAgRmlsZSBhID0gbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvcGFyZW50LTEuMC1iaW4vY2hpbGQvYS9maWx0ZXJlZC50eHQiKTsKLSAgCi0gIEJ1ZmZlcmVkUmVhZGVyIHIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoYSkpOwotICBTdHJpbmcgbGluZSA9IHIucmVhZExpbmUoKTsKLSAgaWYgKCAhIGxpbmUuZW5kc1dpdGgoIG9zVmVyc2lvbiApICkKLSAgewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkV4cGVjdGVkIE9TIHZlcnNpb246ICIgKyBvc1ZlcnNpb24gKTsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJMaW5lIHdhczogIiArIGxpbmUgKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLWNhdGNoKCBJT0V4Y2VwdGlvbiBlICkKLXsKLSAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotfQotCi1yZXR1cm4gdHJ1ZTsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1tb2R1bGVQb21Qcm9wSW50ZXJwL2NoaWxkMS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTcyNTdlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgCi0gIDxwcm9wZXJ0aWVzPgotICAgIDxmb28+YmFyPC9mb28+Ci0gIDwvcHJvcGVydGllcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1tb2R1bGVQb21Qcm9wSW50ZXJwL2NoaWxkMS9zcmMvbWFpbi9yZXNvdXJjZXMvYXNzZW1ibHktcmVzb3VyY2VzL3Rlc3QudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZmJiZjdjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvY2hpbGQxL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJseS1yZXNvdXJjZXMvdGVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1Qcm9qZWN0IFZlcnNpb246ICR7cHJvamVjdC52ZXJzaW9ufQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvY2hpbGQyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1tb2R1bGVQb21Qcm9wSW50ZXJwL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDc5OWUxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvY2hpbGQyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMjwvYXJ0aWZhY3RJZD4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvY2hpbGQyL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtbW9kdWxlUG9tUHJvcEludGVycC9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNWYyZGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtbW9kdWxlUG9tUHJvcEludGVycC9jaGlsZDIvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4yIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjIueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDx1c2VBbGxSZWFjdG9yUHJvamVjdHM+dHJ1ZTwvdXNlQWxsUmVhY3RvclByb2plY3RzPgotICAgICAgCi0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxiaW5hcmllcz4KLSAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke21vZHVsZS5wcm9wZXJ0aWVzLmZvb30vJHttb2R1bGUuYXJ0aWZhY3RJZH08L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPGRlcGVuZGVuY3lTZXRzPgotICAgICAgICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgICAgICAgPHVzZVByb2plY3RBcnRpZmFjdD50cnVlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgotICAgICAgICA8L2RlcGVuZGVuY3lTZXRzPgotICAgICAgPC9iaW5hcmllcz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLW1vZHVsZVBvbVByb3BJbnRlcnAvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJhZDVjYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1tb2R1bGVQb21Qcm9wSW50ZXJwL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICAKLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1tb2R1bGVQb21Qcm9wSW50ZXJwL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1tb2R1bGVQb21Qcm9wSW50ZXJwL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4NDUyNDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtbW9kdWxlUG9tUHJvcEludGVycC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1GaWxlIGYgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkMi90YXJnZXQvY2hpbGQyLTEtYmluL2Jhci9jaGlsZDEiICk7Ci1yZXR1cm4gZi5leGlzdHMoKSAmJiBmLmlzRGlyZWN0b3J5KCk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9jaGlsZDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5OTY2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgICA8cmVsYXRpdmVQYXRoPi4uL3BhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L2NoaWxkMS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9jaGlsZDEvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyMDk3NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L2NoaWxkMS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L2NoaWxkMS9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvY2hpbGQxL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVlNjE3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvY2hpbGQxL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvY2hpbGQyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2ODQ0ODcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gICAgPHJlbGF0aXZlUGF0aD4uLi9wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvY2hpbGQyL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjA5NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9jaGlsZDIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L2NoaWxkMi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZTYxNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L2NoaWxkMi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvcGFyZW50L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L3BhcmVudC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzY5Yjc2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvcGFyZW50L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgCi0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPi4uL2NoaWxkMTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Li4vY2hpbGQyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zaWJsaW5nUGFyZW50L3BhcmVudC9zcmMvYXNzZW1ibGUvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvcGFyZW50L3NyYy9hc3NlbWJsZS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOThhMTk1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvcGFyZW50L3NyYy9hc3NlbWJsZS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxtb2R1bGVTZXRzPgotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT50ZXN0OmNoaWxkMjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8c291cmNlcz4KLSAgICAgICAgPGluY2x1ZGVNb2R1bGVEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVNb2R1bGVEaXJlY3Rvcnk+Ci0gICAgICAgIDxmaWxlU2V0cz4KLSAgICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+c291cmNlcy8ke2FydGlmYWN0LmFydGlmYWN0SWR9PC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+dGFyZ2V0LyoqPC9leGNsdWRlPgotICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qfjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8L2ZpbGVTZXRzPgotICAgICAgPC9zb3VyY2VzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9wYXJlbnQvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNpYmxpbmdQYXJlbnQvcGFyZW50L3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhOGFjOTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc2libGluZ1BhcmVudC9wYXJlbnQvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvcGFyZW50LTEtc3JjL3NvdXJjZXMvY2hpbGQxL3BvbS54bWwiICkuZXhpc3RzKCk7Ci0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9wYXJlbnQtMS1zcmMvc291cmNlcy9jaGlsZDIvcG9tLnhtbCIgKS5leGlzdHMoKTsKLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDQ4YzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMTwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+Q2hpbGQgMTwvbmFtZT4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQxL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjA5NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQxL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMS9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMS9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZTYxNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDEvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ2M2UwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPkNoaWxkIDI8L25hbWU+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIwOTc1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWU2MTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQyL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQzL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzMmFmMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQzPC9hcnRpZmFjdElkPgotICA8bmFtZT5DaGlsZCAzPC9uYW1lPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQzL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDMvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyMDk3NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9jaGlsZDMvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQzL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvY2hpbGQzL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVlNjE3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2NoaWxkMy9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGIyYTNiYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NDgzNDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIAotICA8bmFtZT5QYXJlbnQ8L25hbWU+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQzPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+cGFja2FnZTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPmRpcmVjdG9yeS1pbmxpbmU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy9zcmMvYXNzZW1ibGUvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL3NyYy9hc3NlbWJsZS9zcmMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWE1ZTE4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXNvdXJjZU5vdEJpbmFyaWVzL3NyYy9hc3NlbWJsZS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5zcmM8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxtb2R1bGVTZXRzPgotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy50ZXN0OmNoaWxkMTwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+b3JnLnRlc3Q6Y2hpbGQzPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxzb3VyY2VzPgotICAgICAgICA8aW5jbHVkZU1vZHVsZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZU1vZHVsZURpcmVjdG9yeT4KLSAgICAgICAgPGZpbGVTZXRzPgotICAgICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5zb3VyY2VzLyR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH08L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+LjwvZGlyZWN0b3J5PgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICA8ZXhjbHVkZT50YXJnZXQvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgIDxleGNsdWRlPioqLyp+PC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDwvZmlsZVNldHM+Ci0gICAgICA8L3NvdXJjZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtc291cmNlTm90QmluYXJpZXMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlNWVlMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS1zb3VyY2VOb3RCaW5hcmllcy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9wYXJlbnQtMS4wLXNyYy9zb3VyY2VzL2NoaWxkMS9wb20ueG1sIiApLmV4aXN0cygpOwotCi1yZXN1bHQgPSByZXN1bHQgJiYgIW5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3BhcmVudC0xLjAtc3JjL3NvdXJjZXMvY2hpbGQyL3BvbS54bWwiICkuZXhpc3RzKCk7Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMDQ4YzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPkNoaWxkIDE8L25hbWU+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQxL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQxL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxMjA5NzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMS9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQxL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMS9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVlZTYxNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQxL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQ2M2UwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQyPC9hcnRpZmFjdElkPgotICA8bmFtZT5DaGlsZCAyPC9uYW1lPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMi9zcmMvbWFpbi9qYXZhL29yZy90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIwOTc1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDIvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDIvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZWU2MTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkMi9zcmMvdGVzdC9qYXZhL29yZy90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2MzMmFmMS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkMzwvYXJ0aWZhY3RJZD4KLSAgPG5hbWU+Q2hpbGQgMzwvbmFtZT4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDMvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDMvc3JjL21haW4vamF2YS9vcmcvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyMDk3NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQzL3NyYy9tYWluL2phdmEvb3JnL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDMvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQzL3NyYy90ZXN0L2phdmEvb3JnL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWVlNjE3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9jaGlsZDMvc3JjL3Rlc3QvamF2YS9vcmcvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQ0L3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQ0L3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMTczMTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkNC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZDQ8L2FydGlmYWN0SWQ+Ci0gIDxuYW1lPkNoaWxkIDQgLSBBc3NlbWJsZXI8L25hbWU+Ci0gIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLQotICA8IS0tIFVzZWQgdG8gZW5zdXJlIHRoaXMgY2hpbGQgaXMgc29ydGVkIExBU1QuCi0gICAgICAgTk9UIHVzZWQgYnkgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IhIC0tPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDE8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jaGlsZDM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQ0L3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL2NoaWxkNC9zcmMvYXNzZW1ibGUvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhMTM4Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvY2hpbGQ0L3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDwhLS0gVGhpcyBpcyB0aGUga2V5IHRvIHRoaXMgY29uZmlndXJhdGlvbiAtLT4KLSAgICAgIDx1c2VBbGxSZWFjdG9yUHJvamVjdHM+dHJ1ZTwvdXNlQWxsUmVhY3RvclByb2plY3RzPgotICAgICAgCi0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy50ZXN0OmNoaWxkMTwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+b3JnLnRlc3Q6Y2hpbGQzPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxiaW5hcmllcz4KLSAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke2FydGlmYWN0LmFydGlmYWN0SWR9LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufTwvb3V0cHV0RmlsZU5hbWVNYXBwaW5nPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmxpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8aW5jbHVkZURlcGVuZGVuY2llcz5mYWxzZTwvaW5jbHVkZURlcGVuZGVuY2llcz4KLSAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPC9iaW5hcmllcz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gcGFja2FnZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvbXVsdGltb2R1bGUtd2hvbGVSZWFjdG9yRnJvbUNoaWxkL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI5NTVlMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gIAotICA8bmFtZT5QYXJlbnQ8L25hbWU+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQzPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDQ8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS9tdWx0aW1vZHVsZS13aG9sZVJlYWN0b3JGcm9tQ2hpbGQvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGRkM2NjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL211bHRpbW9kdWxlLXdob2xlUmVhY3RvckZyb21DaGlsZC92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLWlmICggIW5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQ0L3RhcmdldC9jaGlsZDQtMS4wLWJpbi9saWIvY2hpbGQxLmphciIgKS5leGlzdHMoKSApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ2hpbGQtMSBqYXIgaXMgTk9UIGluIG91dHB1dCEiICk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLWlmICggIW5ldyBGaWxlKCBiYXNlZGlyLCAiY2hpbGQ0L3RhcmdldC9jaGlsZDQtMS4wLWJpbi9saWIvY2hpbGQzLmphciIgKS5leGlzdHMoKSApCi17Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ2hpbGQtMyBqYXIgaXMgTk9UIGluIG91dHB1dCEiICk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLWlmICggbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZDQvdGFyZ2V0L2NoaWxkNC0xLjAtYmluL2xpYi9jaGlsZDIuamFyIiApLmV4aXN0cygpICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDaGlsZC0yIGphciBTSE9VTEQgTk9UIEJFIGluIG91dHB1dCEiICk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5YWIzOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD50d28tbGV2ZWwtbXVsdGltb2R1bGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkLWxldmVsMS1wcm9qZWN0MTwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkY2M5MjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZC1sZXZlbDEtcHJvamVjdDI8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQtbGV2ZWwyLXByb2plY3QxPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGFhOTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnR3by1sZXZlbC1tdWx0aW1vZHVsZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQtbGV2ZWwxLXByb2plY3QyPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkLWxldmVsMi1wcm9qZWN0MTwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk1NTAwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnkKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzODlhMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+dHdvLWxldmVsLW11bHRpbW9kdWxlPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkLWxldmVsMS1wcm9qZWN0MTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQtbGV2ZWwxLXByb2plY3QyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmY3ZTg3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS1kb250SW5jbHVkZVN1Yk1vZHVsZXMvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGluY2x1ZGVTdWJNb2R1bGVzPmZhbHNlPC9pbmNsdWRlU3ViTW9kdWxlcz4KLSAgICAgIDxiaW5hcmllcz4KLSAgICAgICAgPG91dHB1dERpcmVjdG9yeT5tb2R1bGVzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KLSAgICAgIDwvYmluYXJpZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUtZG9udEluY2x1ZGVTdWJNb2R1bGVzL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNWMzNmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXRyeQotewotICAgIHJlc3VsdCA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3R3by1sZXZlbC1tdWx0aW1vZHVsZS0xLjAtU05BUFNIT1QtYmluL21vZHVsZXMvY2hpbGQtbGV2ZWwxLXByb2plY3QxLTEuMC1TTkFQU0hPVC5qYXIiICkuZXhpc3RzKCk7ICAgCi0KLSAgICByZXN1bHQgPSByZXN1bHQgJiYgIW5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3R3by1sZXZlbC1tdWx0aW1vZHVsZS0xLjAtU05BUFNIT1QtYmluL21vZHVsZXMvY2hpbGQtbGV2ZWwyLXByb2plY3QxLTEuMC1TTkFQU0hPVC5qYXIiICkuZXhpc3RzKCk7ICAgCi19Ci1jYXRjaCggSU9FeGNlcHRpb24gZSApCi17Ci0gICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICByZXN1bHQgPSBmYWxzZTsKLX0KLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5YWIzOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnR3by1sZXZlbC1tdWx0aW1vZHVsZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQtbGV2ZWwxLXByb2plY3QxPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkY2M5MjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmNoaWxkLWxldmVsMS1wcm9qZWN0MjwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZC1sZXZlbDItcHJvamVjdDE8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGFhOTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8cGFyZW50PgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dHdvLWxldmVsLW11bHRpbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZC1sZXZlbDEtcHJvamVjdDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQtbGV2ZWwyLXByb2plY3QxPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk1NTAwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9cGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tYXNzZW1ibHktcGx1Z2luOiR7dGVzdFZlcnNpb259OmRpcmVjdG9yeQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IzODlhMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+aXQtcHJvamVjdC1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIAotICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD50d28tbGV2ZWwtbXVsdGltb2R1bGU8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQtbGV2ZWwxLXByb2plY3QxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZC1sZXZlbDEtcHJvamVjdDI8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmxlL2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTdmMWE3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbC1tdWx0aW1vZHVsZS9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+Ci0gIDxpZD5iaW48L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmRpcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+Ci0gIDxtb2R1bGVTZXRzPgotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICA8YmluYXJpZXM+Ci0gICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bW9kdWxlczwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgICA8dW5wYWNrPmZhbHNlPC91bnBhY2s+Ci0gICAgICA8L2JpbmFyaWVzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVsLW11bHRpbW9kdWxlL3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIxZWMxMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWwtbXVsdGltb2R1bGUvdmVyaWZ5LmJzaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLm5ldC4qOwotaW1wb3J0IGphdmEudXRpbC5qYXIuKjsKLQotYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotCi10cnkKLXsKLSAgICByZXN1bHQgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90d28tbGV2ZWwtbXVsdGltb2R1bGUtMS4wLVNOQVBTSE9ULWJpbi9tb2R1bGVzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS0xLjAtU05BUFNIT1QuamFyIiApLmV4aXN0cygpOyAgIAotICAgIHJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90d28tbGV2ZWwtbXVsdGltb2R1bGUtMS4wLVNOQVBTSE9ULWJpbi9tb2R1bGVzL2NoaWxkLWxldmVsMi1wcm9qZWN0MS0xLjAtU05BUFNIT1QuamFyIiApLmV4aXN0cygpOyAgIAotfQotY2F0Y2goIElPRXhjZXB0aW9uIGUgKQotewotICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgcmVzdWx0ID0gZmFsc2U7Ci19Ci0KLXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vY2hpbGQtbGV2ZWwxLXByb2plY3QxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vY2hpbGQtbGV2ZWwxLXByb2plY3QxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZWQ0ZTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD50d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkLWxldmVsMS1wcm9qZWN0MTwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGNjOTIyLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZC1sZXZlbDEtcHJvamVjdDI8L2FydGlmYWN0SWQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQtbGV2ZWwyLXByb2plY3QxPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGY2MThlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9jaGlsZC1sZXZlbDEtcHJvamVjdDIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdD4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnR3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbjwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQtbGV2ZWwxLXByb2plY3QyPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkLWxldmVsMi1wcm9qZWN0MTwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL2ludm9rZXIucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWFmYmZmYS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vaW52b2tlci5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0jIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotIyBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotIyByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0jIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSMgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotIyB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1pbnZva2VyLmdvYWxzPWNsZWFuIHBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnktaW5saW5lCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlY2M4MzZjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnR3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZC1sZXZlbDEtcHJvamVjdDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkLWxldmVsMS1wcm9qZWN0MjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vc3JjL2Fzc2VtYmxlL2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4vc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2ZlZGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL3NyYy9hc3NlbWJsZS9iaW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pm1vZHVsZXM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPC9iaW5hcmllcz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aEJpbi92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkZWJmYjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoQmluL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotU3RyaW5nIGZpbmFsTmFtZSA9ICJ0d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhCaW4tMS4wLVNOQVBTSE9UIjsKLVN0cmluZyByb290RGlyID0gInRhcmdldC8iICsgZmluYWxOYW1lICsgIi1iaW4vIiArIGZpbmFsTmFtZSArICIvbW9kdWxlcy8iOwotCi1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsIHJvb3REaXIgKyAiY2hpbGQtbGV2ZWwxLXByb2plY3QxLTEuMC1TTkFQU0hPVC5qYXIiICkuZXhpc3RzKCk7ICAgCi0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgcm9vdERpciArICJjaGlsZC1sZXZlbDItcHJvamVjdDEtMS4wLVNOQVBTSE9ULmphciIgKS5leGlzdHMoKTsgICAKLQotcmV0dXJuIHJlc3VsdDsKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVmZjVjOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz48cHJvamVjdD4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnR3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYzwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQtbGV2ZWwxLXByb2plY3QxPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIHRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkY2M5MjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxhcnRpZmFjdElkPmNoaWxkLWxldmVsMS1wcm9qZWN0MjwvYXJ0aWZhY3RJZD4KLSAgICA8Z3JvdXBJZD50ZXN0PC9ncm91cElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZC1sZXZlbDItcHJvamVjdDE8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVjMTIwNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkNjIyZWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0PgotICA8cGFyZW50PgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZC1sZXZlbDEtcHJvamVjdDI8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLQotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQtbGV2ZWwyLXByb2plY3QxPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9pbnZva2VyLnByb3BlcnRpZXMgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg2ZDViLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9pbnZva2VyLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSMgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0jIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0jIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSMgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIyAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0jIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotIyBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIyAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSMgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0jIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWludm9rZXIuZ29hbHM9Y2xlYW4gb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zOm1hdmVuLWFzc2VtYmx5LXBsdWdpbjoke3Rlc3RWZXJzaW9ufTpkaXJlY3RvcnktaW5saW5lCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDJlYTRlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnR3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYzwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZC1sZXZlbDEtcHJvamVjdDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkLWxldmVsMS1wcm9qZWN0MjwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvc3JjLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvc3JjL2Fzc2VtYmxlL3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMvc3JjL2Fzc2VtYmxlL3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1MjhiNjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL3NyYy9hc3NlbWJsZS9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGluY2x1ZGVTdWJNb2R1bGVzPnRydWU8L2luY2x1ZGVTdWJNb2R1bGVzPgotCi0gICAgICA8c291cmNlcz4KLSAgICAgICAgPGV4Y2x1ZGVTdWJNb2R1bGVEaXJlY3Rvcmllcz50cnVlPC9leGNsdWRlU3ViTW9kdWxlRGlyZWN0b3JpZXM+Ci0gICAgICAgIDxpbmNsdWRlTW9kdWxlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVNb2R1bGVEaXJlY3Rvcnk+Ci0gICAgICAgIDxvdXRwdXREaXJlY3RvcnlNYXBwaW5nPm1vZHVsZXMvJHttb2R1bGUuYXJ0aWZhY3RJZH08L291dHB1dERpcmVjdG9yeU1hcHBpbmc+Ci0KLSAgICAgICAgPGZpbGVTZXRzPgotICAgICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICAgIDxleGNsdWRlPioqLy5zdm4vKio8L2V4Y2x1ZGU+Ci0gICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgIDwvZmlsZVNldD4KLSAgICAgICAgPC9maWxlU2V0cz4KLSAgICAgIDwvc291cmNlcz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3by1sZXZlbHMtaW5jbHVkZUJhc2VEaXItd2l0aFNyYy92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiYWUzYTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvLWxldmVscy1pbmNsdWRlQmFzZURpci13aXRoU3JjL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS5uZXQuKjsKLWltcG9ydCBqYXZhLnV0aWwuamFyLio7Ci0KLWJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTsKLQotU3RyaW5nIGZpbmFsTmFtZSA9ICJ0d28tbGV2ZWxzLWluY2x1ZGVCYXNlRGlyLXdpdGhTcmMtMS4wLVNOQVBTSE9UIjsKLVN0cmluZyByb290RGlyID0gInRhcmdldC8iICsgZmluYWxOYW1lICsgIi1zcmMvIiArIGZpbmFsTmFtZSArICIvbW9kdWxlcy8iOwotCi1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsIHJvb3REaXIgKyAiY2hpbGQtbGV2ZWwxLXByb2plY3QxL3BvbS54bWwiICkuZXhpc3RzKCk7ICAgCi0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgcm9vdERpciArICJjaGlsZC1sZXZlbDEtcHJvamVjdDIvcG9tLnhtbCIgKS5leGlzdHMoKTsgICAKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCByb290RGlyICsgImNoaWxkLWxldmVsMi1wcm9qZWN0MS9wb20ueG1sIiApLmV4aXN0cygpOyAgIAotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzlhYjM4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dHdvLWxldmVsLW11bHRpbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZC1sZXZlbDEtcHJvamVjdDE8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA0NDJmMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHBUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1YzEyMDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRjYzkyMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQtbGV2ZWwxLXByb2plY3QyPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkLWxldmVsMi1wcm9qZWN0MTwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwMi5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9jaGlsZC1sZXZlbDItcHJvamVjdDEvc3JjL21haW4vamF2YS90ZXN0L0FwcDIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNkZmViNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAyIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwMlRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHAyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTFiMjdiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHAyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcDIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAyVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwMlRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcDJUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcDIoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci9jaGlsZC1sZXZlbDEtcHJvamVjdDIvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci9jaGlsZC1sZXZlbDEtcHJvamVjdDIvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY4YWE5Ni4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD50d28tbGV2ZWwtbXVsdGltb2R1bGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkLWxldmVsMS1wcm9qZWN0MjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZC1sZXZlbDItcHJvamVjdDE8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ODZkNWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tYXNzZW1ibHktcGx1Z2luOiR7dGVzdFZlcnNpb259OmRpcmVjdG9yeS1pbmxpbmUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMjg1NTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+dHdvLWxldmVsLW11bHRpbW9kdWxlPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkLWxldmVsMS1wcm9qZWN0MTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQtbGV2ZWwxLXByb2plY3QyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtZG9udEluY2x1ZGVTdWJNb2R1bGVzLWFydGlmYWN0SWRFeHByT3V0RGlyL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTViZGZlNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPGluY2x1ZGVTdWJNb2R1bGVzPmZhbHNlPC9pbmNsdWRlU3ViTW9kdWxlcz4KLSAgICAgIDxzb3VyY2VzPgotICAgICAgICA8ZXhjbHVkZVN1Yk1vZHVsZURpcmVjdG9yaWVzPmZhbHNlPC9leGNsdWRlU3ViTW9kdWxlRGlyZWN0b3JpZXM+Ci0gICAgICAgIDxmaWxlU2V0cz4KLSAgICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovLnN2bjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovdGFyZ2V0PC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDwvZmlsZVNldHM+Ci0gICAgICA8L3NvdXJjZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1kb250SW5jbHVkZVN1Yk1vZHVsZXMtYXJ0aWZhY3RJZEV4cHJPdXREaXIvdmVyaWZ5LmJzaCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYTVjZWQ3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWRvbnRJbmNsdWRlU3ViTW9kdWxlcy1hcnRpZmFjdElkRXhwck91dERpci92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90d28tbGV2ZWwtbXVsdGltb2R1bGUtMS4wLVNOQVBTSE9ULXNyYy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbCIgKS5leGlzdHMoKTsgICAKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3R3by1sZXZlbC1tdWx0aW1vZHVsZS0xLjAtU05BUFNIT1Qtc3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9wb20ueG1sIiApLmV4aXN0cygpOyAgIAotCi1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdHdvLWxldmVsLW11bHRpbW9kdWxlLTEuMC1TTkFQU0hPVC1zcmMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9wb20ueG1sIiApLmV4aXN0cygpOyAgIAotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5YWIzOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pjxwcm9qZWN0PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+dHdvLWxldmVsLW11bHRpbW9kdWxlPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD5jaGlsZC1sZXZlbDEtcHJvamVjdDE8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjEuMC1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWluY2x1ZGVTdWJNb2R1bGVzLWV4Y2x1ZGVTdWJNb2R1bGVTb3VyY2VEaXJzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNDQyZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvY2hpbGQtbGV2ZWwxLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvc3JjL3Rlc3QvamF2YS90ZXN0L0FwcFRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWluY2x1ZGVTdWJNb2R1bGVzLWV4Y2x1ZGVTdWJNb2R1bGVTb3VyY2VEaXJzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNWMxMjA1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWluY2x1ZGVTdWJNb2R1bGVzLWV4Y2x1ZGVTdWJNb2R1bGVTb3VyY2VEaXJzL2NoaWxkLWxldmVsMS1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcC4KLSAqLwotcHVibGljIGNsYXNzIEFwcFRlc3QgCi0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdGVzdCBjYXNlCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGVzdE5hbWUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlCi0gICAgICovCi0gICAgcHVibGljIEFwcFRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcFRlc3QuY2xhc3MgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSaWdvdXJvdXMgVGVzdCA6LSkKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydFRydWUoIHRydWUgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkY2M5MjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+PHByb2plY3Q+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+Y2hpbGQtbGV2ZWwxLXByb2plY3QyPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPnRlc3Q8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkLWxldmVsMi1wcm9qZWN0MTwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy9tYWluL2phdmEvdGVzdC9BcHAyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjZGZlYjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvbWFpbi9qYXZhL3Rlc3QvQXBwMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAyIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHAyVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9zcmMvdGVzdC9qYXZhL3Rlc3QvQXBwMlRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxYjI3Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9jaGlsZC1sZXZlbDEtcHJvamVjdDIvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3NyYy90ZXN0L2phdmEvdGVzdC9BcHAyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSB0ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdFN1aXRlOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Igc2ltcGxlIEFwcDIuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAyVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwMlRlc3QoIFN0cmluZyB0ZXN0TmFtZSApCi0gICAgewotICAgICAgICBzdXBlciggdGVzdE5hbWUgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBzdWl0ZSBvZiB0ZXN0cyBiZWluZyB0ZXN0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBUZXN0U3VpdGUoIEFwcDJUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcDIoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWluY2x1ZGVTdWJNb2R1bGVzLWV4Y2x1ZGVTdWJNb2R1bGVTb3VyY2VEaXJzL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OGFhOTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3Q+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD50d28tbGV2ZWwtbXVsdGltb2R1bGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxhcnRpZmFjdElkPmNoaWxkLWxldmVsMS1wcm9qZWN0MjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotCi0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZC1sZXZlbDItcHJvamVjdDE8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjg2ZDViLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWluY2x1ZGVTdWJNb2R1bGVzLWV4Y2x1ZGVTdWJNb2R1bGVTb3VyY2VEaXJzL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tYXNzZW1ibHktcGx1Z2luOiR7dGVzdFZlcnNpb259OmRpcmVjdG9yeS1pbmxpbmUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWluY2x1ZGVTdWJNb2R1bGVzLWV4Y2x1ZGVTdWJNb2R1bGVTb3VyY2VEaXJzL3BvbS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjI4NTU4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWluY2x1ZGVTdWJNb2R1bGVzLWV4Y2x1ZGVTdWJNb2R1bGVTb3VyY2VEaXJzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICAKLSAgPGdyb3VwSWQ+dGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+dHdvLWxldmVsLW11bHRpbW9kdWxlPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkLWxldmVsMS1wcm9qZWN0MTwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQtbGV2ZWwxLXByb2plY3QyPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL211bHRpbW9kdWxlL3R3b0xldmVsLWluY2x1ZGVTdWJNb2R1bGVzLWV4Y2x1ZGVTdWJNb2R1bGVTb3VyY2VEaXJzL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjZjAyOWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgICAgPHNvdXJjZXM+Ci0gICAgICAgIDxmaWxlU2V0cz4KLSAgICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovLnN2bjwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgPGV4Y2x1ZGU+dGFyZ2V0LyoqPC9leGNsdWRlPgotICAgICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDwvZmlsZVNldHM+Ci0gICAgICA8L3NvdXJjZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvbXVsdGltb2R1bGUvdHdvTGV2ZWwtaW5jbHVkZVN1Yk1vZHVsZXMtZXhjbHVkZVN1Yk1vZHVsZVNvdXJjZURpcnMvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjI1NmY5ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9tdWx0aW1vZHVsZS90d29MZXZlbC1pbmNsdWRlU3ViTW9kdWxlcy1leGNsdWRlU3ViTW9kdWxlU291cmNlRGlycy92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0Lio7Ci1pbXBvcnQgamF2YS51dGlsLmphci4qOwotCi1ib29sZWFuIHJlc3VsdCA9IHRydWU7Ci0KLXJlc3VsdCA9IHJlc3VsdCAmJiBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90d28tbGV2ZWwtbXVsdGltb2R1bGUtMS4wLVNOQVBTSE9ULXNyYy9jaGlsZC1sZXZlbDEtcHJvamVjdDEvcG9tLnhtbCIgKS5leGlzdHMoKTsgICAKLQotcmVzdWx0ID0gcmVzdWx0ICYmIG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3R3by1sZXZlbC1tdWx0aW1vZHVsZS0xLjAtU05BUFNIT1Qtc3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0Mi9wb20ueG1sIiApLmV4aXN0cygpOyAgIAotCi1yZXN1bHQgPSByZXN1bHQgJiYgbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdHdvLWxldmVsLW11bHRpbW9kdWxlLTEuMC1TTkFQU0hPVC1zcmMvY2hpbGQtbGV2ZWwyLXByb2plY3QxL3BvbS54bWwiICkuZXhpc3RzKCk7ICAgCi0KLXJlc3VsdCA9IHJlc3VsdCAmJiAhbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdHdvLWxldmVsLW11bHRpbW9kdWxlLTEuMC1TTkFQU0hPVC1zcmMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL2NoaWxkLWxldmVsMi1wcm9qZWN0MS9wb20ueG1sIiApLmV4aXN0cygpOyAgIAotCi1yZXN1bHQgPSByZXN1bHQgJiYgIW5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L3R3by1sZXZlbC1tdWx0aW1vZHVsZS0xLjAtU05BUFNIT1Qtc3JjL2NoaWxkLWxldmVsMS1wcm9qZWN0MS90YXJnZXQiICkuZXhpc3RzKCk7ICAgCi0KLXJlc3VsdCA9IHJlc3VsdCAmJiAhbmV3IEZpbGUoIGJhc2VkaXIsICJ0YXJnZXQvdHdvLWxldmVsLW11bHRpbW9kdWxlLTEuMC1TTkFQU0hPVC1zcmMvY2hpbGQtbGV2ZWwxLXByb2plY3QyL3RhcmdldCIgKS5leGlzdHMoKTsgICAKLQotcmVzdWx0ID0gcmVzdWx0ICYmICFuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC90d28tbGV2ZWwtbXVsdGltb2R1bGUtMS4wLVNOQVBTSE9ULXNyYy9jaGlsZC1sZXZlbDItcHJvamVjdDEvdGFyZ2V0IiApLmV4aXN0cygpOyAgIAotCi1yZXR1cm4gcmVzdWx0OwpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL2Jhc2ljLXJlcG9zaXRvcnkvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL2Jhc2ljLXJlcG9zaXRvcnkvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9iYXNpYy1yZXBvc2l0b3J5L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvYmFzaWMtcmVwb3NpdG9yeS9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL2Jhc2ljLXJlcG9zaXRvcnkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIwZGJkNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvYmFzaWMtcmVwb3NpdG9yeS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+cmVwb3NpdG9yeS1hc3NlbWJseTwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8bmFtZT5NYXZlbiBRdWljayBTdGFydCBBcmNoZXR5cGU8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJsZS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDxmaW5hbE5hbWU+YXNzZW1ibHk8L2ZpbmFsTmFtZT4gICAgICAgIAotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9iYXNpYy1yZXBvc2l0b3J5L3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL2Jhc2ljLXJlcG9zaXRvcnkvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZmU3MmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL2Jhc2ljLXJlcG9zaXRvcnkvc3JjL2Fzc2VtYmxlL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPHJlcG9zaXRvcmllcz4KLSAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+cmVwbzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5qdW5pdDpqdW5pdDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9yZXBvc2l0b3J5PgotICA8L3JlcG9zaXRvcmllcz4KLTwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvYmFzaWMtcmVwb3NpdG9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvYmFzaWMtcmVwb3NpdG9yeS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3QvQXBwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiNTY4YzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL2Jhc2ljLXJlcG9zaXRvcnkvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0L0FwcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqCi0gKiBIZWxsbyB3b3JsZCEKLSAqCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHAgCi17Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oIFN0cmluZ1tdIGFyZ3MgKQotICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiSGVsbG8gV29ybGQhIiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9iYXNpYy1yZXBvc2l0b3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvYmFzaWMtcmVwb3NpdG9yeS9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3QvQXBwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTc4YzM1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9iYXNpYy1yZXBvc2l0b3J5L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdGVzdC9BcHBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3Q7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0U3VpdGU7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBzaW1wbGUgQXBwLgotICovCi1wdWJsaWMgY2xhc3MgQXBwVGVzdCAKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB0ZXN0IGNhc2UKLSAgICAgKgotICAgICAqIEBwYXJhbSB0ZXN0TmFtZSBuYW1lIG9mIHRoZSB0ZXN0IGNhc2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQXBwVGVzdCggU3RyaW5nIHRlc3ROYW1lICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCB0ZXN0TmFtZSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHN1aXRlIG9mIHRlc3RzIGJlaW5nIHRlc3RlZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFRlc3RTdWl0ZSggQXBwVGVzdC5jbGFzcyApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJpZ291cm91cyBUZXN0IDotKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHRlc3RBcHAoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9iYXNpYy1yZXBvc2l0b3J5L3ZlcmlmeS5ic2ggYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvYmFzaWMtcmVwb3NpdG9yeS92ZXJpZnkuYnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTg1MTMxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9iYXNpYy1yZXBvc2l0b3J5L3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUganVuaXRKYXIgPSBuZXcgRmlsZSggYmFzZWRpciwgInRhcmdldC9hc3NlbWJseS1iaW4vcmVwby9qdW5pdC9qdW5pdC8zLjguMS9qdW5pdC0zLjguMS5qYXIiICk7Ci0KLXJldHVybiBqdW5pdEphci5leGlzdHMoKTsKLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL21hc3NlbWJseS0xOTYvaW52b2tlci5wcm9wZXJ0aWVzIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL21hc3NlbWJseS0xOTYvaW52b2tlci5wcm9wZXJ0aWVzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzQzYWE0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9tYXNzZW1ibHktMTk2L2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1jbGVhbiBwYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvbWFzc2VtYmx5LTE5Ni9wb20ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL21hc3NlbWJseS0xOTYvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI4M2RlZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvbWFzc2VtYmx5LTE5Ni9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5pdC1wcm9qZWN0LXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPm1hc3NlbWJseS0xOTY8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIAotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuOC4xPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPnNpbmdsZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9tYXNzZW1ibHktMTk2L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvbWFzc2VtYmx5LTE5Ni9zcmMvbWFpbi9hc3NlbWJseS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWU5NzQ4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9tYXNzZW1ibHktMTk2L3NyYy9tYWluL2Fzc2VtYmx5L2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnPz4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8xLjEuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjAueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPHJlcG9zaXRvcmllcz4KLSAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxpbmNsdWRlTWV0YWRhdGE+dHJ1ZTwvaW5jbHVkZU1ldGFkYXRhPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5yZXBvPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8Z3JvdXBWZXJzaW9uQWxpZ25tZW50cz4KLSAgICAgICAgPGdyb3VwVmVyc2lvbkFsaWdubWVudD4KLSAgICAgICAgICA8aWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9pZD4KLSAgICAgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICAgICAgPGV4Y2x1ZGU+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9leGNsdWRlPgotICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgIDwvZ3JvdXBWZXJzaW9uQWxpZ25tZW50PgotICAgICAgPC9ncm91cFZlcnNpb25BbGlnbm1lbnRzPgotICAgIDwvcmVwb3NpdG9yeT4KLSAgPC9yZXBvc2l0b3JpZXM+Ci08L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL21hc3NlbWJseS0xOTYvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL21hc3NlbWJseS0xOTYvc3JjL21haW4vamF2YS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ0MmYzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9tYXNzZW1ibHktMTk2L3NyYy9tYWluL2phdmEvdGVzdC9BcHAuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLXBhY2thZ2UgdGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKgotICogSGVsbG8gd29ybGQhCi0gKgotICovCi1wdWJsaWMgY2xhc3MgQXBwIAotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkKLSAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkhlbGxvIFdvcmxkISIgKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvbWFzc2VtYmx5LTE5Ni92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL21hc3NlbWJseS0xOTYvdmVyaWZ5LmJzaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3NzdmYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvbWFzc2VtYmx5LTE5Ni92ZXJpZnkuYnNoCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1GaWxlIGphclBsdWdpbiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS0xOTYtMS1iaW4vcmVwby9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbnMvbWF2ZW4tamFyLXBsdWdpbi8yLjAvbWF2ZW4tamFyLXBsdWdpbi0yLjAuamFyIiApOwotRmlsZSBzdXJlZmlyZVBsdWdpbiA9IG5ldyBGaWxlKCBiYXNlZGlyLCAidGFyZ2V0L21hc3NlbWJseS0xOTYtMS1iaW4vcmVwby9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbnMvbWF2ZW4tc3VyZWZpcmUtcGx1Z2luLzIuMy9tYXZlbi1zdXJlZmlyZS1wbHVnaW4tMi4zLmphciIgKTsKLQotaWYgKCAhamFyUGx1Z2luLmV4aXN0cygpICkKLXsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDYW5ub3QgZmluZCBqYXIgcGx1Z2luIGF0OiAiICsgamFyUGx1Z2luICk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAiamFyIHBsdWdpbiBzaG91bGQgaGF2ZSBiZWVuIHJlbG9jYXRlZCB0byB2ZXJzaW9uIDIuMCIgKTsKLX0KLQotaWYgKCAhc3VyZWZpcmVQbHVnaW4uZXhpc3RzKCkgKQotewotICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkNhbm5vdCBmaW5kIHN1cmVmaXJlIHBsdWdpbiBhdDogIiArIHN1cmVmaXJlUGx1Z2luICk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKCAic3VyZWZpcmUgcGx1Z2luIHNob3VsZCBOT1QgaGF2ZSBiZWVuIHJlbG9jYXRlZCB0byAyLjAiICk7Ci19Ci0KLXJldHVybiBqYXJQbHVnaW4uZXhpc3RzKCkgJiYgc3VyZWZpcmVQbHVnaW4uZXhpc3RzKCk7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMvY2hpbGQvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9jaGlsZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDU4MmU3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9jaGlsZC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnJlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzPC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotICA8YXJ0aWZhY3RJZD5jaGlsZDwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgCi0gIDxyZXBvc2l0b3JpZXM+Ci0gICAgPHJlcG9zaXRvcnk+Ci0gICAgICA8aWQ+bXkucmVtb3RlPC9pZD4KLSAgICAgIDx1cmw+ZmlsZTovLyR7YmFzZWRpcn0vcmVtb3RlLXJlcG9zaXRvcnk8L3VybD4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gIDwvcmVwb3NpdG9yaWVzPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdXRpbHM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjQuMzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvYXNzZW1ibGUvYmluLnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8ZmluYWxOYW1lPmFzc2VtYmx5PC9maW5hbE5hbWU+ICAgICAgICAKLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotCi0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+YXNzZW1ibHk8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMvY2hpbGQvcmVtb3RlLXJlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvMS40LjMtU05BUFNIT1QvcGxleHVzLXV0aWxzLTEuNC4zLVNOQVBTSE9ULmphciBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9jaGlsZC9yZW1vdGUtcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjQuMy1TTkFQU0hPVC9wbGV4dXMtdXRpbHMtMS40LjMtU05BUFNIT1QuamFyCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZTRjZjJhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9jaGlsZC9yZW1vdGUtcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjQuMy1TTkFQU0hPVC9wbGV4dXMtdXRpbHMtMS40LjMtU05BUFNIT1QuamFyCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2NoaWxkL3JlbW90ZS1yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLXV0aWxzLzEuNC4zLVNOQVBTSE9UL3BsZXh1cy11dGlscy0xLjQuMy1TTkFQU0hPVC5wb20gYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMvY2hpbGQvcmVtb3RlLXJlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvMS40LjMtU05BUFNIT1QvcGxleHVzLXV0aWxzLTEuNC4zLVNOQVBTSE9ULnBvbQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzU4NzIxNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMvY2hpbGQvcmVtb3RlLXJlcG9zaXRvcnkvb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvMS40LjMtU05BUFNIT1QvcGxleHVzLXV0aWxzLTEuNC4zLVNOQVBTSE9ULnBvbQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+PHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxwYXJlbnQ+Ci0gICAgPGFydGlmYWN0SWQ+cGxleHVzPC9hcnRpZmFjdElkPgotICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgPHZlcnNpb24+MS4wLjExPC92ZXJzaW9uPgotICAgIDxyZWxhdGl2ZVBhdGg+Li4vcG9tL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KLSAgPC9wYXJlbnQ+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICA8bmFtZT5QbGV4dXMgQ29tbW9uIFV0aWxpdGllczwvbmFtZT4KLSAgPHZlcnNpb24+MS40LjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDx1cmw+aHR0cDovL3BsZXh1cy5jb2RlaGF1cy5vcmcvcGxleHVzLXV0aWxzPC91cmw+Ci0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPCEtLSBzdXJlZmlyZSByZXF1aXJlcyBwbGV4dXMtdXRpbHMgdG8gYmUgamRrIDEuMyBjb21wYXRpYmxlIC0tPgotICAgICAgICAgIDxzb3VyY2U+MS4zPC9zb3VyY2U+Ci0gICAgICAgICAgPHRhcmdldD4xLjM8L3RhcmdldD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDwhLS0gcmVxdWlyZWQgdG8gZW5zdXJlIHRoZSB0ZXN0IGNsYXNzZXMgYXJlIHVzZWQsIG5vdCBzdXJlZmlyZSdzIHBsZXh1cy11dGlscyAtLT4KLSAgICAgICAgICA8Y2hpbGREZWxlZ2F0aW9uPnRydWU8L2NoaWxkRGVsZWdhdGlvbj4KLSAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICA8ZXhjbHVkZT5vcmcvY29kZWhhdXMvcGxleHVzL3V0aWwvRmlsZUJhc2VkVGVzdENhc2UuamF2YTwvZXhjbHVkZT4KLSAgICAgICAgICAgIDxleGNsdWRlPioqL1Rlc3QqLmphdmE8L2V4Y2x1ZGU+Ci0gICAgICAgICAgPC9leGNsdWRlcz4KLSAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPG5hbWU+SkFWQV9IT01FPC9uYW1lPgotICAgICAgICAgICAgICA8dmFsdWU+JHtKQVZBX0hPTUV9PC92YWx1ZT4gICAgCi0gICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICA8bmFtZT5NMl9IT01FPC9uYW1lPgotICAgICAgICAgICAgICA8dmFsdWU+JHtNMl9IT01FfTwvdmFsdWU+ICAgIAotICAgICAgICAgICAgPC9wcm9wZXJ0eT4gICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPiAgICAgICAgICAKLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotICA8c2NtPiAKLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uY29kZWhhdXMub3JnL3BsZXh1cy9wbGV4dXMtdXRpbHMvdHJ1bmsvPC9jb25uZWN0aW9uPgotICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uY29kZWhhdXMub3JnL3BsZXh1cy9wbGV4dXMtdXRpbHMvdHJ1bms8L2RldmVsb3BlckNvbm5lY3Rpb24+IAotICAgIDx1cmw+aHR0cDovL2Zpc2hleWUuY29kZWhhdXMub3JnL2Jyb3dzZS9wbGV4dXMvcGxleHVzLXV0aWxzL3RydW5rLzwvdXJsPgotICA8L3NjbT4KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qeHItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4gIAotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2NoaWxkL3JlbW90ZS1yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLzEuMC4xMS9wbGV4dXMtMS4wLjExLnBvbSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9jaGlsZC9yZW1vdGUtcmVwb3NpdG9yeS9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy8xLjAuMTEvcGxleHVzLTEuMC4xMS5wb20KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZWU1NzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2NoaWxkL3JlbW90ZS1yZXBvc2l0b3J5L29yZy9jb2RlaGF1cy9wbGV4dXMvcGxleHVzLzEuMC4xMS9wbGV4dXMtMS4wLjExLnBvbQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wbGV4dXM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPlBsZXh1czwvbmFtZT4KLSAgPHZlcnNpb24+MS4wLjExPC92ZXJzaW9uPgotICA8Y2lNYW5hZ2VtZW50PgotICAgIDxub3RpZmllcnM+Ci0gICAgICA8bm90aWZpZXI+Ci0gICAgICAgIDx0eXBlPm1haWw8L3R5cGU+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxhZGRyZXNzPmRldkBwbGV4dXMuY29kZWhhdXMub3JnPC9hZGRyZXNzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L25vdGlmaWVyPgotICAgICAgPG5vdGlmaWVyPgotICAgICAgICA8dHlwZT5pcmM8L3R5cGU+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxob3N0PmlyYy5jb2RlaGF1cy5vcmc8L2hvc3Q+Ci0gICAgICAgICAgPHBvcnQ+NjY2NzwvcG9ydD4KLSAgICAgICAgICA8Y2hhbm5lbD4jcGxleHVzPC9jaGFubmVsPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L25vdGlmaWVyPiAgICAgIAotICAgIDwvbm90aWZpZXJzPgotICA8L2NpTWFuYWdlbWVudD4KLSAgPGluY2VwdGlvblllYXI+MjAwMTwvaW5jZXB0aW9uWWVhcj4KLSAgPGxpY2Vuc2VzPgotICAgIDxsaWNlbnNlPgotICAgICAgPG5hbWU+VGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvbmFtZT4KLSAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLnR4dDwvdXJsPgotICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+Ci0gICAgPC9saWNlbnNlPgotICA8L2xpY2Vuc2VzPiAgCi0gIDxtYWlsaW5nTGlzdHM+Ci0gICAgPG1haWxpbmdMaXN0PgotICAgICAgPG5hbWU+UGxleHVzIFVzZXIgTGlzdDwvbmFtZT4KLSAgICAgIDxzdWJzY3JpYmU+aHR0cDovL3hpcmNsZXMuY29kZWhhdXMub3JnL21hbmFnZV9lbWFpbC91c2VyJTQwcGxleHVzLmNvZGVoYXVzLm9yZzwvc3Vic2NyaWJlPgotICAgICAgPHVuc3Vic2NyaWJlPmh0dHA6Ly94aXJjbGVzLmNvZGVoYXVzLm9yZy9tYW5hZ2VfZW1haWwvdXNlciU0MHBsZXh1cy5jb2RlaGF1cy5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgPGFyY2hpdmU+aHR0cDovL2FyY2hpdmUucGxleHVzLmNvZGVoYXVzLm9yZy91c2VyPC9hcmNoaXZlPgotICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgPG1haWxpbmdMaXN0PgotICAgICAgPG5hbWU+UGxleHVzIERldmVsb3BlciBMaXN0PC9uYW1lPgotICAgICAgPHN1YnNjcmliZT5odHRwOi8veGlyY2xlcy5jb2RlaGF1cy5vcmcvbWFuYWdlX2VtYWlsL2RldiU0MHBsZXh1cy5jb2RlaGF1cy5vcmc8L3N1YnNjcmliZT4KLSAgICAgIDx1bnN1YnNjcmliZT5odHRwOi8veGlyY2xlcy5jb2RlaGF1cy5vcmcvbWFuYWdlX2VtYWlsL2RldiU0MHBsZXh1cy5jb2RlaGF1cy5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgPGFyY2hpdmU+aHR0cDovL2FyY2hpdmUucGxleHVzLmNvZGVoYXVzLm9yZy9kZXY8L2FyY2hpdmU+Ci0gICAgPC9tYWlsaW5nTGlzdD4KLSAgICA8bWFpbGluZ0xpc3Q+Ci0gICAgICA8bmFtZT5QbGV4dXMgQW5ub3VuY2UgTGlzdDwvbmFtZT4KLSAgICAgIDxzdWJzY3JpYmU+aHR0cDovL3hpcmNsZXMuY29kZWhhdXMub3JnL21hbmFnZV9lbWFpbC9hbm5vdW5jZSU0MHBsZXh1cy5jb2RlaGF1cy5vcmc8L3N1YnNjcmliZT4KLSAgICAgIDx1bnN1YnNjcmliZT5odHRwOi8veGlyY2xlcy5jb2RlaGF1cy5vcmcvbWFuYWdlX2VtYWlsL2Fubm91bmNlJTQwcGxleHVzLmNvZGVoYXVzLm9yZzwvdW5zdWJzY3JpYmU+Ci0gICAgICA8YXJjaGl2ZT5odHRwOi8vYXJjaGl2ZS5wbGV4dXMuY29kZWhhdXMub3JnL2Fubm91bmNlPC9hcmNoaXZlPgotICAgIDwvbWFpbGluZ0xpc3Q+Ci0gICAgPG1haWxpbmdMaXN0PgotICAgICAgPG5hbWU+UGxleHVzIENvbW1pdCBMaXN0PC9uYW1lPgotICAgICAgPHN1YnNjcmliZT5odHRwOi8veGlyY2xlcy5jb2RlaGF1cy5vcmcvbWFuYWdlX2VtYWlsL3NjbSU0MHBsZXh1cy5jb2RlaGF1cy5vcmc8L3N1YnNjcmliZT4KLSAgICAgIDx1bnN1YnNjcmliZT5odHRwOi8veGlyY2xlcy5jb2RlaGF1cy5vcmcvbWFuYWdlX2VtYWlsL3NjbSU0MHBsZXh1cy5jb2RlaGF1cy5vcmc8L3Vuc3Vic2NyaWJlPgotICAgICAgPGFyY2hpdmU+aHR0cDovL2FyY2hpdmUucGxleHVzLmNvZGVoYXVzLm9yZy9zY208L2FyY2hpdmU+Ci0gICAgPC9tYWlsaW5nTGlzdD4KLSAgPC9tYWlsaW5nTGlzdHM+Ci0gIDxpc3N1ZU1hbmFnZW1lbnQ+Ci0gICAgPHN5c3RlbT5KSVJBPC9zeXN0ZW0+Ci0gICAgPHVybD5odHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL1BMWDwvdXJsPgotICA8L2lzc3VlTWFuYWdlbWVudD4KLQotICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxpZD5jb2RlaGF1cy5vcmc8L2lkPgotICAgICAgPG5hbWU+UGxleHVzIENlbnRyYWwgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgIDx1cmw+ZGF2Omh0dHBzOi8vZGF2LmNvZGVoYXVzLm9yZy9yZXBvc2l0b3J5L3BsZXh1czwvdXJsPgotICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgPGlkPmNvZGVoYXVzLm9yZzwvaWQ+Ci0gICAgICA8bmFtZT5QbGV4dXMgQ2VudHJhbCBEZXZlbG9wbWVudCBSZXBvc2l0b3J5PC9uYW1lPgotICAgICAgPHVybD5kYXY6aHR0cHM6Ly9kYXYuY29kZWhhdXMub3JnL3NuYXBzaG90cy5yZXBvc2l0b3J5L3BsZXh1czwvdXJsPgotICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgIDxzaXRlPgotICAgICAgPGlkPmNvZGVoYXVzLm9yZzwvaWQ+Ci0gICAgICA8dXJsPmRhdjpodHRwczovL2Rhdi5jb2RlaGF1cy5vcmcvcGxleHVzPC91cmw+Ci0gICAgPC9zaXRlPgotICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gIDxyZXBvc2l0b3JpZXM+Ci0gICAgPHJlcG9zaXRvcnk+Ci0gICAgICA8aWQ+Y29kZWhhdXMuc25hcHNob3RzPC9pZD4KLSAgICAgIDxuYW1lPkNvZGVoYXVzIFNuYXBzaG90IERldmVsb3BtZW50IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICA8dXJsPmh0dHA6Ly9zbmFwc2hvdHMucmVwb3NpdG9yeS5jb2RlaGF1cy5vcmc8L3VybD4KLSAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICA8L3JlbGVhc2VzPgotICAgIDwvcmVwb3NpdG9yeT4KLSAgPC9yZXBvc2l0b3JpZXM+Ci0gIAotICA8ZGV2ZWxvcGVycz4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPGlkPmp2YW56eWw8L2lkPgotICAgICAgPG5hbWU+SmFzb24gdmFuIFp5bDwvbmFtZT4KLSAgICAgIDxlbWFpbD5qYXNvbkBtYXZlbi5vcmc8L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICAgIDxyb2xlPlJlbGVhc2UgTWFuYWdlcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxpZD5rYXo8L2lkPgotICAgICAgPG5hbWU+UGV0ZSBLYXptaWVyPC9uYW1lPgotICAgICAgPGVtYWlsIC8+Ci0gICAgICA8b3JnYW5pemF0aW9uIC8+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxpZD5qdGF5bG9yPC9pZD4KLSAgICAgIDxuYW1lPkphbWVzIFRheWxvcjwvbmFtZT4KLSAgICAgIDxlbWFpbD5qYW1lc0BqYW1lc3RheWxvci5vcmc8L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbiAvPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8aWQ+ZGFuZGllcDwvaWQ+Ci0gICAgICA8bmFtZT5EYW4gRGllcGhvdXNlPC9uYW1lPgotICAgICAgPGVtYWlsPmRhbkBlbnZvaXNvbHV0aW9ucy5jb208L2VtYWlsPgotICAgICAgPG9yZ2FuaXphdGlvbj5FbnZvaSBzb2x1dGlvbnM8L29yZ2FuaXphdGlvbj4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2RldmVsb3Blcj4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPGlkPmthc3BlcjwvaWQ+Ci0gICAgICA8bmFtZT5LYXNwZXIgTmllbHNlbjwvbmFtZT4KLSAgICAgIDxlbWFpbD5hcGFjaGVAa2F2LmRrPC9lbWFpbD4KLSAgICAgIDxvcmdhbml6YXRpb24gLz4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2RldmVsb3Blcj4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPGlkPmJ3YWxkaW5nPC9pZD4KLSAgICAgIDxuYW1lPkJlbiBXYWxkaW5nPC9uYW1lPgotICAgICAgPGVtYWlsPmJ3YWxkaW5nQGNvZGVoYXVzLm9yZzwvZW1haWw+Ci0gICAgICA8b3JnYW5pemF0aW9uPldhbGRpbmcgQ29uc3VsdGluZyBTZXJ2aWNlczwvb3JnYW5pemF0aW9uPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8aWQ+bWh3PC9pZD4KLSAgICAgIDxuYW1lPk1hcmsgV2lsa2luc29uPC9uYW1lPgotICAgICAgPGVtYWlsPm1od0BrcmVtdmF4Lm5ldDwvZW1haWw+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxpZD5taWNoYWw8L2lkPgotICAgICAgPG5hbWU+TWljaGFsIE1hY3prYTwvbmFtZT4KLSAgICAgIDxlbWFpbD5tbWFjemthQGludGVyaWEucGw8L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8aWQ+ZXZlbmlzc2U8L2lkPgotICAgICAgPG5hbWU+RW1tYW51ZWwgVmVuaXNzZTwvbmFtZT4KLSAgICAgIDxlbWFpbD5ldmVuaXNzZUBjb2RlaGF1cy5vcmc8L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5UcnlndmUgTGF1Z3N0b2w8L25hbWU+Ci0gICAgICA8aWQ+dHJ5Z3ZpczwvaWQ+Ci0gICAgICA8ZW1haWw+dHJ5Z3Zpc0Bjb2RlaGF1cy5vcmc8L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5LZW5uZXkgV2VzdGVyaG9mPC9uYW1lPgotICAgICAgPGlkPmtlbm5leTwvaWQ+Ci0gICAgICA8ZW1haWw+a2VubmV5QGNvZGVoYXVzLm9yZzwvZW1haWw+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPkNhcmxvcyBTYW5jaGV6PC9uYW1lPgotICAgICAgPGlkPmNhcmxvczwvaWQ+Ci0gICAgICA8ZW1haWw+Y2FybG9zQGNvZGVoYXVzLm9yZzwvZW1haWw+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPkJyZXR0IFBvcnRlcjwvbmFtZT4KLSAgICAgIDxpZD5icmV0dDwvaWQ+Ci0gICAgICA8ZW1haWw+YnJldHRAY29kZWhhdXMub3JnPC9lbWFpbD4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2RldmVsb3Blcj4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPG5hbWU+Sm9obiBDYXNleTwvbmFtZT4KLSAgICAgIDxpZD5qZGNhc2V5PC9pZD4KLSAgICAgIDxlbWFpbD5qZGNhc2V5QGNvZGVoYXVzLm9yZzwvZW1haWw+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gICAgPGRldmVsb3Blcj4KLSAgICAgIDxuYW1lPkFuZHJldyBXaWxsaWFtczwvbmFtZT4KLSAgICAgIDxpZD5oYW5keWFuZGU8L2lkPgotICAgICAgPGVtYWlsPmFuZHlAaGFuZHlhbmRlLmNvLnVrPC9lbWFpbD4KLSAgICAgIDxyb2xlcz4KLSAgICAgICAgPHJvbGU+RGV2ZWxvcGVyPC9yb2xlPgotICAgICAgPC9yb2xlcz4KLSAgICA8L2RldmVsb3Blcj4KLSAgICA8ZGV2ZWxvcGVyPgotICAgICAgPG5hbWU+UmFodWwgVGhha3VyPC9uYW1lPgotICAgICAgPGlkPnJhaHVsPC9pZD4KLSAgICAgIDxlbWFpbD5yYWh1bC50aGFrdXIueGRldkBnbWFpbC5jb208L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5Kb2FraW0gRXJkZmVsdDwvbmFtZT4KLSAgICAgIDxpZD5qb2FraW1lPC9pZD4KLSAgICAgIDxlbWFpbD5qb2FraW1AZXJkZmVsdC5jb208L2VtYWlsPgotICAgICAgPHJvbGVzPgotICAgICAgICA8cm9sZT5EZXZlbG9wZXI8L3JvbGU+Ci0gICAgICA8L3JvbGVzPgotICAgIDwvZGV2ZWxvcGVyPgotICAgIDxkZXZlbG9wZXI+Ci0gICAgICA8bmFtZT5PbGl2aWVyIExhbXk8L25hbWU+Ci0gICAgICA8aWQ+b2xhbXk8L2lkPgotICAgICAgPGVtYWlsPm9sYW15QGNvZGVoYXVzLm9yZzwvZW1haWw+Ci0gICAgICA8cm9sZXM+Ci0gICAgICAgIDxyb2xlPkRldmVsb3Blcjwvcm9sZT4KLSAgICAgIDwvcm9sZXM+Ci0gICAgPC9kZXZlbG9wZXI+Ci0gIDwvZGV2ZWxvcGVycz4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotICA8c2NtPgotICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5jb2RlaGF1cy5vcmcvcGxleHVzL3BvbS90cnVuay88L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5jb2RlaGF1cy5vcmcvcGxleHVzL3BvbS90cnVuay88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vZmlzaGV5ZS5jb2RlaGF1cy5vcmcvYnJvd3NlL3BsZXh1cy9wb20vdHJ1bmsvPC91cmw+Ci0gIDwvc2NtPgotICA8b3JnYW5pemF0aW9uPgotICAgIDxuYW1lPkNvZGVoYXVzPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5jb2RlaGF1cy5vcmcvPC91cmw+Ci0gIDwvb3JnYW5pemF0aW9uPgotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjQ8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNDwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDwhLS0KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbW90ZS1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtMjwvdmVyc2lvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+cHJvY2VzczwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHJlc291cmNlQnVuZGxlcz4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2VCdW5kbGU+b3JnLmFwYWNoZTphcGFjaGUtamFyLXJlc291cmNlLWJ1bmRsZToxLjEuMS1TTkFQU0hPVDwvcmVzb3VyY2VCdW5kbGU+Ci0gICAgICAgICAgICAgIDwvcmVzb3VyY2VCdW5kbGVzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIC0tPgotICAgIDwvcGx1Z2lucz4KLSAgICA8ZXh0ZW5zaW9ucz4KLSAgICAgIDxleHRlbnNpb24+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ud2Fnb248L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPndhZ29uLXdlYmRhdjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4wLWJldGEtMjwvdmVyc2lvbj4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgIDwvZXh0ZW5zaW9ucz4KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPmRlcGxveTwvZ29hbHM+Ci0gICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+ICAgIAotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2NoaWxkL3NyYy9hc3NlbWJsZS9iaW4ueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2NoaWxkL3NyYy9hc3NlbWJsZS9iaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzM2ZlNzJkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9jaGlsZC9zcmMvYXNzZW1ibGUvYmluLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8cmVwb3NpdG9yaWVzPgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5yZXBvPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPmp1bml0Omp1bml0PC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gIDwvcmVwb3NpdG9yaWVzPgotPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9jaGlsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3QvQXBwLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMvY2hpbGQvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0L0FwcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjU2OGMzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9jaGlsZC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3QvQXBwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioKLSAqIEhlbGxvIHdvcmxkIQotICoKLSAqLwotcHVibGljIGNsYXNzIEFwcCAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbiggU3RyaW5nW10gYXJncyApCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJIZWxsbyBXb3JsZCEiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2NoaWxkL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdGVzdC9BcHBUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMvY2hpbGQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0L0FwcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE3OGMzNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMvY2hpbGQvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0L0FwcFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RTdWl0ZTsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHNpbXBsZSBBcHAuCi0gKi8KLXB1YmxpYyBjbGFzcyBBcHBUZXN0IAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLSAgICAvKioKLSAgICAgKiBDcmVhdGUgdGhlIHRlc3QgY2FzZQotICAgICAqCi0gICAgICogQHBhcmFtIHRlc3ROYW1lIG5hbWUgb2YgdGhlIHRlc3QgY2FzZQotICAgICAqLwotICAgIHB1YmxpYyBBcHBUZXN0KCBTdHJpbmcgdGVzdE5hbWUgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIHRlc3ROYW1lICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgc3VpdGUgb2YgdGVzdHMgYmVpbmcgdGVzdGVkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBUZXN0IHN1aXRlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgVGVzdFN1aXRlKCBBcHBUZXN0LmNsYXNzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmlnb3Vyb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdEFwcCgpCi0gICAgewotICAgICAgICBhc3NlcnRUcnVlKCB0cnVlICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2ludm9rZXIucHJvcGVydGllcyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9pbnZva2VyLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMmEzYmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL2ludm9rZXIucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0jIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0jICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotIyBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSMgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotIyB1bmRlciB0aGUgTGljZW5zZS4KLQotaW52b2tlci5nb2Fscz1wYWNrYWdlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9wcm9qZWN0cy9yZXBvc2l0b3JpZXMvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMvcG9tLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzFhZmVhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+Ci08IS0tCi1MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLWRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi10byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi13aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPml0LXByb2plY3QtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gICAgPGFydGlmYWN0SWQ+cmVwby13aXRoLXNuYXBzaG90LXBhcmVudHM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIAotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNoaWxkPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL2l0L3Byb2plY3RzL3JlcG9zaXRvcmllcy9yZXBvLXdpdGgtc25hcHNob3QtcGFyZW50cy92ZXJpZnkuYnNoIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL3ZlcmlmeS5ic2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYwNzgxMTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvcHJvamVjdHMvcmVwb3NpdG9yaWVzL3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzL3ZlcmlmeS5ic2gKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLio7Ci0KLUZpbGUganVuaXRKYXIgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkL3RhcmdldC9hc3NlbWJseS1iaW4vcmVwby9qdW5pdC9qdW5pdC8zLjguMS9qdW5pdC0zLjguMS5qYXIiICk7Ci1ib29sZWFuIGp1bml0RXhpc3RzID0ganVuaXRKYXIuZXhpc3RzKCk7Ci0KLUZpbGUgcGxleHVzVXRpbHNKYXIgPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkL3RhcmdldC9hc3NlbWJseS1iaW4vcmVwby9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy11dGlscy8xLjQuMy1TTkFQU0hPVC9wbGV4dXMtdXRpbHMtMS40LjMtU05BUFNIT1QuamFyIiApOwotYm9vbGVhbiBwdUphckV4aXN0cyA9IHBsZXh1c1V0aWxzSmFyLmV4aXN0cygpOwotCi1GaWxlIHBsZXh1c1V0aWxzUG9tID0gbmV3IEZpbGUoIGJhc2VkaXIsICJjaGlsZC90YXJnZXQvYXNzZW1ibHktYmluL3JlcG8vb3JnL2NvZGVoYXVzL3BsZXh1cy9wbGV4dXMtdXRpbHMvMS40LjMtU05BUFNIT1QvcGxleHVzLXV0aWxzLTEuNC4zLVNOQVBTSE9ULnBvbSIgKTsKLWJvb2xlYW4gcHVQb21FeGlzdHMgPSBwbGV4dXNVdGlsc1BvbS5leGlzdHMoKTsKLQotRmlsZSBwbGV4dXNQb20gPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkL3RhcmdldC9hc3NlbWJseS1iaW4vcmVwby9vcmcvY29kZWhhdXMvcGxleHVzL3BsZXh1cy8xLjAuMTEvcGxleHVzLTEuMC4xMS5wb20iICk7Ci1ib29sZWFuIHBsZXh1c1BvbUV4aXN0cyA9IHBsZXh1c1BvbS5leGlzdHMoKTsKLQotRmlsZSBwYXJlbnRQb20gPSBuZXcgRmlsZSggYmFzZWRpciwgImNoaWxkL3RhcmdldC9hc3NlbWJseS1iaW4vcmVwby9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0L3JlcG8td2l0aC1zbmFwc2hvdC1wYXJlbnRzLzEtU05BUFNIT1QvcmVwby13aXRoLXNuYXBzaG90LXBhcmVudHMtMS1TTkFQU0hPVC5wb20iICk7Ci1ib29sZWFuIHBsZXh1c1BvbUV4aXN0cyA9IHBsZXh1c1BvbS5leGlzdHMoKTsKLQotcmV0dXJuIGp1bml0RXhpc3RzICYmIHB1SmFyRXhpc3RzICYmIHB1UG9tRXhpc3RzICYmIHBsZXh1c1BvbUV4aXN0cyAmJiBwYXJlbnRQb21FeGlzdHM7CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9zZXR0aW5ncy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9pdC9zZXR0aW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhNGZjOTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvaXQvc2V0dGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZXR0aW5ncz4KLSAgPHByb2ZpbGVzPgotICAgIDxwcm9maWxlPgotICAgICAgPGlkPml0LXJlcG88L2lkPgotICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+dHJ1ZTwvYWN0aXZlQnlEZWZhdWx0PgotICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgPGlkPmxvY2FsLmNlbnRyYWw8L2lkPgotICAgICAgICAgIDx1cmw+QGxvY2FsUmVwb3NpdG9yeVVybEA8L3VybD4KLSAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgPGlkPnNuYXBzaG90LmNvZGVoYXVzPC9pZD4KLSAgICAgICAgICA8dXJsPmh0dHBzOi8vbmV4dXMuY29kZWhhdXMub3JnL2NvbnRlbnQvZ3JvdXBzL3NuYXBzaG90cy1ncm91cC88L3VybD4KLSAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICAgIDxzbmFwc2hvdHM+Ci0gICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgIDwvc25hcHNob3RzPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3Q8L2lkPgotICAgICAgICAgIDx1cmw+aHR0cHM6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvY29udGVudC9ncm91cHMvc25hcHNob3RzLWdyb3VwLzwvdXJsPgotICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgIDxlbmFibGVkPmZhbHNlPC9lbmFibGVkPgotICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgIDwvcmVwb3NpdG9yaWVzPgotICAgICAgPHBsdWdpblJlcG9zaXRvcmllcz4KLSAgICAgICAgPHBsdWdpblJlcG9zaXRvcnk+Ci0gICAgICAgICAgPGlkPmxvY2FsLmNlbnRyYWw8L2lkPgotICAgICAgICAgIDx1cmw+QGxvY2FsUmVwb3NpdG9yeVVybEA8L3VybD4KLSAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgIDwvcGx1Z2luUmVwb3NpdG9yeT4KLSAgICAgIDwvcGx1Z2luUmVwb3NpdG9yaWVzPgotICAgIDwvcHJvZmlsZT4KLSAgPC9wcm9maWxlcz4KLTwvc2V0dGluZ3M+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZS5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L0Fzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzM2U4Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjMzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHk7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFyY2hpdmVyLk1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmV4ZWN1dGlvbi5NYXZlblNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5maWx0ZXJpbmcuTWF2ZW5SZWFkZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZQotewotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRvciBpZC4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RGVzY3JpcHRvcklkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdG9ycy4KLSAgICAgKi8KLSAgICBTdHJpbmdbXSBnZXREZXNjcmlwdG9ycygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRvciByZWZlcmVuY2VzLgotICAgICAqLwotICAgIFN0cmluZ1tdIGdldERlc2NyaXB0b3JSZWZlcmVuY2VzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdG9yIHNvdXJjZSBkaXJlY290b3kuCi0gICAgICovCi0gICAgRmlsZSBnZXREZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBiYXNlIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBGaWxlIGdldEJhc2VkaXIoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIE1hdmVuIFByb2plY3QuCi0gICAgICovCi0gICAgTWF2ZW5Qcm9qZWN0IGdldFByb2plY3QoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gU2l0ZSBpbmNsdWRlZC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzU2l0ZUluY2x1ZGVkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBzaXRlIGRpcmVjdG9yeS4KLSAgICAgKi8KLSAgICBGaWxlIGdldFNpdGVEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGZpbmFsIG5hbWUuCi0gICAgICovCi0gICAgU3RyaW5nIGdldEZpbmFsTmFtZSgpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBhcHBlbmQgdGhlIGFzc2VtYmx5IGlkLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNBc3NlbWJseUlkQXBwZW5kZWQoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGNsYXNzaWZpZXIuCi0gICAgICovCi0gICAgU3RyaW5nIGdldENsYXNzaWZpZXIoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGFyIGxvbmcgZmlsZSBtb2RlLgotICAgICAqLwotICAgIFN0cmluZyBnZXRUYXJMb25nRmlsZU1vZGUoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIG91dHB1dCBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgRmlsZSBnZXRPdXRwdXREaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIHdvcmtpbmcgZGlyZWNvdG9yeS4KLSAgICAgKi8KLSAgICBGaWxlIGdldFdvcmtpbmdEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGphciBhcmNoaXZlIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBnZXRKYXJBcmNoaXZlQ29uZmlndXJhdGlvbigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbG9jYWwgcmVwb3NpdG9yeS4KLSAgICAgKi8KLSAgICBBcnRpZmFjdFJlcG9zaXRvcnkgZ2V0TG9jYWxSZXBvc2l0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSB0ZW1wb3Jhcnkgcm9vdCBkaXJlY3RvcnkuCi0gICAgICovCi0gICAgRmlsZSBnZXRUZW1wb3JhcnlSb290RGlyZWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhcmNoaXZlIGJhc2UgZGlyZWN0b3J5LgotICAgICAqLwotICAgIEZpbGUgZ2V0QXJjaGl2ZUJhc2VEaXJlY3RvcnkoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGZpbHRlcnMuCi0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldEZpbHRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gaW5jbHVkZSB0aGUgcHJvamVjdCBidWlsZCBmaWx0ZXJzIG9yIG5vdC4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzSW5jbHVkZVByb2plY3RCdWlsZEZpbHRlcnMoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgcmVhY3RvciBwcm9qZWN0cy4KLSAgICAgKi8KLSAgICBMaXN0PE1hdmVuUHJvamVjdD4gZ2V0UmVhY3RvclByb2plY3RzKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSByZW1vdGUgcmVwb3NpdG9yaWVzLgotICAgICAqLwotICAgIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiBnZXRSZW1vdGVSZXBvc2l0b3JpZXMoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gSXMgdGhpcyBhIHRlc3QgcnVuLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNEcnlSdW4oKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gSWdub3JlIGRpcmVjdG9yeSBmb3JtYXQgZXh0ZW5zaW9ucy4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzSWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBJZ25vcmUgbWlzc2luZyBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNJZ25vcmVNaXNzaW5nRGVzY3JpcHRvcigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgbWF2ZW4gc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBNYXZlblNlc3Npb24gZ2V0TWF2ZW5TZXNzaW9uKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBhcmNoaXZlciBjb25maWd1LgotICAgICAqLwotICAgIFN0cmluZyBnZXRBcmNoaXZlckNvbmZpZygpOwotCi0gICAgLyoqCi0gICAgICogTWF2ZW4gc2hhcmVkIGZpbHRlcmluZyB1dGlsaXR5LgotICAgICAqCi0gICAgICogQCByZXR1cm4gdGhlIG1hdmVuIHJlYWRlciBmaWx0ZXIKLSAgICAgKi8KLSAgICBNYXZlblJlYWRlckZpbHRlciBnZXRNYXZlblJlYWRlckZpbHRlcigpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBVcGRhdGUgb25seSB5ZXMvbm8uCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1VwZGF0ZU9ubHkoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gVXNlIEpWTSBjaG1vZCB5ZXMvbm8uCi0gICAgICovCi0gICAgYm9vbGVhbiBpc1VzZUp2bUNobW9kKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIElnbm9yZSBwZXJtaXNzaW9ucyB5ZXMvbm8uCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0lnbm9yZVBlcm1pc3Npb25zKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGVuY29kaW5nLgotICAgICAqLwotICAgIFN0cmluZyBnZXRFbmNvZGluZygpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiBUaGUgZXNjYXBlIHN0cmluZy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZ2V0RXNjYXBlU3RyaW5nKCk7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGRlbGltaXRlcnMuCi0gICAgICovCi0gICAgTGlzdDxTdHJpbmc+IGdldERlbGltaXRlcnMoKTsKLQotICAgIEBOb25udWxsCi0gICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgZ2V0UmVwb3NpdG9yeUludGVycG9sYXRvcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnRlcnBvbGF0b3IgZnJvbSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYW5kIHN0dWZmCi0gICAgICovCi0gICAgQE5vbm51bGwKLSAgICBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBnZXRDb21tYW5kTGluZVByb3BzSW50ZXJwb2xhdG9yKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIGludGVycG9sYXRvciBmcm9tIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgc3R1ZmYKLSAgICAgKi8KLSAgICBATm9ubnVsbAotICAgIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGdldEVudkludGVycG9sYXRvcigpOwotCi0gICAgQE5vbm51bGwKLSAgICBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBnZXRNYWluUHJvamVjdEludGVycG9sYXRvcigpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L0ludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1NzIyNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHk7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICBleHRlbmRzIEV4Y2VwdGlvbgotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gZXJyb3IgICBUaGUgZXJyb3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgZXJyb3IgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIGVycm9yICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSApCi0gICAgewotICAgICAgICBzdXBlciggbWVzc2FnZSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA3YjRkOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24KLSAgICBleHRlbmRzIEV4Y2VwdGlvbgotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgaW4gaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byB1c2UuCi0gICAgICogQHBhcmFtIGVycm9yICAgVGhlIGVycm9yLgotICAgICAqLwotICAgIHB1YmxpYyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24oIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgZXJyb3IgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIGVycm9yICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIG1lc3NhZ2UgVGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiggZmluYWwgU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL0FyY2hpdmVFeHBhbnNpb25FeGNlcHRpb24uamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL0FyY2hpdmVFeHBhbnNpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNmOWUyMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9BcmNoaXZlRXhwYW5zaW9uRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmU7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQXJjaGl2ZUV4cGFuc2lvbkV4Y2VwdGlvbgotICAgIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlIHRvIHVzZSBmb3IgdGhpcyBpbnN0YW5jZS4KLSAgICAgKiBAcGFyYW0gZXJyb3IgICBUaGUgZXJyb3Igd2hpY2ggaGFzIGJlZW4gdGhyb3duLgotICAgICAqLwotICAgIHB1YmxpYyBBcmNoaXZlRXhwYW5zaW9uRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGVycm9yICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlLCBlcnJvciApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIFRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBBcmNoaXZlRXhwYW5zaW9uRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSApCi0gICAgewotICAgICAgICBzdXBlciggbWVzc2FnZSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvQXNzZW1ibHlBcmNoaXZlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvQXNzZW1ibHlBcmNoaXZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGI4NGJmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL0Fzc2VtYmx5QXJjaGl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBDcmVhdGVzIGFuIGFyY2hpdmUKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NlbWJseUFyY2hpdmVyCi17Ci0gICAgU3RyaW5nIFJPTEUgPSBBc3NlbWJseUFyY2hpdmVyLmNsYXNzLmdldE5hbWUoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgYXNzZW1ibHkgYXJjaGl2ZS4gR2VuZXJhbGx5OgotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+U2V0dXAgYW55IGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIGZvciB0ZW1wb3JhcnkgZmlsZXM8L2xpPgotICAgICAqIDxsaT5DYWxjdWxhdGUgdGhlIG91dHB1dCBkaXJlY3RvcnkvZmlsZSBmb3IgdGhlIGFzc2VtYmx5PC9saT4KLSAgICAgKiA8bGk+U2V0dXAgYW55IGhhbmRsZXIgY29tcG9uZW50cyBmb3Igc3BlY2lhbCBkZXNjcmlwdG9yIGZpbGVzIHdlIG1heSBlbmNvdW50ZXI8L2xpPgotICAgICAqIDxsaT5Mb29rdXAgYW5kIGNvbmZpZ3VyZSB0aGUge0BsaW5rIG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJ9IHRvIGJlIHVzZWQ8L2xpPgotICAgICAqIDxsaT5EZXRlcm1pbmUgd2hhdCwgaWYgYW55LCBkZXBlbmRlbmN5IHJlc29sdXRpb24gd2lsbCBiZSByZXF1aXJlZCwgYW5kIHJlc29sdmUgYW55IGRlcGVuZGVuY3ktdmVyc2lvbiBjb25mbGljdHMKLSAgICAgKiB1cCBmcm9udCB0byBwcm9kdWNlIGEgbWFuYWdlZC12ZXJzaW9uIG1hcCBmb3IgdGhlIHdob2xlIGFzc2VtYmx5IHByb2Nlc3MuPC9saT4KLSAgICAgKiA8bGk+SXRlcmF0ZSB0aHJvdWdoIHRoZSBhdmFpbGFibGUge0BsaW5rIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUucGhhc2UuQXNzZW1ibHlBcmNoaXZlclBoYXNlfQotICAgICAqIGluc3RhbmNlcywgZXhlY3V0aW5nIGVhY2ggdG8gaGFuZGxlIGEgZGlmZmVyZW50Ci0gICAgICogdG9wLWxldmVsIHNlY3Rpb24gb2YgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IsIGlmIHRoYXQgc2VjdGlvbiBpcyBwcmVzZW50LjwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3NlbWJseSAgICAgICAgICAgICAgVGhlIHtAbGluayBBc3NlbWJseX0KLSAgICAgKiBAcGFyYW0gZnVsbE5hbWUgICAgICAgICAgICAgIFRoZSBmdWxsIG5hbWUuCi0gICAgICogQHBhcmFtIGZvcm1hdCAgICAgICAgICAgICAgICBUaGUgZm9ybWF0LgotICAgICAqIEBwYXJhbSBjb25maWdTb3VyY2UgICAgICAgICAgVGhlIHtAbGluayBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlfQotICAgICAqIEBwYXJhbSByZWNvbXByZXNzWmlwcGVkRmlsZXMgcmVjb21wcmVzcyB6aXBwZWQgZmlsZXMuCi0gICAgICogQHJldHVybiBUaGUgcmVzdWx0aW5nIGFyY2hpdmUgZmlsZS4KLSAgICAgKiBAdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiAgICAgICAgICAgICAgIHdoZW4gY3JlYXRpb24gZmFpbHMKLSAgICAgKiBAdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiAgICAgICAgICAgIHdoZW4gZm9ybWF0dGluZyBmYWlscwotICAgICAqIEB0aHJvd3MgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gd2hlbiB0aGUgY29uZmlndXJhdGlvbmlzIGJhZAotICAgICAqLwotICAgIEZpbGUgY3JlYXRlQXJjaGl2ZSggQXNzZW1ibHkgYXNzZW1ibHksIFN0cmluZyBmdWxsTmFtZSwgU3RyaW5nIGZvcm1hdCwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlY29tcHJlc3NaaXBwZWRGaWxlcyApCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9EZWZhdWx0QXNzZW1ibHlBcmNoaXZlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWY2N2I4My4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9EZWZhdWx0QXNzZW1ibHlBcmNoaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkRlYnVnQ29uZmlndXJhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5hcmNoaXZlci5Bc3NlbWJseVByb3h5QXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5waGFzZS5Bc3NlbWJseUFyY2hpdmVyUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5waGFzZS5Bc3NlbWJseUFyY2hpdmVyUGhhc2VDb21wYXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFydGlmYWN0LkRlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlci5Db21wb25lbnRzWG1sQXJjaGl2ZXJGaWxlRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlci5Db250YWluZXJEZXNjcmlwdG9ySGFuZGxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmludGVycG9sYXRpb24uQXNzZW1ibHlFeHByZXNzaW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyQ29uZmlnOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5RmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5Rm9ybWF0VXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5QbGV4dXNDb25zdGFudHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5QbGV4dXNDb250YWluZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlRmluYWxpemVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmRpYWdzLkRyeVJ1bkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuZmlsdGVycy5KYXJTZWN1cml0eUZpbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmphci5KYXJBcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuQXJjaGl2ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIubWFuYWdlci5Ob1N1Y2hBcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLnRhci5UYXJBcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLnRhci5UYXJMb25nRmlsZU1vZGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci53YXIuV2FyQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci56aXAuQWJzdHJhY3RaaXBBcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuUmVxdWlyZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuY29uZmlndXJhdG9yLkNvbXBvbmVudENvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuY29uZmlndXJhdG9yLkNvbXBvbmVudENvbmZpZ3VyYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5jb25maWd1cmF0b3IuQ29uZmlndXJhdGlvbkxpc3RlbmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmNvbmZpZ3VyYXRvci5leHByZXNzaW9uLkV4cHJlc3Npb25FdmFsdWF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQucmVwb3NpdG9yeS5leGNlcHRpb24uQ29tcG9uZW50TG9va3VwRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbmZpZ3VyYXRpb24uUGxleHVzQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbmZpZ3VyYXRpb24ueG1sLlhtbFBsZXh1c0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb250ZXh0LkNvbnRleHQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb250ZXh0LkNvbnRleHRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkFic3RyYWN0TG9nRW5hYmxlZDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnBlcnNvbmFsaXR5LnBsZXh1cy5saWZlY3ljbGUucGhhc2UuQ29udGV4dHVhbGl6YWJsZTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhwcDNEb207Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tQnVpbGRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLnB1bGwuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQ29udHJvbGxlciBjb21wb25lbnQgZGVzaWduZWQgdG8gb3JnYW5pemUgdGhlIG1hbnkgYWN0aXZpdGllcyBpbnZvbHZlZCBpbiBjcmVhdGluZyBhbiBhc3NlbWJseSBhcmNoaXZlLiBUaGlzIGluY2x1ZGVzCi0gKiBsb2NhdGluZyBhbmQgY29uZmlndXJpbmcge0BsaW5rIEFyY2hpdmVyfSBpbnN0YW5jZXMsIGV4ZWN1dGluZyBtdWx0aXBsZSB7QGxpbmsgQXNzZW1ibHlBcmNoaXZlclBoYXNlfSBpbnN0YW5jZXMgdG8KLSAqIGludGVycHJldCB0aGUgdmFyaW91cyBzZWN0aW9ucyBvZiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciBhbmQgZGV0ZXJtaW5lIHdoaWNoIGZpbGVzIHRvIGFkZCwgYW5kIG90aGVyIGFzc29jaWF0ZWQKLSAqIGFjdGl2aXRpZXMuCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1AQ29tcG9uZW50KCByb2xlID0gQXNzZW1ibHlBcmNoaXZlci5jbGFzcyApCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIKLSAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZAotICAgIGltcGxlbWVudHMgQXNzZW1ibHlBcmNoaXZlciwgQ29udGV4dHVhbGl6YWJsZQotewotCi0gICAgQFJlcXVpcmVtZW50Ci0gICAgcHJpdmF0ZSBBcmNoaXZlck1hbmFnZXIgYXJjaGl2ZXJNYW5hZ2VyOwotCi0gICAgQFJlcXVpcmVtZW50KCByb2xlID0gQXNzZW1ibHlBcmNoaXZlclBoYXNlLmNsYXNzICkKLSAgICBwcml2YXRlIExpc3Q8QXNzZW1ibHlBcmNoaXZlclBoYXNlPiBhc3NlbWJseVBoYXNlczsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAiTWlzbWF0Y2hlZFF1ZXJ5QW5kVXBkYXRlT2ZDb2xsZWN0aW9uIiApCi0gICAgQFJlcXVpcmVtZW50KCByb2xlID0gQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIuY2xhc3MgKQotICAgIHByaXZhdGUgTWFwPFN0cmluZywgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXI+IGNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyczsKLQotICAgIHByaXZhdGUgUGxleHVzQ29udGFpbmVyIGNvbnRhaW5lcjsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAiVW51c2VkRGVjbGFyYXRpb24iICkKLSAgICBwdWJsaWMgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLyBpbnRyb2R1Y2VkIGZvciB0ZXN0aW5nLgotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFyY2hpdmVyTWFuYWdlciBUaGUgYXJjaGl2ZSBtYW5hZ2VyLgotICAgICAqIEBwYXJhbSBhc3NlbWJseVBoYXNlcyAgVGhlIGxpc3Qgb2Yge0BsaW5rIEFzc2VtYmx5QXJjaGl2ZXJQaGFzZX0KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIoIGZpbmFsIEFyY2hpdmVyTWFuYWdlciBhcmNoaXZlck1hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEFzc2VtYmx5QXJjaGl2ZXJQaGFzZT4gYXNzZW1ibHlQaGFzZXMgKQotICAgIHsKLSAgICAgICAgdGhpcy5hcmNoaXZlck1hbmFnZXIgPSBhcmNoaXZlck1hbmFnZXI7Ci0gICAgICAgIHRoaXMuYXNzZW1ibHlQaGFzZXMgPSBhc3NlbWJseVBoYXNlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8QXNzZW1ibHlBcmNoaXZlclBoYXNlPiBzb3J0ZWRQaGFzZXMoKQotICAgIHsKLSAgICAgICAgTGlzdDxBc3NlbWJseUFyY2hpdmVyUGhhc2U+IHNvcnRlZCA9IG5ldyBBcnJheUxpc3Q8QXNzZW1ibHlBcmNoaXZlclBoYXNlPiggYXNzZW1ibHlQaGFzZXMgKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCggc29ydGVkLCBuZXcgQXNzZW1ibHlBcmNoaXZlclBoYXNlQ29tcGFyYXRvcigpICk7Ci0gICAgICAgIHJldHVybiBzb3J0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGNyZWF0ZUFyY2hpdmUoIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5LCBmaW5hbCBTdHJpbmcgZnVsbE5hbWUsIGZpbmFsIFN0cmluZyBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsIGJvb2xlYW4gcmVjb21wcmVzc1ppcHBlZEZpbGVzICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmFsaWRhdGUoIGFzc2VtYmx5ICk7Ci0KLSAgICAgICAgU3RyaW5nIGZpbGVuYW1lID0gZnVsbE5hbWU7Ci0gICAgICAgIGlmICggIWNvbmZpZ1NvdXJjZS5pc0lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMoKSB8fCAhZm9ybWF0LnN0YXJ0c1dpdGgoICJkaXIiICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaWxlbmFtZSArPSAiLiIgKyBmb3JtYXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBBc3NlbWJseUZpbGVVdGlscy52ZXJpZnlUZW1wRGlyZWN0b3J5QXZhaWxhYmlsaXR5KCBjb25maWdTb3VyY2UuZ2V0VGVtcG9yYXJ5Um9vdERpcmVjdG9yeSgpICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBjb25maWdTb3VyY2UuZ2V0T3V0cHV0RGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBkZXN0RmlsZSA9IG5ldyBGaWxlKCBvdXRwdXREaXJlY3RvcnksIGZpbGVuYW1lICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaW5hbE5hbWUgPSBjb25maWdTb3VyY2UuZ2V0RmluYWxOYW1lKCk7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3BlY2lmaWVkQmFzZWRpciA9IGFzc2VtYmx5LmdldEJhc2VEaXJlY3RvcnkoKTsKLQotICAgICAgICAgICAgU3RyaW5nIGJhc2VkaXIgPSBmaW5hbE5hbWU7Ci0KLSAgICAgICAgICAgIGlmICggc3BlY2lmaWVkQmFzZWRpciAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBiYXNlZGlyID0gQXNzZW1ibHlGb3JtYXRVdGlscy5nZXRPdXRwdXREaXJlY3RvcnkoIHNwZWNpZmllZEJhc2VkaXIsIGZpbmFsTmFtZSwgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHlGb3JtYXRVdGlscy5tb2R1bGVQcm9qZWN0SW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5Rm9ybWF0VXRpbHMuYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBMaXN0PENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPiBjb250YWluZXJIYW5kbGVycyA9Ci0gICAgICAgICAgICAgICAgc2VsZWN0Q29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzKCBhc3NlbWJseS5nZXRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnMoKSwgY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyID0KLSAgICAgICAgICAgICAgICBjcmVhdGVBcmNoaXZlciggZm9ybWF0LCBhc3NlbWJseS5pc0luY2x1ZGVCYXNlRGlyZWN0b3J5KCksIGJhc2VkaXIsIGNvbmZpZ1NvdXJjZSwgY29udGFpbmVySGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tcHJlc3NaaXBwZWRGaWxlcyApOwotCi0gICAgICAgICAgICBhcmNoaXZlci5zZXREZXN0RmlsZSggZGVzdEZpbGUgKTsKLQotICAgICAgICAgICAgZm9yICggQXNzZW1ibHlBcmNoaXZlclBoYXNlIHBoYXNlIDogc29ydGVkUGhhc2VzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBoYXNlLmV4ZWN1dGUoIGFzc2VtYmx5LCBhcmNoaXZlciwgY29uZmlnU291cmNlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJFcnJvciBjcmVhdGluZyBhc3NlbWJseSBhcmNoaXZlICIgKyBhc3NlbWJseS5nZXRJZCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiRXJyb3IgY3JlYXRpbmcgYXNzZW1ibHkgYXJjaGl2ZSAiICsgYXNzZW1ibHkuZ2V0SWQoKSArICI6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIlVuYWJsZSB0byBvYnRhaW4gYXJjaGl2ZXIgZm9yIGV4dGVuc2lvbiAnIiArIGZvcm1hdCArICInLCBmb3IgYXNzZW1ibHk6ICciICsgYXNzZW1ibHkuZ2V0SWQoKSArICInIiwKLSAgICAgICAgICAgICAgICBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIHJlc29sdmUgZGVwZW5kZW5jaWVzIGZvciBhc3NlbWJseSAnIiArIGFzc2VtYmx5LmdldElkKCkgKyAiJyIsIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZXN0RmlsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ICkKLSAgICAgICAgdGhyb3dzIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIGFzc2VtYmx5LmdldElkKCkgPT0gbnVsbCB8fCBhc3NlbWJseS5nZXRJZCgpLnRyaW0oKS5sZW5ndGgoKSA8IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oICJBc3NlbWJseSBJRCBtdXN0IGJlIHByZXNlbnQgYW5kIG5vbi1lbXB0eS4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDSEVDS1NUWUxFX09GRjogTGluZUxlbmd0aAotICAgIHByaXZhdGUgTGlzdDxDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcj4gc2VsZWN0Q29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzKAotICAgICAgICBMaXN0PENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyQ29uZmlnPiByZXF1ZXN0ZWRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnMsCi0gICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgLy8gQ0hFQ0tTVFlMRV9PTjogTGluZUxlbmd0aAotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJBbGwga25vd24gQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIgY29tcG9uZW50czogIiArICggY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzID09IG51bGwKLSAgICAgICAgICAgID8gIm5vbmU7IG1hcCBpcyBudWxsLiIKLSAgICAgICAgICAgIDogIiIgKyBjb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnMua2V5U2V0KCkgKSApOwotCi0gICAgICAgIGlmICggcmVxdWVzdGVkQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXF1ZXN0ZWRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyQ29uZmlnPigpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGlzdDxDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcj4gaGFuZGxlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPigpOwotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gaGludHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBpZiAoICFyZXF1ZXN0ZWRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnMuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggZmluYWwgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJDb25maWcgY29uZmlnIDogcmVxdWVzdGVkQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGludCA9IGNvbmZpZy5nZXRIYW5kbGVyTmFtZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyIGhhbmRsZXIgPSBjb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnMuZ2V0KCBoaW50ICk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGhhbmRsZXIgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGZpbmQgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIgd2l0aCBoaW50OiAiICsgaGludCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiRm91bmQgY29udGFpbmVyIGRlc2NyaXB0b3IgaGFuZGxlciB3aXRoIGhpbnQ6ICIgKyBoaW50ICsgIiAoY29tcG9uZW50OiAiICsgaGFuZGxlciArICIpIiApOwotCi0gICAgICAgICAgICAgICAgaWYgKCBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJDb25maWd1cmluZyBoYW5kbGVyIHdpdGg6XG5cbiIgKyBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpICsgIlxuXG4iICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIoIGhhbmRsZXIsIChYcHAzRG9tKSBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBoYW5kbGVycy5hZGQoIGhhbmRsZXIgKTsKLSAgICAgICAgICAgICAgICBoaW50cy5hZGQoIGhpbnQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIWhpbnRzLmNvbnRhaW5zKCAicGxleHVzIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgaGFuZGxlcnMuYWRkKCBuZXcgQ29tcG9uZW50c1htbEFyY2hpdmVyRmlsZUZpbHRlcigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gaGFuZGxlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgbmVjZXNzYXJ5IGFyY2hpdmVyIHRvIGJ1aWxkIHRoZSBkaXN0cmlidXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmb3JtYXQgICAgICAgICAgICAgICAgQXJjaGl2ZSBmb3JtYXQKLSAgICAgKiBAcGFyYW0gaW5jbHVkZUJhc2VEaXIgICAgICAgIHRoZSBiYXNlIGRpcmVjdG9yeSBmb3IgaW5jbHVkZS4KLSAgICAgKiBAcGFyYW0gZmluYWxOYW1lICAgICAgICAgICAgIFRoZSBmaW5hbCBuYW1lLgotICAgICAqIEBwYXJhbSBjb25maWdTb3VyY2UgICAgICAgICAge0BsaW5rIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2V9Ci0gICAgICogQHBhcmFtIGNvbnRhaW5lckhhbmRsZXJzICAgICBUaGUgbGlzdCBvZiB7QGxpbmsgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJ9Ci0gICAgICogQHBhcmFtIHJlY29tcHJlc3NaaXBwZWRGaWxlcyByZWNvbXByZXNzIHppcHBlZCBmaWxlcy4KLSAgICAgKiBAcmV0dXJuIGFyY2hpdmVyIEFyY2hpdmVyIGdlbmVyYXRlZAotICAgICAqIEB0aHJvd3Mgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbgotICAgICAqIEB0aHJvd3Mgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLk5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIEFyY2hpdmVyIGNyZWF0ZUFyY2hpdmVyKCBmaW5hbCBTdHJpbmcgZm9ybWF0LCBmaW5hbCBib29sZWFuIGluY2x1ZGVCYXNlRGlyLCBmaW5hbCBTdHJpbmcgZmluYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyPiBjb250YWluZXJIYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gcmVjb21wcmVzc1ppcHBlZEZpbGVzICkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBcmNoaXZlciBhcmNoaXZlcjsKLSAgICAgICAgaWYgKCAidGd6Ii5lcXVhbHMoIGZvcm1hdCApIHx8ICJ0YnoyIi5lcXVhbHMoIGZvcm1hdCApIHx8IGZvcm1hdC5zdGFydHNXaXRoKCAidGFyIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgYXJjaGl2ZXIgPSBjcmVhdGVUYXJBcmNoaXZlciggZm9ybWF0LCBUYXJMb25nRmlsZU1vZGUudmFsdWVPZiggY29uZmlnU291cmNlLmdldFRhckxvbmdGaWxlTW9kZSgpICkgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggIndhciIuZXF1YWxzKCBmb3JtYXQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyID0gY3JlYXRlV2FyQXJjaGl2ZXIoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyID0gYXJjaGl2ZXJNYW5hZ2VyLmdldEFyY2hpdmVyKCBmb3JtYXQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggYXJjaGl2ZXIgaW5zdGFuY2VvZiBBYnN0cmFjdFppcEFyY2hpdmVyICkKLSAgICAgICAgewotICAgICAgICAgICAgKCAoQWJzdHJhY3RaaXBBcmNoaXZlcikgYXJjaGl2ZXIgKS5zZXRSZWNvbXByZXNzQWRkZWRaaXBzKCByZWNvbXByZXNzWmlwcGVkRmlsZXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExpc3Q8RmlsZVNlbGVjdG9yPiBleHRyYVNlbGVjdG9ycyA9IG5ldyBBcnJheUxpc3Q8RmlsZVNlbGVjdG9yPigpOwotICAgICAgICBmaW5hbCBMaXN0PEFyY2hpdmVGaW5hbGl6ZXI+IGV4dHJhRmluYWxpemVycyA9IG5ldyBBcnJheUxpc3Q8QXJjaGl2ZUZpbmFsaXplcj4oKTsKLSAgICAgICAgaWYgKCBhcmNoaXZlciBpbnN0YW5jZW9mIEphckFyY2hpdmVyICkKLSAgICAgICAgewotICAgICAgICAgICAgZXh0cmFTZWxlY3RvcnMuYWRkKCBuZXcgSmFyU2VjdXJpdHlGaWxlU2VsZWN0b3IoKSApOwotCi0gICAgICAgICAgICBleHRyYUZpbmFsaXplcnMuYWRkKAotICAgICAgICAgICAgICAgIG5ldyBNYW5pZmVzdENyZWF0aW9uRmluYWxpemVyKCBjb25maWdTb3VyY2UuZ2V0TWF2ZW5TZXNzaW9uKCksIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvdXJjZS5nZXRKYXJBcmNoaXZlQ29uZmlndXJhdGlvbigpICkgKTsKLQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjb25maWdTb3VyY2UuZ2V0QXJjaGl2ZXJDb25maWcoKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgY29uZmlndXJlQXJjaGl2ZXIoIGFyY2hpdmVyLCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBwcmVmaXggPSAiIjsKLSAgICAgICAgaWYgKCBpbmNsdWRlQmFzZURpciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByZWZpeCA9IGZpbmFsTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIGFyY2hpdmVyID0gbmV3IEFzc2VtYmx5UHJveHlBcmNoaXZlciggcHJlZml4LCBhcmNoaXZlciwgY29udGFpbmVySGFuZGxlcnMsIGV4dHJhU2VsZWN0b3JzLCBleHRyYUZpbmFsaXplcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnU291cmNlLmdldFdvcmtpbmdEaXJlY3RvcnkoKSwgZ2V0TG9nZ2VyKCkgKTsKLSAgICAgICAgaWYgKCBjb25maWdTb3VyY2UuaXNEcnlSdW4oKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyID0gbmV3IERyeVJ1bkFyY2hpdmVyKCBhcmNoaXZlciwgZ2V0TG9nZ2VyKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGFyY2hpdmVyLnNldFVzZUp2bUNobW9kKCBjb25maWdTb3VyY2UuaXNVcGRhdGVPbmx5KCkgKTsKLSAgICAgICAgYXJjaGl2ZXIuc2V0SWdub3JlUGVybWlzc2lvbnMoIGNvbmZpZ1NvdXJjZS5pc0lnbm9yZVBlcm1pc3Npb25zKCkgKTsKLSAgICAgICAgYXJjaGl2ZXIuc2V0Rm9yY2VkKCAhY29uZmlnU291cmNlLmlzVXBkYXRlT25seSgpICk7Ci0KLSAgICAgICAgcmV0dXJuIGFyY2hpdmVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlciggZmluYWwgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciwgZmluYWwgWHBwM0RvbSBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJDb25maWd1cmluZyBoYW5kbGVyOiAnIiArIGhhbmRsZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKyAiJyAtLT4iICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbmZpZ3VyZUNvbXBvbmVudCggaGFuZGxlciwgY29uZmlnLCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIENvbXBvbmVudENvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBoYW5kbGVyOiAiICsgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgQ29tcG9uZW50TG9va3VwRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkZhaWxlZCB0byBsb29rdXAgY29uZmlndXJhdG9yIGZvciBzZXR1cCBvZiBoYW5kbGVyOiAiICsgaGFuZGxlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICItLSBlbmQgY29uZmlndXJhdGlvbiAtLSIgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlQXJjaGl2ZXIoIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyLCBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgewotICAgICAgICBYcHAzRG9tIGNvbmZpZzsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbmZpZyA9IFhwcDNEb21CdWlsZGVyLmJ1aWxkKCBuZXcgU3RyaW5nUmVhZGVyKCBjb25maWdTb3VyY2UuZ2V0QXJjaGl2ZXJDb25maWcoKSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZXJFeGNlcHRpb24oICJGYWlsZWQgdG8gcGFyc2UgYXJjaGl2ZXIgY29uZmlndXJhdGlvbiBmb3I6ICIgKyBhcmNoaXZlci5nZXRDbGFzcygpLmdldE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbiggIkZhaWxlZCB0byBwYXJzZSBhcmNoaXZlciBjb25maWd1cmF0aW9uIGZvcjogIiArIGFyY2hpdmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkNvbmZpZ3VyaW5nIGFyY2hpdmVyOiAnIiArIGFyY2hpdmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIicgLS0+IiApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25maWd1cmVDb21wb25lbnQoIGFyY2hpdmVyLCBjb25maWcsIGNvbmZpZ1NvdXJjZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgQ29tcG9uZW50Q29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVyRXhjZXB0aW9uKCAiRmFpbGVkIHRvIGNvbmZpZ3VyZSBhcmNoaXZlcjogIiArIGFyY2hpdmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBDb21wb25lbnRMb29rdXBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiRmFpbGVkIHRvIGxvb2t1cCBjb25maWd1cmF0b3IgZm9yIHNldHVwIG9mIGFyY2hpdmVyOiAiICsgYXJjaGl2ZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCksIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiLS0gZW5kIGNvbmZpZ3VyYXRpb24gLS0iICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUNvbXBvbmVudCggZmluYWwgT2JqZWN0IGNvbXBvbmVudCwgZmluYWwgWHBwM0RvbSBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgKQotICAgICAgICB0aHJvd3MgQ29tcG9uZW50TG9va3VwRXhjZXB0aW9uLCBDb21wb25lbnRDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBDb21wb25lbnRDb25maWd1cmF0b3IgY29uZmlndXJhdG9yID0KLSAgICAgICAgICAgIChDb21wb25lbnRDb25maWd1cmF0b3IpIGNvbnRhaW5lci5sb29rdXAoIENvbXBvbmVudENvbmZpZ3VyYXRvci5ST0xFLCAiYmFzaWMiICk7Ci0KLSAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbkxpc3RlbmVyIGxpc3RlbmVyID0gbmV3IERlYnVnQ29uZmlndXJhdGlvbkxpc3RlbmVyKCBnZXRMb2dnZXIoKSApOwotCi0gICAgICAgIGZpbmFsIEV4cHJlc3Npb25FdmFsdWF0b3IgZXhwcmVzc2lvbkV2YWx1YXRvciA9IG5ldyBBc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IoIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIGZpbmFsIFhtbFBsZXh1c0NvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBYbWxQbGV4dXNDb25maWd1cmF0aW9uKCBjb25maWcgKTsKLQotICAgICAgICBmaW5hbCBPYmplY3RbXSBjb250YWluZXJSZWFsbSA9IGdldENvbnRhaW5lclJlYWxtKCk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTk9URTogVGhlIHNpZ25hdHVyZSBvZiBjb25maWd1cmVDb21wb25lbnQoKSBoYXMgY2hhbmdlZCBpbiBNYXZlbiAzLngsIHRoZSByZWZsZWN0aW9uIHByZXZlbnRzIGEgbGlua2FnZSBlcnJvcgotICAgICAgICAgKiBhbmQgbWFrZXMgdGhlIGNvZGUgd29yayB3aXRoIGJvdGggTWF2ZW4gMiBhbmQgMy4KLSAgICAgICAgICovCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBNZXRob2QgY29uZmlndXJlQ29tcG9uZW50ID0KLSAgICAgICAgICAgICAgICBDb21wb25lbnRDb25maWd1cmF0b3IuY2xhc3MuZ2V0TWV0aG9kKCAiY29uZmlndXJlQ29tcG9uZW50IiwgT2JqZWN0LmNsYXNzLCBQbGV4dXNDb25maWd1cmF0aW9uLmNsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cHJlc3Npb25FdmFsdWF0b3IuY2xhc3MsIChDbGFzczw/PikgY29udGFpbmVyUmVhbG1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbkxpc3RlbmVyLmNsYXNzICk7Ci0KLSAgICAgICAgICAgIGNvbmZpZ3VyZUNvbXBvbmVudC5pbnZva2UoIGNvbmZpZ3VyYXRvciwgY29tcG9uZW50LCBjb25maWd1cmF0aW9uLCBleHByZXNzaW9uRXZhbHVhdG9yLCBjb250YWluZXJSZWFsbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDb21wb25lbnRDb25maWd1cmF0aW9uRXhjZXB0aW9uICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyAoQ29tcG9uZW50Q29uZmlndXJhdGlvbkV4Y2VwdGlvbikgZS5nZXRDYXVzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUuZ2V0Q2F1c2UoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBPYmplY3RbXSBnZXRDb250YWluZXJSZWFsbSgpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBOT1RFOiBUaGUgcmV0dXJuIHR5cGUgb2YgZ2V0Q29udGFpbmVyUmVhbG0oKSBoYXMgY2hhbmdlZCBpbiBNYXZlbiAzLngsIHRoZSByZWZsZWN0aW9uIHByZXZlbnRzIGEgbGlua2FnZQotICAgICAgICAgKiBlcnJvciBhbmQgbWFrZXMgdGhlIGNvZGUgd29yayB3aXRoIGJvdGggTWF2ZW4gMiBhbmQgMy4KLSAgICAgICAgICovCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBNZXRob2QgZ2V0Q29udGFpbmVyUmVhbG0gPSBjb250YWluZXIuZ2V0Q2xhc3MoKS5nZXRNZXRob2QoICJnZXRDb250YWluZXJSZWFsbSIgKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgT2JqZWN0W117IGdldENvbnRhaW5lclJlYWxtLmludm9rZSggY29udGFpbmVyICksIGdldENvbnRhaW5lclJlYWxtLmdldFJldHVyblR5cGUoKSB9OwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbiggZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCBlLmdldENhdXNlKCkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBBcmNoaXZlciBjcmVhdGVXYXJBcmNoaXZlcigpCi0gICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgV2FyQXJjaGl2ZXIgd2FyQXJjaGl2ZXIgPSAoV2FyQXJjaGl2ZXIpIGFyY2hpdmVyTWFuYWdlci5nZXRBcmNoaXZlciggIndhciIgKTsKLSAgICAgICAgd2FyQXJjaGl2ZXIuc2V0SWdub3JlV2VieG1sKCBmYWxzZSApOyAvLyBTZWUgTU5HLTEyNzQKLQotICAgICAgICByZXR1cm4gd2FyQXJjaGl2ZXI7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEFyY2hpdmVyIGNyZWF0ZVRhckFyY2hpdmVyKCBmaW5hbCBTdHJpbmcgZm9ybWF0LCBmaW5hbCBUYXJMb25nRmlsZU1vZGUgdGFyTG9uZ0ZpbGVNb2RlICkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBUYXJBcmNoaXZlciB0YXJBcmNoaXZlciA9IChUYXJBcmNoaXZlcikgYXJjaGl2ZXJNYW5hZ2VyLmdldEFyY2hpdmVyKCAidGFyIiApOwotICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBmb3JtYXQuaW5kZXhPZiggJy4nICk7Ci0gICAgICAgIGlmICggaW5kZXggPj0gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRhckFyY2hpdmVyLlRhckNvbXByZXNzaW9uTWV0aG9kIHRhckNvbXByZXNzaW9uTWV0aG9kOwotICAgICAgICAgICAgLy8gVE9ETzogdGhpcyBzaG91bGQgYWNjZXB0IGd6IGFuZCBiejIgYXMgd2VsbCBzbyB3ZSBjYW4gc2tpcAotICAgICAgICAgICAgLy8gVE9ETzogb3ZlciB0aGUgc3dpdGNoCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29tcHJlc3Npb24gPSBmb3JtYXQuc3Vic3RyaW5nKCBpbmRleCArIDEgKTsKLSAgICAgICAgICAgIGlmICggImd6Ii5lcXVhbHMoIGNvbXByZXNzaW9uICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhckNvbXByZXNzaW9uTWV0aG9kID0gVGFyQXJjaGl2ZXIuVGFyQ29tcHJlc3Npb25NZXRob2QuZ3ppcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCAiYnoyIi5lcXVhbHMoIGNvbXByZXNzaW9uICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhckNvbXByZXNzaW9uTWV0aG9kID0gVGFyQXJjaGl2ZXIuVGFyQ29tcHJlc3Npb25NZXRob2QuYnppcDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggInNuYXBweSIuZXF1YWxzKCBjb21wcmVzc2lvbiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIHRhckNvbXByZXNzaW9uTWV0aG9kID0gVGFyQXJjaGl2ZXIuVGFyQ29tcHJlc3Npb25NZXRob2Quc25hcHB5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IGJldHRlciBoYW5kbGluZwotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oICJVbmtub3duIGNvbXByZXNzaW9uIGZvcm1hdDogIiArIGNvbXByZXNzaW9uICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0YXJBcmNoaXZlci5zZXRDb21wcmVzc2lvbiggdGFyQ29tcHJlc3Npb25NZXRob2QgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggInRneiIuZXF1YWxzKCBmb3JtYXQgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhckFyY2hpdmVyLnNldENvbXByZXNzaW9uKCBUYXJBcmNoaXZlci5UYXJDb21wcmVzc2lvbk1ldGhvZC5nemlwICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoICJ0YnoyIi5lcXVhbHMoIGZvcm1hdCApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyQXJjaGl2ZXIuc2V0Q29tcHJlc3Npb24oIFRhckFyY2hpdmVyLlRhckNvbXByZXNzaW9uTWV0aG9kLmJ6aXAyICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0YXJBcmNoaXZlci5zZXRMb25nZmlsZSggdGFyTG9uZ0ZpbGVNb2RlICk7Ci0KLSAgICAgICAgcmV0dXJuIHRhckFyY2hpdmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNvbnRleHR1YWxpemUoIGZpbmFsIENvbnRleHQgY29udGV4dCApCi0gICAgICAgIHRocm93cyBDb250ZXh0RXhjZXB0aW9uCi0gICAgewotICAgICAgICBjb250YWluZXIgPSAoUGxleHVzQ29udGFpbmVyKSBjb250ZXh0LmdldCggUGxleHVzQ29uc3RhbnRzLlBMRVhVU19LRVkgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb250YWluZXIoIGZpbmFsIFBsZXh1c0NvbnRhaW5lciBjb250YWluZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9NYW5pZmVzdENyZWF0aW9uRmluYWxpemVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9NYW5pZmVzdENyZWF0aW9uRmluYWxpemVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NWJkYmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvTWFuaWZlc3RDcmVhdGlvbkZpbmFsaXplci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFyY2hpdmVyLk1hdmVuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uZXhlY3V0aW9uLk1hdmVuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQWJzdHJhY3RBcmNoaXZlRmluYWxpemVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmphci5KYXJBcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmphci5NYW5pZmVzdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmphci5NYW5pZmVzdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgTWFuaWZlc3RDcmVhdGlvbkZpbmFsaXplcgotICAgIGV4dGVuZHMgQWJzdHJhY3RBcmNoaXZlRmluYWxpemVyCi17Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXZlblNlc3Npb24gc2Vzc2lvbjsKLQotICAgIHByaXZhdGUgZmluYWwgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBhcmNoaXZlQ29uZmlndXJhdGlvbjsKLQotICAgIC8vIFRPRE86IEknZCByZWFsbHkgcHJlZmVyIHRvIHJld3JpdGUgTWF2ZW5BcmNoaXZlciBhcyBlaXRoZXIgYQotICAgIC8vIHNlcGFyYXRlIG1hbmlmZXN0IGNyZWF0aW9uIHV0aWxpdHkgKGFuZCB0bwotICAgIC8vIGNyZWF0ZSBhbiBpbmNsdWRlIHBvbS5wcm9wZXJ0aWVzIGV0YyBpbnRvIGFub3RoZXIgYXJjaGl2ZXIpLCBvcgotICAgIC8vIGFuIGltcGxlbWVudGF0aW9uIG9mIGFuIGFyY2hpdmVyCi0gICAgLy8gKHRoZSBmaXJzdCBpcyBwcmVmZXJhYmxlKS4KLSAgICBwcml2YXRlIGZpbmFsIE1hdmVuQXJjaGl2ZXIgbWF2ZW5BcmNoaXZlciA9IG5ldyBNYXZlbkFyY2hpdmVyKCk7Ci0KLSAgICBwdWJsaWMgTWFuaWZlc3RDcmVhdGlvbkZpbmFsaXplciggZmluYWwgTWF2ZW5TZXNzaW9uIHNlc3Npb24sIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uIGFyY2hpdmVDb25maWd1cmF0aW9uICkKLSAgICB7Ci0gICAgICAgIHRoaXMuc2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgIHRoaXMuYXJjaGl2ZUNvbmZpZ3VyYXRpb24gPSBhcmNoaXZlQ29uZmlndXJhdGlvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZUFyY2hpdmVDcmVhdGlvbiggZmluYWwgQXJjaGl2ZXIgYXJjaGl2ZXIgKQotICAgIHsKLSAgICAgICAgaWYgKCBhcmNoaXZlQ29uZmlndXJhdGlvbiAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWFuaWZlc3QgbWFuaWZlc3Q7Ci0gICAgICAgICAgICAgICAgZmluYWwgRmlsZSBtYW5pZmVzdEZpbGUgPSBhcmNoaXZlQ29uZmlndXJhdGlvbi5nZXRNYW5pZmVzdEZpbGUoKTsKLQotICAgICAgICAgICAgICAgIGlmICggbWFuaWZlc3RGaWxlICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUmVhZGVyIG1hbmlmZXN0RmlsZVJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdEZpbGVSZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIG5ldyBGaWxlSW5wdXRTdHJlYW0oIG1hbmlmZXN0RmlsZSApLCAiVVRGLTgiICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYW5pZmVzdCA9IG5ldyBNYW5pZmVzdCggbWFuaWZlc3RGaWxlUmVhZGVyICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBGaWxlTm90Rm91bmRFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbiggIk1hbmlmZXN0IG5vdCBmb3VuZDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVyRXhjZXB0aW9uKCAiRXJyb3IgcHJvY2Vzc2luZyBtYW5pZmVzdDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBJT1V0aWwuY2xvc2UoIG1hbmlmZXN0RmlsZVJlYWRlciApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1hbmlmZXN0ID0gbWF2ZW5BcmNoaXZlci5nZXRNYW5pZmVzdCggc2Vzc2lvbiwgcHJvamVjdCwgYXJjaGl2ZUNvbmZpZ3VyYXRpb24gKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoICggbWFuaWZlc3QgIT0gbnVsbCApICYmICggYXJjaGl2ZXIgaW5zdGFuY2VvZiBKYXJBcmNoaXZlciApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEphckFyY2hpdmVyIGphckFyY2hpdmVyID0gKEphckFyY2hpdmVyKSBhcmNoaXZlcjsKLSAgICAgICAgICAgICAgICAgICAgamFyQXJjaGl2ZXIuYWRkQ29uZmlndXJlZE1hbmlmZXN0KCBtYW5pZmVzdCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgTWFuaWZlc3RFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVyRXhjZXB0aW9uKCAiRXJyb3IgY3JlYXRpbmcgbWFuaWZlc3Q6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBEZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbiggIkRlcGVuZGVuY2llcyB3ZXJlIG5vdCByZXNvbHZlZDogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFZpcnR1YWxGaWxlcygpCi0gICAgewotICAgICAgICBpZiAoIGFyY2hpdmVDb25maWd1cmF0aW9uICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIG1hdmVuQXJjaGl2ZXIuZ2V0TWFuaWZlc3QoIHByb2plY3QsIGFyY2hpdmVDb25maWd1cmF0aW9uLmdldE1hbmlmZXN0KCkgKSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCAiTUVUQS1JTkYvTUFOSUZFU1QuTUYiICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBNYW5pZmVzdEV4Y2VwdGlvbiBpZ25vcmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vb3AKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiBpZ25vcmUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIG5vb3AKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvYXJjaGl2ZXIvQXNzZW1ibHlQcm94eUFyY2hpdmVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9hcmNoaXZlci9Bc3NlbWJseVByb3h5QXJjaGl2ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM5OTE4NC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9hcmNoaXZlci9Bc3NlbWJseVByb3h5QXJjaGl2ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLmFyY2hpdmVyOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZmlsdGVyLkNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZUVudHJ5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZUZpbmFsaXplcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVkRmlsZVNldDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5GaWxlU2V0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuRmluYWxpemVyRW5hYmxlZDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlJlc291cmNlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci51dGlsLkRlZmF1bHRBcmNoaXZlZEZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci51dGlsLkRlZmF1bHRGaWxlU2V0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVJbmZvOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8ucmVzb3VyY2VzLlBsZXh1c0lvUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLnJlc291cmNlcy5QbGV4dXNJb1Jlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIERlbGVnYXRpbmcgYXJjaGl2ZXIgaW1wbGVtZW50YXRpb24gdGhhdCBzdXBwb3J0czoKLSAqIDx1bD4KLSAqIDxsaT5kcnktcnVubmluZyAod2hlcmUgdGhlIGRlbGVnYXRlIGFyY2hpdmVyIGlzIG5ldmVyIGFjdHVhbGx5IGNhbGxlZCk8L2xpPgotICogPGxpPnByZWZpeGluZyAod2hlcmUgYWxsIHBhdGhzIGhhdmUgYSBzZXQgZ2xvYmFsIHByZWZpeCBwcmVwZW5kZWQgYmVmb3JlIGFkZGl0aW9uKTwvbGk+Ci0gKiA8bGk+ZHVwbGljYXRpb24gY2hlY2tzIG9uIGFyY2hpdmUgYWRkaXRpb25zIChmb3IgYXJjaGl2ZS1maWxlIHBhdGggKyBwcmVmaXgpPC9saT4KLSAqIDwvdWw+Ci0gKgotICogQGF1dGhvciBqZGNhc2V5Ci0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlbWJseVByb3h5QXJjaGl2ZXIKLSAgICBpbXBsZW1lbnRzIEFyY2hpdmVyCi17Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFyY2hpdmVyIGRlbGVnYXRlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxCb29sZWFuPiBpblB1YmxpY0FwaSA9IG5ldyBUaHJlYWRMb2NhbDxCb29sZWFuPigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgbG9nZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXNzZW1ibHlXb3JrUGF0aDsKLQotICAgIHByaXZhdGUgU3RyaW5nIHJvb3RQcmVmaXg7Ci0KLSAgICBwcml2YXRlIEZpbGVTZWxlY3RvcltdIHNlbGVjdG9yczsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBmb3JjZWQ7Ci0KLSAgICAvKioKLSAgICAgKiBAc2luY2UgMi4yCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIHVzZUp2bUNobW9kOwotCi0gICAgcHVibGljIEFzc2VtYmx5UHJveHlBcmNoaXZlciggZmluYWwgU3RyaW5nIHJvb3RQcmVmaXgsIGZpbmFsIEFyY2hpdmVyIGRlbGVnYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8Q29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXI+IGNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZWxlY3Rvcj4gZXh0cmFTZWxlY3RvcnMsIGZpbmFsIExpc3Q8QXJjaGl2ZUZpbmFsaXplcj4gZXh0cmFGaW5hbGl6ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgYXNzZW1ibHlXb3JrRGlyLCBmaW5hbCBMb2dnZXIgbG9nZ2VyICkKLSAgICB7Ci0gICAgICAgIHRoaXMucm9vdFByZWZpeCA9IHJvb3RQcmVmaXg7Ci0gICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLQotICAgICAgICBhc3NlbWJseVdvcmtQYXRoID0gYXNzZW1ibHlXb3JrRGlyLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoICdcXCcsICcvJyApOwotCi0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOwotCi0gICAgICAgIGlmICggISIiLmVxdWFscyggcm9vdFByZWZpeCApICYmICFyb290UHJlZml4LmVuZHNXaXRoKCAiLyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucm9vdFByZWZpeCArPSAiLyI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZWxlY3Rvcj4gc2VsZWN0b3JzID0gbmV3IEFycmF5TGlzdDxGaWxlU2VsZWN0b3I+KCk7Ci0KLSAgICAgICAgRmluYWxpemVyRW5hYmxlZCBmaW5hbGl6ZXIgPSAoIGRlbGVnYXRlIGluc3RhbmNlb2YgRmluYWxpemVyRW5hYmxlZCApID8gKEZpbmFsaXplckVuYWJsZWQpIGRlbGVnYXRlIDogbnVsbDsKLQotICAgICAgICBpZiAoIGNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVycyAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggZmluYWwgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIgaGFuZGxlciA6IGNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVycyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0b3JzLmFkZCggaGFuZGxlciApOwotCi0gICAgICAgICAgICAgICAgaWYgKCBmaW5hbGl6ZXIgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbGl6ZXIuYWRkQXJjaGl2ZUZpbmFsaXplciggaGFuZGxlciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZXh0cmFTZWxlY3RvcnMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGZpbmFsIEZpbGVTZWxlY3RvciBzZWxlY3RvciA6IGV4dHJhU2VsZWN0b3JzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWxlY3RvcnMuYWRkKCBzZWxlY3RvciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoIGV4dHJhRmluYWxpemVycyAhPSBudWxsICkgJiYgZmluYWxpemVyICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBBcmNoaXZlRmluYWxpemVyIGV4dHJhRmluYWxpemVyIDogZXh0cmFGaW5hbGl6ZXJzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbGl6ZXIuYWRkQXJjaGl2ZUZpbmFsaXplciggZXh0cmFGaW5hbGl6ZXIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIXNlbGVjdG9ycy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9ycy50b0FycmF5KCBuZXcgRmlsZVNlbGVjdG9yW3NlbGVjdG9ycy5zaXplKCldICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkQXJjaGl2ZWRGaWxlU2V0KCBATm9ubnVsbCBmaW5hbCBGaWxlIGFyY2hpdmVGaWxlLCBmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBTdHJpbmdbXSBpbmNsdWRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2x1ZGVzICkKLSAgICB7Ci0gICAgICAgIGluUHVibGljQXBpLnNldCggQm9vbGVhbi5UUlVFICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBEZWZhdWx0QXJjaGl2ZWRGaWxlU2V0IGZzID0gbmV3IERlZmF1bHRBcmNoaXZlZEZpbGVTZXQoIGFyY2hpdmVGaWxlICk7Ci0KLSAgICAgICAgICAgIGZzLnNldEluY2x1ZGVzKCBpbmNsdWRlcyApOwotICAgICAgICAgICAgZnMuc2V0RXhjbHVkZXMoIGV4Y2x1ZGVzICk7Ci0gICAgICAgICAgICBmcy5zZXRQcmVmaXgoIHJvb3RQcmVmaXggKyBwcmVmaXggKTsKLSAgICAgICAgICAgIGZzLnNldEZpbGVTZWxlY3RvcnMoIHNlbGVjdG9ycyApOwotCi0gICAgICAgICAgICBkZWJ1ZyggIkFkZGluZyBhcmNoaXZlZCBmaWxlLXNldCBpbjogIiArIGFyY2hpdmVGaWxlICsgIiB0byBhcmNoaXZlIGxvY2F0aW9uOiAiICsgZnMuZ2V0UHJlZml4KCkgKTsKLQotICAgICAgICAgICAgZGVsZWdhdGUuYWRkQXJjaGl2ZWRGaWxlU2V0KCBmcyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVidWcoIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKLSAgICB7Ci0gICAgICAgIGlmICggKCBsb2dnZXIgIT0gbnVsbCApICYmIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCBtZXNzYWdlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkQXJjaGl2ZWRGaWxlU2V0KCBATm9ubnVsbCBmaW5hbCBGaWxlIGFyY2hpdmVGaWxlLCBmaW5hbCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIGluUHVibGljQXBpLnNldCggQm9vbGVhbi5UUlVFICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBEZWZhdWx0QXJjaGl2ZWRGaWxlU2V0IGZzID0gbmV3IERlZmF1bHRBcmNoaXZlZEZpbGVTZXQoIGFyY2hpdmVGaWxlICk7Ci0KLSAgICAgICAgICAgIGZzLnNldFByZWZpeCggcm9vdFByZWZpeCArIHByZWZpeCApOwotICAgICAgICAgICAgZnMuc2V0RmlsZVNlbGVjdG9ycyggc2VsZWN0b3JzICk7Ci0KLSAgICAgICAgICAgIGRlYnVnKCAiQWRkaW5nIGFyY2hpdmVkIGZpbGUtc2V0IGluOiAiICsgYXJjaGl2ZUZpbGUgKyAiIHRvIGFyY2hpdmUgbG9jYXRpb246ICIgKyBmcy5nZXRQcmVmaXgoKSApOwotCi0gICAgICAgICAgICBkZWxlZ2F0ZS5hZGRBcmNoaXZlZEZpbGVTZXQoIGZzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRBcmNoaXZlZEZpbGVTZXQoIGZpbmFsIEZpbGUgYXJjaGl2ZUZpbGUsIGZpbmFsIFN0cmluZ1tdIGluY2x1ZGVzLCBmaW5hbCBTdHJpbmdbXSBleGNsdWRlcyApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRGVmYXVsdEFyY2hpdmVkRmlsZVNldCBmcyA9IG5ldyBEZWZhdWx0QXJjaGl2ZWRGaWxlU2V0KCBhcmNoaXZlRmlsZSApOwotCi0gICAgICAgICAgICBmcy5zZXRJbmNsdWRlcyggaW5jbHVkZXMgKTsKLSAgICAgICAgICAgIGZzLnNldEV4Y2x1ZGVzKCBleGNsdWRlcyApOwotICAgICAgICAgICAgZnMuc2V0UHJlZml4KCByb290UHJlZml4ICk7Ci0gICAgICAgICAgICBmcy5zZXRGaWxlU2VsZWN0b3JzKCBzZWxlY3RvcnMgKTsKLQotICAgICAgICAgICAgZGVidWcoICJBZGRpbmcgYXJjaGl2ZWQgZmlsZS1zZXQgaW46ICIgKyBhcmNoaXZlRmlsZSArICIgdG8gYXJjaGl2ZSBsb2NhdGlvbjogIiArIGZzLmdldFByZWZpeCgpICk7Ci0KLSAgICAgICAgICAgIGRlbGVnYXRlLmFkZEFyY2hpdmVkRmlsZVNldCggZnMgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEFyY2hpdmVkRmlsZVNldCggQE5vbm51bGwgZmluYWwgRmlsZSBhcmNoaXZlRmlsZSApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRGVmYXVsdEFyY2hpdmVkRmlsZVNldCBmcyA9IG5ldyBEZWZhdWx0QXJjaGl2ZWRGaWxlU2V0KCBhcmNoaXZlRmlsZSApOwotCi0gICAgICAgICAgICBmcy5zZXRQcmVmaXgoIHJvb3RQcmVmaXggKTsKLSAgICAgICAgICAgIGZzLnNldEZpbGVTZWxlY3RvcnMoIHNlbGVjdG9ycyApOwotCi0gICAgICAgICAgICBkZWJ1ZyggIkFkZGluZyBhcmNoaXZlZCBmaWxlLXNldCBpbjogIiArIGFyY2hpdmVGaWxlICsgIiB0byBhcmNoaXZlIGxvY2F0aW9uOiAiICsgZnMuZ2V0UHJlZml4KCkgKTsKLQotICAgICAgICAgICAgZGVsZWdhdGUuYWRkQXJjaGl2ZWRGaWxlU2V0KCBmcyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBATm9ubnVsbCBmaW5hbCBGaWxlIGRpcmVjdG9yeSwgZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgU3RyaW5nW10gaW5jbHVkZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNsdWRlcyApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRGVmYXVsdEZpbGVTZXQgZnMgPSBuZXcgRGVmYXVsdEZpbGVTZXQoKTsKLQotICAgICAgICAgICAgZnMuc2V0RGlyZWN0b3J5KCBkaXJlY3RvcnkgKTsKLSAgICAgICAgICAgIGZzLnNldEluY2x1ZGVzKCBpbmNsdWRlcyApOwotICAgICAgICAgICAgZnMuc2V0RXhjbHVkZXMoIGV4Y2x1ZGVzICk7Ci0gICAgICAgICAgICBmcy5zZXRQcmVmaXgoIHJvb3RQcmVmaXggKyBwcmVmaXggKTsKLSAgICAgICAgICAgIGZzLnNldEZpbGVTZWxlY3RvcnMoIHNlbGVjdG9ycyApOwotCi0gICAgICAgICAgICBkZWJ1ZyggIkFkZGluZyBkaXJlY3RvcnkgZmlsZS1zZXQgaW46ICIgKyBkaXJlY3RvcnkgKyAiIHRvIGFyY2hpdmUgbG9jYXRpb246ICIgKyBmcy5nZXRQcmVmaXgoKSApOwotCi0gICAgICAgICAgICBkb0FkZEZpbGVTZXQoIGZzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRTeW1saW5rKCBTdHJpbmcgc3ltbGlua05hbWUsIFN0cmluZyBzeW1saW5rRGVzdGluYXRpb24gKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGVnYXRlLmFkZFN5bWxpbmsoIHN5bWxpbmtOYW1lLCBzeW1saW5rRGVzdGluYXRpb24gKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkU3ltbGluayggU3RyaW5nIHN5bWxpbmtOYW1lLCBpbnQgcGVybWlzc2lvbnMsIFN0cmluZyBzeW1saW5rRGVzdGluYXRpb24gKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGVnYXRlLmFkZFN5bWxpbmsoIHN5bWxpbmtOYW1lLCBwZXJtaXNzaW9ucywgc3ltbGlua0Rlc3RpbmF0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggQE5vbm51bGwgZmluYWwgRmlsZSBkaXJlY3RvcnksIGZpbmFsIFN0cmluZyBwcmVmaXggKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIERlZmF1bHRGaWxlU2V0IGZzID0gbmV3IERlZmF1bHRGaWxlU2V0KCk7Ci0KLSAgICAgICAgICAgIGZzLnNldERpcmVjdG9yeSggZGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICBmcy5zZXRQcmVmaXgoIHJvb3RQcmVmaXggKyBwcmVmaXggKTsKLSAgICAgICAgICAgIGZzLnNldEZpbGVTZWxlY3RvcnMoIHNlbGVjdG9ycyApOwotCi0gICAgICAgICAgICBkZWJ1ZyggIkFkZGluZyBkaXJlY3RvcnkgZmlsZS1zZXQgaW46ICIgKyBkaXJlY3RvcnkgKyAiIHRvIGFyY2hpdmUgbG9jYXRpb246ICIgKyBmcy5nZXRQcmVmaXgoKSApOwotCi0gICAgICAgICAgICBkb0FkZEZpbGVTZXQoIGZzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoIEBOb25udWxsIGZpbmFsIEZpbGUgZGlyZWN0b3J5LCBmaW5hbCBTdHJpbmdbXSBpbmNsdWRlcywgZmluYWwgU3RyaW5nW10gZXhjbHVkZXMgKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIERlZmF1bHRGaWxlU2V0IGZzID0gbmV3IERlZmF1bHRGaWxlU2V0KCk7Ci0KLSAgICAgICAgICAgIGZzLnNldERpcmVjdG9yeSggZGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICBmcy5zZXRJbmNsdWRlcyggaW5jbHVkZXMgKTsKLSAgICAgICAgICAgIGZzLnNldEV4Y2x1ZGVzKCBleGNsdWRlcyApOwotICAgICAgICAgICAgZnMuc2V0UHJlZml4KCByb290UHJlZml4ICk7Ci0gICAgICAgICAgICBmcy5zZXRGaWxlU2VsZWN0b3JzKCBzZWxlY3RvcnMgKTsKLQotICAgICAgICAgICAgZGVidWcoICJBZGRpbmcgZGlyZWN0b3J5IGZpbGUtc2V0IGluOiAiICsgZGlyZWN0b3J5ICsgIiB0byBhcmNoaXZlIGxvY2F0aW9uOiAiICsgZnMuZ2V0UHJlZml4KCkgKTsKLQotICAgICAgICAgICAgZG9BZGRGaWxlU2V0KCBmcyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBATm9ubnVsbCBmaW5hbCBGaWxlIGRpcmVjdG9yeSApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRGVmYXVsdEZpbGVTZXQgZnMgPSBuZXcgRGVmYXVsdEZpbGVTZXQoKTsKLQotICAgICAgICAgICAgZnMuc2V0RGlyZWN0b3J5KCBkaXJlY3RvcnkgKTsKLSAgICAgICAgICAgIGZzLnNldFByZWZpeCggcm9vdFByZWZpeCApOwotICAgICAgICAgICAgZnMuc2V0RmlsZVNlbGVjdG9ycyggc2VsZWN0b3JzICk7Ci0KLSAgICAgICAgICAgIGRlYnVnKCAiQWRkaW5nIGRpcmVjdG9yeSBmaWxlLXNldCBpbjogIiArIGRpcmVjdG9yeSArICIgdG8gYXJjaGl2ZSBsb2NhdGlvbjogIiArIGZzLmdldFByZWZpeCgpICk7Ci0KLSAgICAgICAgICAgIGRvQWRkRmlsZVNldCggZnMgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoIEBOb25udWxsIGZpbmFsIEZpbGUgaW5wdXRGaWxlLCBATm9ubnVsbCBmaW5hbCBTdHJpbmcgZGVzdEZpbGVOYW1lLCBmaW5hbCBpbnQgcGVybWlzc2lvbnMgKQotICAgIHsKLSAgICAgICAgaWYgKCBhY2NlcHRGaWxlKCBpbnB1dEZpbGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggQm9vbGVhbi5UUlVFICk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWJ1ZyggIkFkZGluZyBmaWxlOiAiICsgaW5wdXRGaWxlICsgIiB0byBhcmNoaXZlIGxvY2F0aW9uOiAiICsgcm9vdFByZWZpeCArIGRlc3RGaWxlTmFtZSApOwotCi0gICAgICAgICAgICAgICAgZGVsZWdhdGUuYWRkRmlsZSggaW5wdXRGaWxlLCByb290UHJlZml4ICsgZGVzdEZpbGVOYW1lLCBwZXJtaXNzaW9ucyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoIEBOb25udWxsIGZpbmFsIEZpbGUgaW5wdXRGaWxlLCBATm9ubnVsbCBmaW5hbCBTdHJpbmcgZGVzdEZpbGVOYW1lICkKLSAgICB7Ci0gICAgICAgIGlmICggYWNjZXB0RmlsZSggaW5wdXRGaWxlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVidWcoICJBZGRpbmcgZmlsZTogIiArIGlucHV0RmlsZSArICIgdG8gYXJjaGl2ZSBsb2NhdGlvbjogIiArIHJvb3RQcmVmaXggKyBkZXN0RmlsZU5hbWUgKTsKLQotICAgICAgICAgICAgICAgIGRlbGVnYXRlLmFkZEZpbGUoIGlucHV0RmlsZSwgcm9vdFByZWZpeCArIGRlc3RGaWxlTmFtZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNyZWF0ZUFyY2hpdmUoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGluUHVibGljQXBpLnNldCggQm9vbGVhbi5UUlVFICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS5zZXRGb3JjZWQoIGZvcmNlZCApOwotICAgICAgICAgICAgZGVsZWdhdGUuY3JlYXRlQXJjaGl2ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXREZWZhdWx0RGlyZWN0b3J5TW9kZSgpCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldERlZmF1bHREaXJlY3RvcnlNb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RGlyZWN0b3J5TW9kZSggZmluYWwgaW50IG1vZGUgKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGVnYXRlLnNldERlZmF1bHREaXJlY3RvcnlNb2RlKCBtb2RlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldERlZmF1bHRGaWxlTW9kZSgpCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldERlZmF1bHRGaWxlTW9kZSgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEZpbGVNb2RlKCBmaW5hbCBpbnQgbW9kZSApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZWdhdGUuc2V0RGVmYXVsdEZpbGVNb2RlKCBtb2RlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmlsZSBnZXREZXN0RmlsZSgpCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldERlc3RGaWxlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREZXN0RmlsZSggZmluYWwgRmlsZSBkZXN0RmlsZSApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZWdhdGUuc2V0RGVzdEZpbGUoIGRlc3RGaWxlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCB7ICJkZXByZWNhdGlvbiIgfSApCi0gICAgcHVibGljIE1hcDxTdHJpbmcsIEFyY2hpdmVFbnRyeT4gZ2V0RmlsZXMoKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRGaWxlcygpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0SW5jbHVkZUVtcHR5RGlycygpCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluY2x1ZGVFbXB0eURpcnMoKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVFbXB0eURpcnMoIGZpbmFsIGJvb2xlYW4gaW5jbHVkZUVtcHR5RGlycyApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZWdhdGUuc2V0SW5jbHVkZUVtcHR5RGlycyggaW5jbHVkZUVtcHR5RGlycyApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNGb3JjZWQoKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc0ZvcmNlZCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Rm9yY2VkKCBmaW5hbCBib29sZWFuIGZvcmNlZCApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5mb3JjZWQgPSBmb3JjZWQ7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS5zZXRGb3JjZWQoIGZvcmNlZCApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNTdXBwb3J0aW5nRm9yY2VkKCkKLSAgICB7Ci0gICAgICAgIGluUHVibGljQXBpLnNldCggQm9vbGVhbi5UUlVFICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNTdXBwb3J0aW5nRm9yY2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREb3RGaWxlRGlyZWN0b3J5KCBmaW5hbCBGaWxlIGRvdEZpbGVEaXJlY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgIlVuZG9jdW1lbnRlZCBmZWF0dXJlIG9mIHBsZXh1cy1hcmNoaXZlcjsgdGhpcyBpcyBub3QgeWV0IHN1cHBvcnRlZC4iICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZEFyY2hpdmVkRmlsZVNldCggZmluYWwgQXJjaGl2ZWRGaWxlU2V0IGZpbGVTZXQgKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFByZWZpeGVkQXJjaGl2ZWRGaWxlU2V0IGZzID0gbmV3IFByZWZpeGVkQXJjaGl2ZWRGaWxlU2V0KCBmaWxlU2V0LCByb290UHJlZml4LCBzZWxlY3RvcnMgKTsKLQotICAgICAgICAgICAgZGVidWcoICJBZGRpbmcgYXJjaGl2ZWQgZmlsZS1zZXQgaW46ICIgKyBmaWxlU2V0LmdldEFyY2hpdmUoKSArICIgdG8gYXJjaGl2ZSBsb2NhdGlvbjogIiArIGZzLmdldFByZWZpeCgpICk7Ci0KLSAgICAgICAgICAgIGRlbGVnYXRlLmFkZEFyY2hpdmVkRmlsZVNldCggZnMgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkQXJjaGl2ZWRGaWxlU2V0KCBBcmNoaXZlZEZpbGVTZXQgYXJjaGl2ZWRGaWxlU2V0LCBDaGFyc2V0IGNoYXJzZXQgKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFByZWZpeGVkQXJjaGl2ZWRGaWxlU2V0IGZzID0gbmV3IFByZWZpeGVkQXJjaGl2ZWRGaWxlU2V0KCBhcmNoaXZlZEZpbGVTZXQsIHJvb3RQcmVmaXgsIHNlbGVjdG9ycyApOwotCi0gICAgICAgICAgICBkZWJ1ZyggIkFkZGluZyBhcmNoaXZlZCBmaWxlLXNldCBpbjogIiArIGFyY2hpdmVkRmlsZVNldC5nZXRBcmNoaXZlKCkgKyAiIHRvIGFyY2hpdmUgbG9jYXRpb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgKyBmcy5nZXRQcmVmaXgoKSApOwotCi0gICAgICAgICAgICBkZWxlZ2F0ZS5hZGRBcmNoaXZlZEZpbGVTZXQoIGZzLCBjaGFyc2V0ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRGaWxlU2V0KCBATm9ubnVsbCBmaW5hbCBGaWxlU2V0IGZpbGVTZXQgKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFByZWZpeGVkRmlsZVNldCBmcyA9IG5ldyBQcmVmaXhlZEZpbGVTZXQoIGZpbGVTZXQsIHJvb3RQcmVmaXgsIHNlbGVjdG9ycyApOwotCi0gICAgICAgICAgICBkZWJ1ZyggIkFkZGluZyBmaWxlLXNldCBpbjogIiArIGZpbGVTZXQuZ2V0RGlyZWN0b3J5KCkgKyAiIHRvIGFyY2hpdmUgbG9jYXRpb246ICIgKyBmcy5nZXRQcmVmaXgoKSApOwotCi0gICAgICAgICAgICBkb0FkZEZpbGVTZXQoIGZzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0FkZEZpbGVTZXQoIGZpbmFsIEZpbGVTZXQgZnMgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZzUGF0aCA9IGZzLmdldERpcmVjdG9yeSgpLmdldEFic29sdXRlUGF0aCgpLnJlcGxhY2UoICdcXCcsICcvJyApOwotCi0gICAgICAgIGlmICggZnNQYXRoLmVxdWFscyggYXNzZW1ibHlXb3JrUGF0aCApICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCAiU0tJUFBJTkcgZmlsZXNldCB3aXRoIHNvdXJjZSBkaXJlY3RvcnkgbWF0Y2hpbmcgYXNzZW1ibHkgd29ya2luZy1kaXJlY3Rvcnk6ICIgKyBmc1BhdGggKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggYXNzZW1ibHlXb3JrUGF0aC5zdGFydHNXaXRoKCBmc1BhdGggKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBuZXdFeCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgaWYgKCBmcy5nZXRFeGNsdWRlcygpICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG5ld0V4LmFkZEFsbCggQXJyYXlzLmFzTGlzdCggZnMuZ2V0RXhjbHVkZXMoKSApICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3b3JrRGlyRXhjbHVkZSA9IGFzc2VtYmx5V29ya1BhdGguc3Vic3RyaW5nKCBmc1BhdGgubGVuZ3RoKCkgKyAxICk7Ci0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKLSAgICAgICAgICAgICAgICAiQWRkaW5nIGV4Y2x1ZGUgZm9yIGFzc2VtYmx5IHdvcmtpbmctZGlyZWN0b3J5OiAiICsgd29ya0RpckV4Y2x1ZGUgKyAiXG5GaWxlLVNldCBzb3VyY2UgZGlyZWN0b3J5OiAiCi0gICAgICAgICAgICAgICAgICAgICsgZnNQYXRoICk7Ci0KLSAgICAgICAgICAgIG5ld0V4LmFkZCggd29ya0RpckV4Y2x1ZGUgKTsKLQotICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG5ld0luID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICBpZiAoIGZzLmdldEluY2x1ZGVzKCkgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggZmluYWwgU3RyaW5nIGluY2x1ZGUgOiBmcy5nZXRJbmNsdWRlcygpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggIWluY2x1ZGUuc3RhcnRzV2l0aCggd29ya0RpckV4Y2x1ZGUgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld0luLmFkZCggaW5jbHVkZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmaW5hbCBEZWZhdWx0RmlsZVNldCBkZnMgPSBuZXcgRGVmYXVsdEZpbGVTZXQoKTsKLQotICAgICAgICAgICAgZGZzLnNldENhc2VTZW5zaXRpdmUoIGZzLmlzQ2FzZVNlbnNpdGl2ZSgpICk7Ci0gICAgICAgICAgICBkZnMuc2V0RGlyZWN0b3J5KCBmcy5nZXREaXJlY3RvcnkoKSApOwotICAgICAgICAgICAgZGZzLnNldEV4Y2x1ZGVzKCBuZXdFeC50b0FycmF5KCBuZXcgU3RyaW5nW25ld0V4LnNpemUoKV0gKSApOwotICAgICAgICAgICAgZGZzLnNldEZpbGVTZWxlY3RvcnMoIGZzLmdldEZpbGVTZWxlY3RvcnMoKSApOwotICAgICAgICAgICAgZGZzLnNldEluY2x1ZGVzKCBuZXdJbi50b0FycmF5KCBuZXcgU3RyaW5nW25ld0luLnNpemUoKV0gKSApOwotICAgICAgICAgICAgZGZzLnNldEluY2x1ZGluZ0VtcHR5RGlyZWN0b3JpZXMoIGZzLmlzSW5jbHVkaW5nRW1wdHlEaXJlY3RvcmllcygpICk7Ci0gICAgICAgICAgICBkZnMuc2V0UHJlZml4KCBmcy5nZXRQcmVmaXgoKSApOwotICAgICAgICAgICAgZGZzLnNldFVzaW5nRGVmYXVsdEV4Y2x1ZGVzKCBmcy5pc1VzaW5nRGVmYXVsdEV4Y2x1ZGVzKCkgKTsKLQotICAgICAgICAgICAgZGVsZWdhdGUuYWRkRmlsZVNldCggZGZzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS5hZGRGaWxlU2V0KCBmcyApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFjY2VwdEZpbGUoIGZpbmFsIEZpbGUgaW5wdXRGaWxlICkKLSAgICB7Ci0gICAgICAgIGlmICggIUJvb2xlYW4uVFJVRS5lcXVhbHMoIGluUHVibGljQXBpLmdldCgpICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIHNlbGVjdG9ycyAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBGaWxlSW5mbyBmaWxlSW5mbyA9IG5ldyBEZWZhdWx0RmlsZUluZm8oIGlucHV0RmlsZSApOwotCi0gICAgICAgICAgICAgICAgZm9yICggZmluYWwgRmlsZVNlbGVjdG9yIHNlbGVjdG9yIDogc2VsZWN0b3JzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFzZWxlY3Rvci5pc1NlbGVjdGVkKCBmaWxlSW5mbyApICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwcm9jZXNzaW5nIGZpbGU6ICIgKyBpbnB1dEZpbGUgKyAiIHVzaW5nIHNlbGVjdG9yOiAiICsgc2VsZWN0b3IsIGUgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRSZXNvdXJjZSggZmluYWwgUGxleHVzSW9SZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIGRlc3RGaWxlTmFtZSwgZmluYWwgaW50IHBlcm1pc3Npb25zICkKLSAgICB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCByZXNvdXJjZS5nZXROYW1lKCkgKTsgLy8gek9NRy4KLSAgICAgICAgaWYgKCBhY2NlcHRGaWxlKCBmaWxlICkgKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggQm9vbGVhbi5UUlVFICk7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5hZGRSZXNvdXJjZSggcmVzb3VyY2UsIHJvb3RQcmVmaXggKyBkZXN0RmlsZU5hbWUsIHBlcm1pc3Npb25zICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBudWxsICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2VzKCBmaW5hbCBQbGV4dXNJb1Jlc291cmNlQ29sbGVjdGlvbiByZXNvdXJjZXMgKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGVnYXRlLmFkZFJlc291cmNlcyggcmVzb3VyY2VzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBATm9ubnVsbAotICAgIHB1YmxpYyBSZXNvdXJjZUl0ZXJhdG9yIGdldFJlc291cmNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHVwbGljYXRlQmVoYXZpb3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldER1cGxpY2F0ZUJlaGF2aW9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldER1cGxpY2F0ZUJlaGF2aW9yKCBmaW5hbCBTdHJpbmcgZHVwbGljYXRlICkKLSAgICB7Ci0gICAgICAgIGluUHVibGljQXBpLnNldCggQm9vbGVhbi5UUlVFICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkZWxlZ2F0ZS5zZXREdXBsaWNhdGVCZWhhdmlvciggZHVwbGljYXRlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpblB1YmxpY0FwaS5zZXQoIG51bGwgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldERpcmVjdG9yeU1vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldERpcmVjdG9yeU1vZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5TW9kZSggZmluYWwgaW50IG1vZGUgKQotICAgIHsKLSAgICAgICAgaW5QdWJsaWNBcGkuc2V0KCBCb29sZWFuLlRSVUUgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGRlbGVnYXRlLnNldERpcmVjdG9yeU1vZGUoIG1vZGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0RmlsZU1vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEZpbGVNb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVNb2RlKCBmaW5hbCBpbnQgbW9kZSApCi0gICAgewotICAgICAgICBpblB1YmxpY0FwaS5zZXQoIEJvb2xlYW4uVFJVRSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZGVsZWdhdGUuc2V0RmlsZU1vZGUoIG1vZGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGluUHVibGljQXBpLnNldCggbnVsbCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0T3ZlcnJpZGVEaXJlY3RvcnlNb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRPdmVycmlkZUZpbGVNb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRPdmVycmlkZUZpbGVNb2RlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlSnZtQ2htb2QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVzZUp2bUNobW9kOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VKdm1DaG1vZCggZmluYWwgYm9vbGVhbiB1c2VKdm1DaG1vZCApCi0gICAgewotICAgICAgICB0aGlzLnVzZUp2bUNobW9kID0gdXNlSnZtQ2htb2Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JlUGVybWlzc2lvbnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzSWdub3JlUGVybWlzc2lvbnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0SWdub3JlUGVybWlzc2lvbnMoIGZpbmFsIGJvb2xlYW4gaWdub3JlUGVybWlzc2lvbnMgKQotICAgIHsKLSAgICAgICAgZGVsZWdhdGUuc2V0SWdub3JlUGVybWlzc2lvbnMoIGlnbm9yZVBlcm1pc3Npb25zICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGVmYXVsdEZpbGVJbmZvCi0gICAgICAgIGltcGxlbWVudHMgRmlsZUluZm8KLSAgICB7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGlucHV0RmlsZTsKLQotICAgICAgICBEZWZhdWx0RmlsZUluZm8oIGZpbmFsIEZpbGUgaW5wdXRGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pbnB1dEZpbGUgPSBpbnB1dEZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldENvbnRlbnRzKCkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbSggaW5wdXRGaWxlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGlucHV0RmlsZS5nZXROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEaXJlY3RvcnkoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gaW5wdXRGaWxlLmlzRGlyZWN0b3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNGaWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGlucHV0RmlsZS5pc0ZpbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N5bWJvbGljTGluaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvYXJjaGl2ZXIvUHJlZml4ZWRBcmNoaXZlZEZpbGVTZXQuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL2FyY2hpdmVyL1ByZWZpeGVkQXJjaGl2ZWRGaWxlU2V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjOTliMmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvYXJjaGl2ZXIvUHJlZml4ZWRBcmNoaXZlZEZpbGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuYXJjaGl2ZXI7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVkRmlsZVNldDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8uZmlsZXNlbGVjdG9ycy5GaWxlU2VsZWN0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLmZ1bmN0aW9ucy5JbnB1dFN0cmVhbVRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuYXJjaGl2ZXIuUHJlZml4ZWRGaWxlU2V0LmNvbWJpbmVTZWxlY3RvcnM7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1jbGFzcyBQcmVmaXhlZEFyY2hpdmVkRmlsZVNldAotICAgIGltcGxlbWVudHMgQXJjaGl2ZWRGaWxlU2V0Ci17Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByb290UHJlZml4OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcmNoaXZlZEZpbGVTZXQgZmlsZVNldDsKLQotICAgIHByaXZhdGUgZmluYWwgRmlsZVNlbGVjdG9yW10gc2VsZWN0b3JzOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGZpbGVTZXQgICAgVGhlIGFyY2hpdmVkIGZpbGUgc2V0LgotICAgICAqIEBwYXJhbSByb290UHJlZml4IFRoZSByb290IHByZWZpeC4KLSAgICAgKiBAcGFyYW0gc2VsZWN0b3JzICBUaGUgZmlsZSBzZWxlY3RvcnMuCi0gICAgICovCi0gICAgcHVibGljIFByZWZpeGVkQXJjaGl2ZWRGaWxlU2V0KCBBcmNoaXZlZEZpbGVTZXQgZmlsZVNldCwgU3RyaW5nIHJvb3RQcmVmaXgsIEZpbGVTZWxlY3RvcltdIHNlbGVjdG9ycyApCi0gICAgewotICAgICAgICB0aGlzLmZpbGVTZXQgPSBmaWxlU2V0OwotICAgICAgICB0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9yczsKLQotICAgICAgICBpZiAoIHJvb3RQcmVmaXgubGVuZ3RoKCkgPiAwICYmICFyb290UHJlZml4LmVuZHNXaXRoKCAiLyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucm9vdFByZWZpeCA9IHJvb3RQcmVmaXggKyAiLyI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJvb3RQcmVmaXggPSByb290UHJlZml4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBGaWxlIGdldEFyY2hpdmUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTZXQuZ2V0QXJjaGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RXhjbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTZXQuZ2V0RXhjbHVkZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIEZpbGVTZWxlY3RvcltdIGdldEZpbGVTZWxlY3RvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbWJpbmVTZWxlY3RvcnMoIGZpbGVTZXQuZ2V0RmlsZVNlbGVjdG9ycygpLCBzZWxlY3RvcnMgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZ1tdIGdldEluY2x1ZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlU2V0LmdldEluY2x1ZGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJlZml4KCkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBwcmVmaXggPSBmaWxlU2V0LmdldFByZWZpeCgpOwotICAgICAgICBpZiAoIHByZWZpeC5zdGFydHNXaXRoKCAiLyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcHJlZml4Lmxlbmd0aCgpID4gMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LnN1YnN0cmluZyggMSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByZWZpeCA9ICIiOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJvb3RQcmVmaXggKyBwcmVmaXg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQ2FzZVNlbnNpdGl2ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gZmlsZVNldC5pc0Nhc2VTZW5zaXRpdmUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRpbmdFbXB0eURpcmVjdG9yaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlU2V0LmlzSW5jbHVkaW5nRW1wdHlEaXJlY3RvcmllcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1VzaW5nRGVmYXVsdEV4Y2x1ZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlU2V0LmlzVXNpbmdEZWZhdWx0RXhjbHVkZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW5wdXRTdHJlYW1UcmFuc2Zvcm1lciBnZXRTdHJlYW1UcmFuc2Zvcm1lcigpCi0gICAgewotICAgICAgICByZXR1cm4gZmlsZVNldC5nZXRTdHJlYW1UcmFuc2Zvcm1lcigpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvYXJjaGl2ZXIvUHJlZml4ZWRGaWxlU2V0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9hcmNoaXZlci9QcmVmaXhlZEZpbGVTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDlhNDYxMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9hcmNoaXZlci9QcmVmaXhlZEZpbGVTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuYXJjaGl2ZXI7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLmZpbGVzZWxlY3RvcnMuRmlsZVNlbGVjdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5mdW5jdGlvbnMuSW5wdXRTdHJlYW1UcmFuc2Zvcm1lcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLWNsYXNzIFByZWZpeGVkRmlsZVNldAotICAgIGltcGxlbWVudHMgRmlsZVNldAotewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcm9vdFByZWZpeDsKLQotICAgIHByaXZhdGUgZmluYWwgRmlsZVNldCBmaWxlU2V0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlU2VsZWN0b3JbXSBzZWxlY3RvcnM7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gZmlsZVNldCAgICBUaGUgZmlsZSBzZXQuCi0gICAgICogQHBhcmFtIHJvb3RQcmVmaXggVGhlIHJvb3QgcHJlZml4Ci0gICAgICogQHBhcmFtIHNlbGVjdG9ycyAgVGhlIGZpbGUgc2VsZWN0b3JzLgotICAgICAqLwotICAgIHB1YmxpYyBQcmVmaXhlZEZpbGVTZXQoIGZpbmFsIEZpbGVTZXQgZmlsZVNldCwgZmluYWwgU3RyaW5nIHJvb3RQcmVmaXgsIGZpbmFsIEZpbGVTZWxlY3RvcltdIHNlbGVjdG9ycyApCi0gICAgewotICAgICAgICB0aGlzLmZpbGVTZXQgPSBmaWxlU2V0OwotICAgICAgICB0aGlzLnNlbGVjdG9ycyA9IHNlbGVjdG9yczsKLQotICAgICAgICBpZiAoIHJvb3RQcmVmaXgubGVuZ3RoKCkgPiAwICYmICFyb290UHJlZml4LmVuZHNXaXRoKCAiLyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucm9vdFByZWZpeCA9IHJvb3RQcmVmaXggKyAiLyI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnJvb3RQcmVmaXggPSByb290UHJlZml4OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRFeGNsdWRlcygpCi0gICAgewotICAgICAgICByZXR1cm4gZmlsZVNldC5nZXRFeGNsdWRlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZVNlbGVjdG9yW10gZ2V0RmlsZVNlbGVjdG9ycygpCi0gICAgewotICAgICAgICBGaWxlU2VsZWN0b3JbXSBzZWwgPSBmaWxlU2V0LmdldEZpbGVTZWxlY3RvcnMoKTsKLSAgICAgICAgZmluYWwgRmlsZVNlbGVjdG9yW10gc2VsZWN0b3JzMSA9IHNlbGVjdG9yczsKLSAgICAgICAgcmV0dXJuIGNvbWJpbmVTZWxlY3RvcnMoIHNlbCwgc2VsZWN0b3JzMSApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBzdGF0aWMgRmlsZVNlbGVjdG9yW10gY29tYmluZVNlbGVjdG9ycyggRmlsZVNlbGVjdG9yW10gZmlyc3QsIEZpbGVTZWxlY3RvcltdIHNlY29uZCApCi0gICAgewotICAgICAgICBpZiAoICggZmlyc3QgIT0gbnVsbCApICYmICggc2Vjb25kICE9IG51bGwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGVTZWxlY3RvcltdIHRlbXAgPSBuZXcgRmlsZVNlbGVjdG9yW2ZpcnN0Lmxlbmd0aCArIHNlY29uZC5sZW5ndGhdOwotCi0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBmaXJzdCwgMCwgdGVtcCwgMCwgZmlyc3QubGVuZ3RoICk7Ci0gICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KCBzZWNvbmQsIDAsIHRlbXAsIGZpcnN0Lmxlbmd0aCwgc2Vjb25kLmxlbmd0aCApOwotCi0gICAgICAgICAgICBmaXJzdCA9IHRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoICggZmlyc3QgPT0gbnVsbCApICYmICggc2Vjb25kICE9IG51bGwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpcnN0ID0gc2Vjb25kOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpcnN0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0SW5jbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTZXQuZ2V0SW5jbHVkZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHByZWZpeCA9IGZpbGVTZXQuZ2V0UHJlZml4KCk7Ci0gICAgICAgIGlmICggcHJlZml4ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcm9vdFByZWZpeDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcHJlZml4LnN0YXJ0c1dpdGgoICIvIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwcmVmaXgubGVuZ3RoKCkgPiAxICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcmVmaXggPSBwcmVmaXguc3Vic3RyaW5nKCAxICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJlZml4ID0gIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcm9vdFByZWZpeCArIHByZWZpeDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYXNlU2Vuc2l0aXZlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlU2V0LmlzQ2FzZVNlbnNpdGl2ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luY2x1ZGluZ0VtcHR5RGlyZWN0b3JpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTZXQuaXNJbmNsdWRpbmdFbXB0eURpcmVjdG9yaWVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVXNpbmdEZWZhdWx0RXhjbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTZXQuaXNVc2luZ0RlZmF1bHRFeGNsdWRlcygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgRmlsZSBnZXREaXJlY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTZXQuZ2V0RGlyZWN0b3J5KCk7Ci0gICAgfQotCi0gICAgcHVibGljIElucHV0U3RyZWFtVHJhbnNmb3JtZXIgZ2V0U3RyZWFtVHJhbnNmb3JtZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbGVTZXQuZ2V0U3RyZWFtVHJhbnNmb3JtZXIoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9hcmNoaXZlci9TYXJVbkFyY2hpdmVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9hcmNoaXZlci9TYXJVbkFyY2hpdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmZDZlODcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvYXJjaGl2ZXIvU2FyVW5BcmNoaXZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLmFyY2hpdmVyOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci56aXAuWmlwVW5BcmNoaXZlcjsKLQotLyoqCi0gKiBAYXV0aG9yIGpkY2FzZXkKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIC8vdG9kbyBkZWxldGUgdGhpcyBjbGFzcyBvbmNlIHRoZSBwbGV4dXMgbWF2ZW4gcGx1Z2luIGNhbiBtZXJnZSBhIGdlbmVyYXRlZCBjb21wb25lbnRzLnhtbCB3aXRoIGFuIGV4aXN0aW5nIG9uZS4KLSAqLwotY2xhc3MgU2FyVW5BcmNoaXZlcgotICAgIGV4dGVuZHMgWmlwVW5BcmNoaXZlcgotewotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9Bc3NlbWJseUFyY2hpdmVyUGhhc2UuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0Fzc2VtYmx5QXJjaGl2ZXJQaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzZjNzRiLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0Fzc2VtYmx5QXJjaGl2ZXJQaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci0KLS8qKgotICogSGFuZGxlcyBvbmUgdG9wLWxldmVsIHNlY3Rpb24gb2YgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IsIHRvIGRldGVybWluZSB3aGljaCBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBhc3NlbWJseSBhcmNoaXZlCi0gKiBmb3IgdGhhdCBzZWN0aW9uLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBBc3NlbWJseUFyY2hpdmVyUGhhc2UKLXsKLSAgICBTdHJpbmcgUk9MRSA9IEFzc2VtYmx5QXJjaGl2ZXJQaGFzZS5jbGFzcy5nZXROYW1lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBIYW5kbGUgdGhlIGFzc29jaWF0ZWQgc2VjdGlvbiBvZiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBhc3NlbWJseSAgICAgVGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IgdG8gdXNlCi0gICAgICogQHBhcmFtIGFyY2hpdmVyICAgICBUaGUgYXJjaGl2ZXIgdXNlZCB0byBjcmVhdGUgdGhlIGFzc2VtYmx5IGFyY2hpdmUsIHRvIHdoaWNoIGZpbGVzL2RpcmVjdG9yaWVzL2FydGlmYWN0cyBhcmUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFkZGVkCi0gICAgICogQHBhcmFtIGNvbmZpZ1NvdXJjZSBUaGUgY29uZmlndXJhdGlvbiBmb3IgdGhpcyBhc3NlbWJseSBidWlsZCwgbm9ybWFsbHkgZGVyaXZlZCBmcm9tIHRoZSBwbHVnaW4gdGhhdCBsYXVuY2hlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGFzc2VtYmx5IHByb2Nlc3MuCi0gICAgICogQHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24gICAgICAgICAgICAgICBpbiBjYXNlIG9mIGFuIGFyY2hpdmUgY3JlYXRpb24gZXJyb3IuCi0gICAgICogQHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24gICAgICAgICAgICBpbiBjYXNlIG9mIGEgYXNzZW1ibHkgZm9ybWF0dGluZyBleGNlcHRpb24uCi0gICAgICogQHRocm93cyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBpbiBjYXNlIG9mIGFuIGludmFsaWQgYXNzZW1ibGVyIGNvbmZpZ3VyYXRpb24uCi0gICAgICovCi0gICAgdm9pZCBleGVjdXRlKCBBc3NlbWJseSBhc3NlbWJseSwgQXJjaGl2ZXIgYXJjaGl2ZXIsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9Bc3NlbWJseUFyY2hpdmVyUGhhc2VDb21wYXJhdG9yLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9Bc3NlbWJseUFyY2hpdmVyUGhhc2VDb21wYXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNTM0YTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvQXNzZW1ibHlBcmNoaXZlclBoYXNlQ29tcGFyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlbWJseUFyY2hpdmVyUGhhc2VDb21wYXJhdG9yCi0gICAgaW1wbGVtZW50cyBDb21wYXJhdG9yPEFzc2VtYmx5QXJjaGl2ZXJQaGFzZT4KLXsKLSAgICBwdWJsaWMgaW50IGNvbXBhcmUoIEFzc2VtYmx5QXJjaGl2ZXJQaGFzZSBvMSwgQXNzZW1ibHlBcmNoaXZlclBoYXNlIG8yICkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gbzFoYXNPcmRlciA9IG8xIGluc3RhbmNlb2YgUGhhc2VPcmRlcjsKLSAgICAgICAgYm9vbGVhbiBvMmhhc09yZGVyID0gbzIgaW5zdGFuY2VvZiBQaGFzZU9yZGVyOwotICAgICAgICBpZiAoICFvMWhhc09yZGVyICYmICFvMmhhc09yZGVyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG8xLmdldENsYXNzKCkuZ2V0TmFtZSgpLmNvbXBhcmVUbyggbzIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICFvMWhhc09yZGVyICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICggIW8yaGFzT3JkZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKzE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBJbnRlZ2VyKCAoIChQaGFzZU9yZGVyKSBvMSApLm9yZGVyKCkgKS5jb21wYXJlVG8oICggKFBoYXNlT3JkZXIpIG8yICkub3JkZXIoKSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0RlcGVuZGVuY3lTZXRBc3NlbWJseVBoYXNlLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9EZXBlbmRlbmN5U2V0QXNzZW1ibHlQaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjY0ODZmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0RlcGVuZGVuY3lTZXRBc3NlbWJseVBoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay5BZGREZXBlbmRlbmN5U2V0c1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuQXNzZW1ibHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuRGVwZW5kZW5jeVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0QnVpbGRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIubWFuYWdlci5BcmNoaXZlck1hbmFnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmFubm90YXRpb25zLlJlcXVpcmVtZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogSGFuZGxlcyB0aGUgdG9wLWxldmVsICZsdDtkZXBlbmRlbmN5U2V0cy8mZ3Q7IHNlY3Rpb24gb2YgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IuCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1AQ29tcG9uZW50KCByb2xlID0gQXNzZW1ibHlBcmNoaXZlclBoYXNlLmNsYXNzLCBoaW50ID0gImRlcGVuZGVuY3ktc2V0cyIgKQotcHVibGljIGNsYXNzIERlcGVuZGVuY3lTZXRBc3NlbWJseVBoYXNlCi0gICAgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQKLSAgICBpbXBsZW1lbnRzIEFzc2VtYmx5QXJjaGl2ZXJQaGFzZSwgUGhhc2VPcmRlcgotewotCi0gICAgQFJlcXVpcmVtZW50Ci0gICAgcHJpdmF0ZSBNYXZlblByb2plY3RCdWlsZGVyIHByb2plY3RCdWlsZGVyOwotCi0gICAgQFJlcXVpcmVtZW50Ci0gICAgcHJpdmF0ZSBBcmNoaXZlck1hbmFnZXIgYXJjaGl2ZXJNYW5hZ2VyOwotCi0gICAgQFJlcXVpcmVtZW50Ci0gICAgcHJpdmF0ZSBEZXBlbmRlbmN5UmVzb2x2ZXIgZGVwZW5kZW5jeVJlc29sdmVyOwotCi0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGNvbnN0cnVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBEZXBlbmRlbmN5U2V0QXNzZW1ibHlQaGFzZSgpCi0gICAgewotICAgICAgICAvLyB1c2VkIGZvciBwbGV4dXMgaW5pdAotICAgIH0KLQotICAgIC8qKgotICAgICAqIEBwYXJhbSBwcm9qZWN0QnVpbGRlciBUaGUgTWF2ZW4gUHJvamVjdCBCdWlsZGVyLgotICAgICAqIEBwYXJhbSBsb2dnZXIgICAgICAgICBUaGUgTG9nZ2VyLgotICAgICAqLwotICAgIHB1YmxpYyBEZXBlbmRlbmN5U2V0QXNzZW1ibHlQaGFzZSggZmluYWwgTWF2ZW5Qcm9qZWN0QnVpbGRlciBwcm9qZWN0QnVpbGRlciwgRGVwZW5kZW5jeVJlc29sdmVyIGRlcGVuZGVuY3lSZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5wcm9qZWN0QnVpbGRlciA9IHByb2plY3RCdWlsZGVyOwotICAgICAgICB0aGlzLmRlcGVuZGVuY3lSZXNvbHZlciA9IGRlcGVuZGVuY3lSZXNvbHZlcjsKLSAgICAgICAgZW5hYmxlTG9nZ2luZyggbG9nZ2VyICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5LCBmaW5hbCBBcmNoaXZlciBhcmNoaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIE1hcDxEZXBlbmRlbmN5U2V0LCBTZXQ8QXJ0aWZhY3Q+PiByZXNvbHZlZCA9Ci0gICAgICAgICAgICBkZXBlbmRlbmN5UmVzb2x2ZXIucmVzb2x2ZURlcGVuZGVuY3lTZXRzKCBhc3NlbWJseSwgY29uZmlnU291cmNlLCBhc3NlbWJseS5nZXREZXBlbmRlbmN5U2V0cygpICk7Ci0gICAgICAgIGZvciAoIE1hcC5FbnRyeTxEZXBlbmRlbmN5U2V0LCBTZXQ8QXJ0aWZhY3Q+PiBkZXBlbmRlbmN5U2V0U2V0RW50cnkgOiByZXNvbHZlZC5lbnRyeVNldCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQWRkRGVwZW5kZW5jeVNldHNUYXNrIHRhc2sgPQotICAgICAgICAgICAgICAgIG5ldyBBZGREZXBlbmRlbmN5U2V0c1Rhc2soIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGRlcGVuZGVuY3lTZXRTZXRFbnRyeS5nZXRLZXkoKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lTZXRTZXRFbnRyeS5nZXRWYWx1ZSgpLCBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpLCBwcm9qZWN0QnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSApOwotCi0gICAgICAgICAgICB0YXNrLmV4ZWN1dGUoIGFyY2hpdmVyLCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgb3JkZXIoKQotICAgIHsKLSAgICAgICAgLy8gQ0hFQ0tTVFlMRV9PRkY6IE1hZ2ljTnVtYmVyCi0gICAgICAgIHJldHVybiA0MDsKLSAgICAgICAgLy8gQ0hFQ0tTVFlMRV9PTjogTWFnaWNOdW1iZXIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9GaWxlSXRlbUFzc2VtYmx5UGhhc2UuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0ZpbGVJdGVtQXNzZW1ibHlQaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTY4ZWMwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0ZpbGVJdGVtQXNzZW1ibHlQaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5waGFzZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuUmVhZGVyRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVJdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5Rm9ybWF0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuVHlwZUNvbnZlcnNpb25VdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5mdW5jdGlvbnMuSW5wdXRTdHJlYW1UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8ucmVzb3VyY2VzLlBsZXh1c0lvUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkFic3RyYWN0TG9nRW5hYmxlZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5Rm9ybWF0VXRpbHMud2FybkZvclBsYXRmb3JtU3BlY2lmaWNzOwotaW1wb3J0IHN0YXRpYyBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8ucmVzb3VyY2VzLlJlc291cmNlRmFjdG9yeS5jcmVhdGVSZXNvdXJjZTsKLQotLyoqCi0gKiBIYW5kbGVzIHRoZSB0b3AtbGV2ZWwgJmx0O2ZpbGVzLyZndDsgc2VjdGlvbiBvZiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvci4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLUBDb21wb25lbnQoIHJvbGUgPSBBc3NlbWJseUFyY2hpdmVyUGhhc2UuY2xhc3MsIGhpbnQgPSAiZmlsZS1pdGVtcyIgKQotcHVibGljIGNsYXNzIEZpbGVJdGVtQXNzZW1ibHlQaGFzZQotICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkCi0gICAgaW1wbGVtZW50cyBBc3NlbWJseUFyY2hpdmVyUGhhc2UsIFBoYXNlT3JkZXIKLXsKLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSwgZmluYWwgQXJjaGl2ZXIgYXJjaGl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8RmlsZUl0ZW0+IGZpbGVMaXN0ID0gYXNzZW1ibHkuZ2V0RmlsZXMoKTsKLSAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gY29uZmlnU291cmNlLmdldEJhc2VkaXIoKTsKLQotICAgICAgICBmb3IgKCBmaW5hbCBGaWxlSXRlbSBmaWxlSXRlbSA6IGZpbGVMaXN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZVBhdGggPSBmaWxlSXRlbS5nZXRTb3VyY2UoKTsKLQotICAgICAgICAgICAgLy8gZW5zdXJlIHNvdXJjZSBmaWxlIGlzIGluIGFic29sdXRlIHBhdGggZm9yIHJlYWN0b3IgYnVpbGQgdG8gd29yawotICAgICAgICAgICAgRmlsZSBzb3VyY2UgPSBuZXcgRmlsZSggc291cmNlUGF0aCApOwotCi0gICAgICAgICAgICAvLyBzYXZlIHRoZSBvcmlnaW5hbCBzb3VyY2VmaWxlJ3MgbmFtZSwgYmVjYXVzZSBmaWx0cmF0aW9uIG1heQotICAgICAgICAgICAgLy8gY3JlYXRlIGEgdGVtcCBmaWxlIHdpdGggYSBkaWZmZXJlbnQgbmFtZS4KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lID0gc291cmNlLmdldE5hbWUoKTsKLQotICAgICAgICAgICAgaWYgKCAhc291cmNlLmlzQWJzb2x1dGUoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc291cmNlID0gbmV3IEZpbGUoIGJhc2VkaXIsIHNvdXJjZVBhdGggKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGRlc3ROYW1lID0gZmlsZUl0ZW0uZ2V0RGVzdE5hbWUoKTsKLQotICAgICAgICAgICAgaWYgKCBkZXN0TmFtZSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZXN0TmFtZSA9IHNvdXJjZU5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXREaXJlY3RvcnkxID0gZmlsZUl0ZW0uZ2V0T3V0cHV0RGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgICAgIHdhcm5Gb3JQbGF0Zm9ybVNwZWNpZmljcyggZ2V0TG9nZ2VyKCksIG91dHB1dERpcmVjdG9yeTEgKTsKLQotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dERpcmVjdG9yeSA9Ci0gICAgICAgICAgICAgICAgQXNzZW1ibHlGb3JtYXRVdGlscy5nZXRPdXRwdXREaXJlY3RvcnkoIG91dHB1dERpcmVjdG9yeTEsIGNvbmZpZ1NvdXJjZS5nZXRGaW5hbE5hbWUoKSwgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3NlbWJseUZvcm1hdFV0aWxzLm1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5Rm9ybWF0VXRpbHMuYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yKCBudWxsICkgKTsKLQotICAgICAgICAgICAgU3RyaW5nIHRhcmdldDsKLQotICAgICAgICAgICAgLy8gb21pdCB0aGUgbGFzdCBjaGFyIGlmIGVuZHMgd2l0aCAvIG9yIFxcCi0gICAgICAgICAgICBpZiAoIG91dHB1dERpcmVjdG9yeS5lbmRzV2l0aCggIi8iICkgfHwgb3V0cHV0RGlyZWN0b3J5LmVuZHNXaXRoKCAiXFwiICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldCA9IG91dHB1dERpcmVjdG9yeSArIGRlc3ROYW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoIG91dHB1dERpcmVjdG9yeS5sZW5ndGgoKSA8IDEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldCA9IGRlc3ROYW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldCA9IG91dHB1dERpcmVjdG9yeSArICIvIiArIGRlc3ROYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVRyYW5zZm9ybWVyIGZpbGVTZXRUcmFuc2Zvcm1lcnMgPQotICAgICAgICAgICAgICAgICAgICBSZWFkZXJGb3JtYXR0ZXIuZ2V0RmlsZVNldFRyYW5zZm9ybWVycyggY29uZmlnU291cmNlLCBmaWxlSXRlbS5pc0ZpbHRlcmVkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlSXRlbS5nZXRMaW5lRW5kaW5nKCkgKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIFBsZXh1c0lvUmVzb3VyY2UgcmVzdG9Vc2UgPSBjcmVhdGVSZXNvdXJjZSggc291cmNlLCBmaWxlU2V0VHJhbnNmb3JtZXJzICk7Ci0KLSAgICAgICAgICAgICAgICBpbnQgbW9kZSA9IFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCBmaWxlSXRlbS5nZXRGaWxlTW9kZSgpLCBnZXRMb2dnZXIoKSApOwotICAgICAgICAgICAgICAgIGFyY2hpdmVyLmFkZFJlc291cmNlKCByZXN0b1VzZSwgdGFyZ2V0LCBtb2RlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIGZpbmFsIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24oICJFcnJvciBhZGRpbmcgZmlsZSB0byBhcmNoaXZlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggSU9FeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiggIkVycm9yIGFkZGluZyBmaWxlIHRvIGFyY2hpdmU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBvcmRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gMTA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvRmlsZVNldEFzc2VtYmx5UGhhc2UuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0ZpbGVTZXRBc3NlbWJseVBoYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwNzFiZmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvRmlsZVNldEFzc2VtYmx5UGhhc2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5waGFzZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrLkFkZEZpbGVTZXRzVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkFic3RyYWN0TG9nRW5hYmxlZDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBIYW5kbGVzIHRoZSAmbHQ7ZmlsZVNldHMvJmd0OyB0b3AtbGV2ZWwgc2VjdGlvbiBvZiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvci4KLSAqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLUBDb21wb25lbnQoIHJvbGUgPSBBc3NlbWJseUFyY2hpdmVyUGhhc2UuY2xhc3MsIGhpbnQgPSAiZmlsZS1zZXRzIiApCi1wdWJsaWMgY2xhc3MgRmlsZVNldEFzc2VtYmx5UGhhc2UKLSAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZAotICAgIGltcGxlbWVudHMgQXNzZW1ibHlBcmNoaXZlclBoYXNlLCBQaGFzZU9yZGVyCi17Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggQE5vbm51bGwgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHksIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gYXNzZW1ibHkuZ2V0RmlsZVNldHMoKTsKLQotICAgICAgICBpZiAoICggZmlsZVNldHMgIT0gbnVsbCApICYmICFmaWxlU2V0cy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBBZGRGaWxlU2V0c1Rhc2sgdGFzayA9IG5ldyBBZGRGaWxlU2V0c1Rhc2soIGZpbGVTZXRzICk7Ci0KLSAgICAgICAgICAgIHRhc2suc2V0TG9nZ2VyKCBnZXRMb2dnZXIoKSApOwotICAgICAgICAgICAgdGFzay5leGVjdXRlKCBhcmNoaXZlciwgY29uZmlnU291cmNlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHB1YmxpYyBpbnQgb3JkZXIoKQotICAgIHsKLSAgICAgICAgLy8gQ0hFQ0tTVFlMRV9PRkY6IE1hZ2ljTnVtYmVyCi0gICAgICAgIHJldHVybiAyMDsKLSAgICAgICAgLy8gQ0hFQ0tTVFlMRV9PTjogTWFnaWNOdW1iZXIKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9Nb2R1bGVTZXRBc3NlbWJseVBoYXNlLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9Nb2R1bGVTZXRBc3NlbWJseVBoYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMDljMDguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvTW9kdWxlU2V0QXNzZW1ibHlQaGFzZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTg3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5waGFzZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnRhc2suQWRkQXJ0aWZhY3RUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay5BZGREZXBlbmRlbmN5U2V0c1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrLkFkZEZpbGVTZXRzVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mdW5jdGlvbnMuTWF2ZW5Qcm9qZWN0czsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mdW5jdGlvbnMuTW9kdWxlU2V0Q29uc3VtZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuQXNzZW1ibGllczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuTW9kdWxlQmluYXJpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuTW9kdWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLk1vZHVsZVNvdXJjZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuQXNzZW1ibHlGb3JtYXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5GaWx0ZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5Qcm9qZWN0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuVHlwZUNvbnZlcnNpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLkFyY2hpdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuUmVxdWlyZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZnVuY3Rpb25zLk1hdmVuUHJvamVjdHMuYWRkVG87Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZ1bmN0aW9ucy5NYXZlblByb2plY3RzLmxvZzsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuQXNzZW1ibHlGb3JtYXRVdGlscy5hcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5Rm9ybWF0VXRpbHMubW9kdWxlUHJvamVjdEludGVycG9sYXRvcjsKLQotLyoqCi0gKiBIYW5kbGVzIHRoZSAmbHQ7bW9kdWxlU2V0cy8mZ3Q7IHRvcC1sZXZlbCBzZWN0aW9uIG9mIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotQENvbXBvbmVudCggcm9sZSA9IEFzc2VtYmx5QXJjaGl2ZXJQaGFzZS5jbGFzcywgaGludCA9ICJtb2R1bGUtc2V0cyIgKQotcHVibGljIGNsYXNzIE1vZHVsZVNldEFzc2VtYmx5UGhhc2UKLSAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZAotICAgIGltcGxlbWVudHMgQXNzZW1ibHlBcmNoaXZlclBoYXNlLCBQaGFzZU9yZGVyCi17Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgaWYgdXNpbmcgc29tZXRoaW5nIGxpa2UgY29tbW9ucy1sYW5nIGluc3RlYWQuCi0KLSAgICAvKioKLSAgICAgKiBUaGUgbGluZSBzZXBhcmF0b3IuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQQVJBVE9SID0gU3lzdGVtLmdldFByb3BlcnR5KCAibGluZS5zZXBhcmF0b3IiICk7Ci0KLSAgICBAUmVxdWlyZW1lbnQKLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdEJ1aWxkZXIgcHJvamVjdEJ1aWxkZXI7Ci0KLSAgICBAUmVxdWlyZW1lbnQKLSAgICBwcml2YXRlIEFyY2hpdmVyTWFuYWdlciBhcmNoaXZlck1hbmFnZXI7Ci0KLSAgICBAUmVxdWlyZW1lbnQKLSAgICBwcml2YXRlIERlcGVuZGVuY3lSZXNvbHZlciBkZXBlbmRlbmN5UmVzb2x2ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2UuCi0gICAgICovCi0gICAgcHVibGljIE1vZHVsZVNldEFzc2VtYmx5UGhhc2UoKQotICAgIHsKLSAgICAgICAgLy8gbmVlZGVkIGZvciBwbGV4dXMKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcHJvamVjdEJ1aWxkZXIgVGhlIHByb2plY3QgYnVpbGRlci4KLSAgICAgKiBAcGFyYW0gbG9nZ2VyICAgICAgICAgVGhlIGxvZ2dlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgTW9kdWxlU2V0QXNzZW1ibHlQaGFzZSggZmluYWwgTWF2ZW5Qcm9qZWN0QnVpbGRlciBwcm9qZWN0QnVpbGRlciwgRGVwZW5kZW5jeVJlc29sdmVyIGRlcGVuZGVuY3lSZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlciApCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3RCdWlsZGVyID0gcHJvamVjdEJ1aWxkZXI7Ci0gICAgICAgIHRoaXMuZGVwZW5kZW5jeVJlc29sdmVyID0gZGVwZW5kZW5jeVJlc29sdmVyOwotICAgICAgICBlbmFibGVMb2dnaW5nKCBsb2dnZXIgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgQXNzZW1ibHkgYXNzZW1ibHksIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEFzc2VtYmxpZXMuZm9yRWFjaE1vZHVsZVNldCggYXNzZW1ibHksIG5ldyBNb2R1bGVTZXRDb25zdW1lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdCggTW9kdWxlU2V0IHJlc29sdmVkTW9kdWxlICkKLSAgICAgICAgICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsaWRhdGUoIHJlc29sdmVkTW9kdWxlLCBjb25maWdTb3VyY2UgKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IG1vZHVsZVByb2plY3RzID0gZ2V0TW9kdWxlUHJvamVjdHMoIHJlc29sdmVkTW9kdWxlLCBjb25maWdTb3VyY2UsIGdldExvZ2dlcigpICk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBNb2R1bGVTb3VyY2VzIHNvdXJjZXMgPSByZXNvbHZlZE1vZHVsZS5nZXRTb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgYWRkTW9kdWxlU291cmNlRmlsZVNldHMoIHNvdXJjZXMsIG1vZHVsZVByb2plY3RzLCBhcmNoaXZlciwgY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBNb2R1bGVCaW5hcmllcyBiaW5hcmllcyA9IHJlc29sdmVkTW9kdWxlLmdldEJpbmFyaWVzKCk7Ci0gICAgICAgICAgICAgICAgYWRkTW9kdWxlQmluYXJpZXMoIGFzc2VtYmx5LCByZXNvbHZlZE1vZHVsZSwgYmluYXJpZXMsIG1vZHVsZVByb2plY3RzLCBhcmNoaXZlciwgY29uZmlnU291cmNlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGUoIGZpbmFsIE1vZHVsZVNldCBtb2R1bGVTZXQsIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICB7Ci0gICAgICAgIGlmICggKCBtb2R1bGVTZXQuZ2V0U291cmNlcygpID09IG51bGwgKSAmJiAoIG1vZHVsZVNldC5nZXRCaW5hcmllcygpID09IG51bGwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oICJFbmNvdW50ZXJlZCBNb2R1bGVTZXQgd2l0aCBubyBzb3VyY2VzIG9yIGJpbmFyaWVzIHNwZWNpZmllZC4gU2tpcHBpbmcuIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBtb2R1bGVTZXQuaXNVc2VBbGxSZWFjdG9yUHJvamVjdHMoKSAmJiAhbW9kdWxlU2V0LmlzSW5jbHVkZVN1Yk1vZHVsZXMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oICJpbmNsdWRlU3ViTW9kdWxlcyA9PSBmYWxzZSBpcyBpbmNvbXBhdGlibGUgd2l0aCB1c2VBbGxSZWFjdG9yUHJvamVjdHMuIElnbm9yaW5nLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcblxuVG8gcmVmYWN0b3IsIHJlbW92ZSB0aGUgPGluY2x1ZGVTdWJNb2R1bGVzLz4gZmxhZywgYW5kIHVzZSB0aGUgPGluY2x1ZGVzLz4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImFuZCA8ZXhjbHVkZXMvPiBzZWN0aW9ucyB0byBmaW5lLXR1bmUgdGhlIG1vZHVsZXMgaW5jbHVkZWQuIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IHByb2plY3RzID0gY29uZmlnU291cmNlLmdldFJlYWN0b3JQcm9qZWN0cygpOwotICAgICAgICBpZiAoIHByb2plY3RzICE9IG51bGwgJiYgcHJvamVjdHMuc2l6ZSgpID4gMSAmJiBwcm9qZWN0cy5pbmRleE9mKCBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpICkgPT0gMAotICAgICAgICAgICAgJiYgbW9kdWxlU2V0LmdldEJpbmFyaWVzKCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oICJbREVQUkVDQVRJT05dIG1vZHVsZVNldC9iaW5hcmllcyBzZWN0aW9uIGRldGVjdGVkIGluIHJvb3QtcHJvamVjdCBhc3NlbWJseS4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cbk1PRFVMRSBCSU5BUklFUyBNQVkgTk9UIEJFIEFWQUlMQUJMRSBGT1IgVEhJUyBBU1NFTUJMWSEiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5cbiBUbyByZWZhY3RvciwgbW92ZSB0aGlzIGFzc2VtYmx5IGludG8gYSBjaGlsZCBwcm9qZWN0IGFuZCB1c2UgdGhlIGZsYWcgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjx1c2VBbGxSZWFjdG9yUHJvamVjdHM+dHJ1ZTwvdXNlQWxsUmVhY3RvclByb2plY3RzPiBpbiBlYWNoIG1vZHVsZVNldC4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG1vZHVsZVNldC5nZXRTb3VyY2VzKCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIE1vZHVsZVNvdXJjZXMgc291cmNlcyA9IG1vZHVsZVNldC5nZXRTb3VyY2VzKCk7Ci0gICAgICAgICAgICBpZiAoIGlzRGVwcmVjYXRlZE1vZHVsZVNvdXJjZXNDb25maWdQcmVzZW50KCBzb3VyY2VzICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oICJbREVQUkVDQVRJT05dIFVzZSBvZiA8bW9kdWxlU291cmNlcy8+IGFzIGEgZmlsZS1zZXQgaXMgZGVwcmVjYXRlZC4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJQbGVhc2UgdXNlIHRoZSA8ZmlsZVNldHMvPiBzdWItZWxlbWVudCBvZiA8bW9kdWxlU291cmNlcy8+IGluc3RlYWQuIiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoICFzb3VyY2VzLmlzVXNlRGVmYXVsdEV4Y2x1ZGVzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oICJbREVQUkVDQVRJT05dIFVzZSBvZiBkaXJlY3RvcnlNb2RlLCBmaWxlTW9kZSwgb3IgdXNlRGVmYXVsdEV4Y2x1ZGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZWxlbWVudHMgZGlyZWN0bHkgd2l0aGluIDxtb2R1bGVTb3VyY2VzLz4gYXJlIGFsbCBkZXByZWNhdGVkLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSB1c2UgdGhlIDxmaWxlU2V0cy8+IHN1Yi1lbGVtZW50IG9mIDxtb2R1bGVTb3VyY2VzLz4gaW5zdGVhZC4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFkZE1vZHVsZUJpbmFyaWVzKCBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSwgTW9kdWxlU2V0IG1vZHVsZVNldCwgZmluYWwgTW9kdWxlQmluYXJpZXMgYmluYXJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMsIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggYmluYXJpZXMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IG1vZHVsZVByb2plY3RzID0gbmV3IExpbmtlZEhhc2hTZXQ8TWF2ZW5Qcm9qZWN0PigpOwotCi0gICAgICAgIE1hdmVuUHJvamVjdHMuc2VsZWN0KCBwcm9qZWN0cywgInBvbSIsIGxvZyggZ2V0TG9nZ2VyKCkgKSwgYWRkVG8oIG1vZHVsZVByb2plY3RzICkgKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NpZmllciA9IGJpbmFyaWVzLmdldEF0dGFjaG1lbnRDbGFzc2lmaWVyKCk7Ci0KLSAgICAgICAgZmluYWwgTWFwPE1hdmVuUHJvamVjdCwgQXJ0aWZhY3Q+IGNob3Nlbk1vZHVsZUFydGlmYWN0cyA9IG5ldyBIYXNoTWFwPE1hdmVuUHJvamVjdCwgQXJ0aWZhY3Q+KCk7Ci0KLSAgICAgICAgZm9yICggZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgOiBtb2R1bGVQcm9qZWN0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGlmYWN0OwotCi0gICAgICAgICAgICBpZiAoIGNsYXNzaWZpZXIgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJQcm9jZXNzaW5nIGJpbmFyeSBhcnRpZmFjdCBmb3IgbW9kdWxlIHByb2plY3Q6ICIgKyBwcm9qZWN0LmdldElkKCkgKTsKLQotICAgICAgICAgICAgICAgIGFydGlmYWN0ID0gcHJvamVjdC5nZXRBcnRpZmFjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAiUHJvY2Vzc2luZyBiaW5hcnkgYXR0YWNobWVudDogIiArIGNsYXNzaWZpZXIgKyAiIGZvciBtb2R1bGUgcHJvamVjdDogIiArIHByb2plY3QuZ2V0SWQoKSApOwotCi0gICAgICAgICAgICAgICAgYXJ0aWZhY3QgPSBNYXZlblByb2plY3RzLmZpbmRBcnRpZmFjdEJ5Q2xhc3NpZmllciggcHJvamVjdCwgY2xhc3NpZmllciApOwotCi0gICAgICAgICAgICAgICAgaWYgKCBhcnRpZmFjdCA9PSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgZmluZCBhdHRhY2htZW50IHdpdGggY2xhc3NpZmllcjogIiArIGNsYXNzaWZpZXIgKyAiIGluIG1vZHVsZSBwcm9qZWN0OiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9qZWN0LmdldElkKCkgKyAiLiBQbGVhc2UgZXhjbHVkZSB0aGlzIG1vZHVsZSBmcm9tIHRoZSBtb2R1bGUtc2V0LiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNob3Nlbk1vZHVsZUFydGlmYWN0cy5wdXQoIHByb2plY3QsIGFydGlmYWN0ICk7Ci0gICAgICAgICAgICBhZGRNb2R1bGVBcnRpZmFjdCggYXJ0aWZhY3QsIHByb2plY3QsIGFyY2hpdmVyLCBjb25maWdTb3VyY2UsIGJpbmFyaWVzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PERlcGVuZGVuY3lTZXQ+IGRlcFNldHMgPSBnZXREZXBlbmRlbmN5U2V0cyggYmluYXJpZXMgKTsKLQotICAgICAgICBpZiAoIGRlcFNldHMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1hcDxEZXBlbmRlbmN5U2V0LCBTZXQ8QXJ0aWZhY3Q+PiBkZXBlbmRlbmN5U2V0U2V0TWFwID0KLSAgICAgICAgICAgICAgICBkZXBlbmRlbmN5UmVzb2x2ZXIucmVzb2x2ZURlcGVuZGVuY3lTZXRzKCBhc3NlbWJseSwgbW9kdWxlU2V0LCBjb25maWdTb3VyY2UsIGRlcFNldHMgKTsKLQotICAgICAgICAgICAgZm9yICggZmluYWwgRGVwZW5kZW5jeVNldCBkcyA6IGRlcFNldHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE5PVEU6IERpc2FibGluZyB1c2VQcm9qZWN0QXJ0aWZhY3QgZmxhZywgc2luY2UgbW9kdWxlIGFydGlmYWN0IGhhcyBhbHJlYWR5IGJlZW4gaGFuZGxlZCEKLSAgICAgICAgICAgICAgICBkcy5zZXRVc2VQcm9qZWN0QXJ0aWZhY3QoIGZhbHNlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIG1vdmVkIGludG8gYSBzaGFyZWQgY29tcG9uZW50LCBjYXVzZSB0aGlzCi0gICAgICAgICAgICAvLyB0ZXN0IGlzIHRoZSBzYW1lIGFzIGluIG1hdmVuLWVuZm9yY2UgcnVsZXMgUmVhY3Rvck1vZHVsZUNvbnZlcmdlbmNlLgotICAgICAgICAgICAgTGlzdDxNYXZlblByb2plY3Q+IHZhbGlkYXRlTW9kdWxlVmVyc2lvbnMgPSB2YWxpZGF0ZU1vZHVsZVZlcnNpb25zKCBtb2R1bGVQcm9qZWN0cyApOwotICAgICAgICAgICAgaWYgKCAhdmFsaWRhdGVNb2R1bGVWZXJzaW9ucy5pc0VtcHR5KCkgKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKCAiVGhlIGN1cnJlbnQgbW9kdWxlcyBzZWVtZWQgdG8gYmUgaGF2aW5nIGRpZmZlcmVudCB2ZXJzaW9ucy4iICk7Ci0gICAgICAgICAgICAgICAgc2IuYXBwZW5kKCBMSU5FX1NFUEFSQVRPUiApOwotICAgICAgICAgICAgICAgIGZvciAoIE1hdmVuUHJvamVjdCBtYXZlblByb2plY3QgOiB2YWxpZGF0ZU1vZHVsZVZlcnNpb25zICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggIiAtLT4gIiApOwotICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIG1hdmVuUHJvamVjdC5nZXRJZCgpICk7Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggTElORV9TRVBBUkFUT1IgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkud2Fybiggc2IudG9TdHJpbmcoKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3IgKCBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlUHJvamVjdCA6IG1vZHVsZVByb2plY3RzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIlByb2Nlc3NpbmcgYmluYXJ5IGRlcGVuZGVuY2llcyBmb3IgbW9kdWxlIHByb2plY3Q6ICIgKyBtb2R1bGVQcm9qZWN0LmdldElkKCkgKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIE1hcC5FbnRyeTxEZXBlbmRlbmN5U2V0LCBTZXQ8QXJ0aWZhY3Q+PiBkZXBlbmRlbmN5U2V0U2V0RW50cnkgOiBkZXBlbmRlbmN5U2V0U2V0TWFwLmVudHJ5U2V0KCkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgQWRkRGVwZW5kZW5jeVNldHNUYXNrIHRhc2sgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFkZERlcGVuZGVuY3lTZXRzVGFzayggQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggZGVwZW5kZW5jeVNldFNldEVudHJ5LmdldEtleSgpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5U2V0U2V0RW50cnkuZ2V0VmFsdWUoKSwgbW9kdWxlUHJvamVjdCwgcHJvamVjdEJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKSApOwotCi0gICAgICAgICAgICAgICAgICAgIHRhc2suc2V0TW9kdWxlUHJvamVjdCggbW9kdWxlUHJvamVjdCApOwotICAgICAgICAgICAgICAgICAgICB0YXNrLnNldE1vZHVsZUFydGlmYWN0KCBjaG9zZW5Nb2R1bGVBcnRpZmFjdHMuZ2V0KCBtb2R1bGVQcm9qZWN0ICkgKTsKLSAgICAgICAgICAgICAgICAgICAgdGFzay5zZXREZWZhdWx0T3V0cHV0RGlyZWN0b3J5KCBiaW5hcmllcy5nZXRPdXRwdXREaXJlY3RvcnkoKSApOwotICAgICAgICAgICAgICAgICAgICB0YXNrLnNldERlZmF1bHRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoIGJpbmFyaWVzLmdldE91dHB1dEZpbGVOYW1lTWFwcGluZygpICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgdGFzay5leGVjdXRlKCBhcmNoaXZlciwgY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWF2ZW5Qcm9qZWN0PiB2YWxpZGF0ZU1vZHVsZVZlcnNpb25zKCBTZXQ8TWF2ZW5Qcm9qZWN0PiBtb2R1bGVQcm9qZWN0cyApCi0gICAgewotICAgICAgICBMaXN0PE1hdmVuUHJvamVjdD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNYXZlblByb2plY3Q+KCk7Ci0KLSAgICAgICAgaWYgKCBtb2R1bGVQcm9qZWN0cyAhPSBudWxsICYmICFtb2R1bGVQcm9qZWN0cy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBTdHJpbmcgdmVyc2lvbiA9IG1vZHVsZVByb2plY3RzLml0ZXJhdG9yKCkubmV4dCgpLmdldFZlcnNpb24oKTsKLSAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiRmlyc3QgdmVyc2lvbjoiICsgdmVyc2lvbiApOwotICAgICAgICAgICAgZm9yICggTWF2ZW5Qcm9qZWN0IG1hdmVuUHJvamVjdCA6IG1vZHVsZVByb2plY3RzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIiAtPiBjaGVja2luZyAiICsgbWF2ZW5Qcm9qZWN0LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICBpZiAoICF2ZXJzaW9uLmVxdWFscyggbWF2ZW5Qcm9qZWN0LmdldFZlcnNpb24oKSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIG1hdmVuUHJvamVjdCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxEZXBlbmRlbmN5U2V0PiBnZXREZXBlbmRlbmN5U2V0cyggZmluYWwgTW9kdWxlQmluYXJpZXMgYmluYXJpZXMgKQotICAgIHsKLSAgICAgICAgTGlzdDxEZXBlbmRlbmN5U2V0PiBkZXBTZXRzID0gYmluYXJpZXMuZ2V0RGVwZW5kZW5jeVNldHMoKTsKLQotICAgICAgICBpZiAoICggKCBkZXBTZXRzID09IG51bGwgKSB8fCBkZXBTZXRzLmlzRW1wdHkoKSApICYmIGJpbmFyaWVzLmlzSW5jbHVkZURlcGVuZGVuY2llcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRGVwZW5kZW5jeVNldCBpbXBsaWVkRGVwZW5kZW5jeVNldCA9IG5ldyBEZXBlbmRlbmN5U2V0KCk7Ci0KLSAgICAgICAgICAgIGltcGxpZWREZXBlbmRlbmN5U2V0LnNldE91dHB1dERpcmVjdG9yeSggYmluYXJpZXMuZ2V0T3V0cHV0RGlyZWN0b3J5KCkgKTsKLSAgICAgICAgICAgIC8vaW1wbGllZERlcGVuZGVuY3lTZXQuc2V0T3V0cHV0RmlsZU5hbWVNYXBwaW5nKCBiaW5hcmllcy5nZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoKSApOwotICAgICAgICAgICAgaW1wbGllZERlcGVuZGVuY3lTZXQuc2V0RmlsZU1vZGUoIGJpbmFyaWVzLmdldEZpbGVNb2RlKCkgKTsKLSAgICAgICAgICAgIGltcGxpZWREZXBlbmRlbmN5U2V0LnNldERpcmVjdG9yeU1vZGUoIGJpbmFyaWVzLmdldERpcmVjdG9yeU1vZGUoKSApOwotICAgICAgICAgICAgaW1wbGllZERlcGVuZGVuY3lTZXQuc2V0RXhjbHVkZXMoIGJpbmFyaWVzLmdldEV4Y2x1ZGVzKCkgKTsKLSAgICAgICAgICAgIGltcGxpZWREZXBlbmRlbmN5U2V0LnNldEluY2x1ZGVzKCBiaW5hcmllcy5nZXRJbmNsdWRlcygpICk7Ci0gICAgICAgICAgICBpbXBsaWVkRGVwZW5kZW5jeVNldC5zZXRVbnBhY2soIGJpbmFyaWVzLmlzVW5wYWNrKCkgKTsKLSAgICAgICAgICAgIC8vIHVucGFja09wdGlvbnMgaXMgaGFuZGxlZCBpbiB0aGUgZmlyc3Qgc3RhZ2Ugb2YgZGVwZW5kZW5jeS1zZXQgaGFuZGxpbmcsIGJlbG93LgotCi0gICAgICAgICAgICBkZXBTZXRzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggaW1wbGllZERlcGVuZGVuY3lTZXQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBkZXBTZXRzOwotICAgIH0KLQotICAgIHZvaWQgYWRkTW9kdWxlQXJ0aWZhY3QoIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0LCBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCwgZmluYWwgQXJjaGl2ZXIgYXJjaGl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsIGZpbmFsIE1vZHVsZUJpbmFyaWVzIGJpbmFyaWVzICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIGFydGlmYWN0LmdldEZpbGUoKSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQXJ0aWZhY3Q6ICIgKyBhcnRpZmFjdC5nZXRJZCgpICsgIiAoaW5jbHVkZWQgYnkgbW9kdWxlKSBkb2VzIG5vdCBoYXZlIGFuIGFydGlmYWN0IHdpdGggYSBmaWxlLiAiCi0gICAgICAgICAgICAgICAgICAgICsgIlBsZWFzZSBlbnN1cmUgdGhlIHBhY2thZ2UgcGhhc2UgaXMgcnVuIGJlZm9yZSB0aGUgYXNzZW1ibHkgaXMgZ2VuZXJhdGVkLiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEFkZEFydGlmYWN0VGFzayB0YXNrID0gbmV3IEFkZEFydGlmYWN0VGFzayggYXJ0aWZhY3QsIGdldExvZ2dlcigpLCBudWxsICk7Ci0KLSAgICAgICAgdGFzay5zZXRGaWxlTmFtZU1hcHBpbmcoIGJpbmFyaWVzLmdldE91dHB1dEZpbGVOYW1lTWFwcGluZygpICk7Ci0gICAgICAgIHRhc2suc2V0T3V0cHV0RGlyZWN0b3J5KCBiaW5hcmllcy5nZXRPdXRwdXREaXJlY3RvcnkoKSApOwotICAgICAgICB0YXNrLnNldFByb2plY3QoIHByb2plY3QgKTsKLSAgICAgICAgdGFzay5zZXRNb2R1bGVQcm9qZWN0KCBwcm9qZWN0ICk7Ci0gICAgICAgIHRhc2suc2V0TW9kdWxlQXJ0aWZhY3QoIGFydGlmYWN0ICk7Ci0KLSAgICAgICAgZmluYWwgaW50IGRpck1vZGUgPSBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggYmluYXJpZXMuZ2V0RGlyZWN0b3J5TW9kZSgpLCBnZXRMb2dnZXIoKSApOwotICAgICAgICBpZiAoIGRpck1vZGUgIT0gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXNrLnNldERpcmVjdG9yeU1vZGUoIGRpck1vZGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGludCBmaWxlTW9kZSA9IFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCBiaW5hcmllcy5nZXRGaWxlTW9kZSgpLCBnZXRMb2dnZXIoKSApOwotICAgICAgICBpZiAoIGZpbGVNb2RlICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFzay5zZXRGaWxlTW9kZSggZmlsZU1vZGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRhc2suc2V0VW5wYWNrKCBiaW5hcmllcy5pc1VucGFjaygpICk7Ci0KLSAgICAgICAgaWYgKCBiaW5hcmllcy5pc1VucGFjaygpICYmIGJpbmFyaWVzLmdldFVucGFja09wdGlvbnMoKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFzay5zZXRJbmNsdWRlcyggYmluYXJpZXMuZ2V0VW5wYWNrT3B0aW9ucygpLmdldEluY2x1ZGVzKCkgKTsKLSAgICAgICAgICAgIHRhc2suc2V0RXhjbHVkZXMoIGJpbmFyaWVzLmdldFVucGFja09wdGlvbnMoKS5nZXRFeGNsdWRlcygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0YXNrLmV4ZWN1dGUoIGFyY2hpdmVyLCBjb25maWdTb3VyY2UgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZE1vZHVsZVNvdXJjZUZpbGVTZXRzKCBmaW5hbCBNb2R1bGVTb3VyY2VzIHNvdXJjZXMsIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IG1vZHVsZVByb2plY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyLCBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCBzb3VyY2VzID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gbmV3IEFycmF5TGlzdDxGaWxlU2V0PigpOwotCi0gICAgICAgIGlmICggaXNEZXByZWNhdGVkTW9kdWxlU291cmNlc0NvbmZpZ1ByZXNlbnQoIHNvdXJjZXMgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICAgICAgZnMuc2V0T3V0cHV0RGlyZWN0b3J5KCBzb3VyY2VzLmdldE91dHB1dERpcmVjdG9yeSgpICk7Ci0gICAgICAgICAgICBmcy5zZXRJbmNsdWRlcyggc291cmNlcy5nZXRJbmNsdWRlcygpICk7Ci0gICAgICAgICAgICBmcy5zZXRFeGNsdWRlcyggc291cmNlcy5nZXRFeGNsdWRlcygpICk7Ci0gICAgICAgICAgICBmcy5zZXRVc2VEZWZhdWx0RXhjbHVkZXMoIHNvdXJjZXMuaXNVc2VEZWZhdWx0RXhjbHVkZXMoKSApOwotCi0gICAgICAgICAgICBmaWxlU2V0cy5hZGQoIGZzICk7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PEZpbGVTZXQ+IHN1YkZpbGVTZXRzID0gc291cmNlcy5nZXRGaWxlU2V0cygpOwotCi0gICAgICAgIGlmICggKCBzdWJGaWxlU2V0cyA9PSBudWxsICkgfHwgc3ViRmlsZVNldHMuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgICAgICBmcy5zZXREaXJlY3RvcnkoICJzcmMiICk7Ci0KLSAgICAgICAgICAgIHN1YkZpbGVTZXRzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggZnMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbGVTZXRzLmFkZEFsbCggc3ViRmlsZVNldHMgKTsKLQotICAgICAgICBmb3IgKCBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlUHJvamVjdCA6IG1vZHVsZVByb2plY3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuaW5mbyggIlByb2Nlc3Npbmcgc291cmNlcyBmb3IgbW9kdWxlIHByb2plY3Q6ICIgKyBtb2R1bGVQcm9qZWN0LmdldElkKCkgKTsKLQotICAgICAgICAgICAgZmluYWwgTGlzdDxGaWxlU2V0PiBtb2R1bGVGaWxlU2V0cyA9IG5ldyBBcnJheUxpc3Q8RmlsZVNldD4oKTsKLQotICAgICAgICAgICAgZm9yICggZmluYWwgRmlsZVNldCBmaWxlU2V0IDogZmlsZVNldHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZHVsZUZpbGVTZXRzLmFkZCggY3JlYXRlRmlsZVNldCggZmlsZVNldCwgc291cmNlcywgbW9kdWxlUHJvamVjdCwgY29uZmlnU291cmNlICkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgQWRkRmlsZVNldHNUYXNrIHRhc2sgPSBuZXcgQWRkRmlsZVNldHNUYXNrKCBtb2R1bGVGaWxlU2V0cyApOwotCi0gICAgICAgICAgICB0YXNrLnNldFByb2plY3QoIG1vZHVsZVByb2plY3QgKTsKLSAgICAgICAgICAgIHRhc2suc2V0TW9kdWxlUHJvamVjdCggbW9kdWxlUHJvamVjdCApOwotICAgICAgICAgICAgdGFzay5zZXRMb2dnZXIoIGdldExvZ2dlcigpICk7Ci0KLSAgICAgICAgICAgIHRhc2suZXhlY3V0ZSggYXJjaGl2ZXIsIGNvbmZpZ1NvdXJjZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlcHJlY2F0ZWQgZmlsZS1zZXQgY29uZmlndXJhdGlvbiBkaXJlY3RseSB3aXRoaW4gdGhlIE1vZHVsZVNvdXJjZXMgb2JqZWN0IGlzIHByZXNlbnQuCi0gICAgICovCi0gICAgYm9vbGVhbiBpc0RlcHJlY2F0ZWRNb2R1bGVTb3VyY2VzQ29uZmlnUHJlc2VudCggQE5vbm51bGwgZmluYWwgTW9kdWxlU291cmNlcyBzb3VyY2VzICkKLSAgICB7Ci0gICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKCBzb3VyY2VzLmdldE91dHB1dERpcmVjdG9yeSgpICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAoIHNvdXJjZXMuZ2V0SW5jbHVkZXMoKSAhPSBudWxsICkgJiYgIXNvdXJjZXMuZ2V0SW5jbHVkZXMoKS5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAoIHNvdXJjZXMuZ2V0RXhjbHVkZXMoKSAhPSBudWxsICkgJiYgIXNvdXJjZXMuZ2V0RXhjbHVkZXMoKS5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBATm9ubnVsbAotICAgIEZpbGVTZXQgY3JlYXRlRmlsZVNldCggQE5vbm51bGwgZmluYWwgRmlsZVNldCBmaWxlU2V0LCBATm9ubnVsbCBmaW5hbCBNb2R1bGVTb3VyY2VzIHNvdXJjZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBATm9ubnVsbCBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25udWxsIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0KLSAgICAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBmaWxlU2V0LmdldERpcmVjdG9yeSgpOwotCi0gICAgICAgIGZpbmFsIEZpbGUgbW9kdWxlQmFzZWRpciA9IG1vZHVsZVByb2plY3QuZ2V0QmFzZWRpcigpOwotCi0gICAgICAgIGlmICggc291cmNlUGF0aCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRmlsZSBzb3VyY2VEaXIgPSBuZXcgRmlsZSggc291cmNlUGF0aCApOwotCi0gICAgICAgICAgICBpZiAoICFzb3VyY2VEaXIuaXNBYnNvbHV0ZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzb3VyY2VQYXRoID0gbmV3IEZpbGUoIG1vZHVsZUJhc2VkaXIsIHNvdXJjZVBhdGggKS5nZXRBYnNvbHV0ZVBhdGgoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNvdXJjZVBhdGggPSBtb2R1bGVCYXNlZGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgZnMuc2V0RGlyZWN0b3J5KCBzb3VyY2VQYXRoICk7Ci0gICAgICAgIGZzLnNldERpcmVjdG9yeU1vZGUoIGZpbGVTZXQuZ2V0RGlyZWN0b3J5TW9kZSgpICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG9yaWdpbmFsRXhjbHVkZXMgPSBmaWxlU2V0LmdldEV4Y2x1ZGVzKCk7Ci0gICAgICAgIGlmICggKCBvcmlnaW5hbEV4Y2x1ZGVzICE9IG51bGwgKSAmJiAhb3JpZ2luYWxFeGNsdWRlcy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBleGNsdWRlcy5hZGRBbGwoIG9yaWdpbmFsRXhjbHVkZXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggc291cmNlcy5pc0V4Y2x1ZGVTdWJNb2R1bGVEaXJlY3RvcmllcygpICkKLSAgICAgICAgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkgZmluYWwgTGlzdDxTdHJpbmc+IG1vZHVsZXMgPSBtb2R1bGVQcm9qZWN0LmdldE1vZHVsZXMoKTsKLSAgICAgICAgICAgIGZvciAoIGZpbmFsIFN0cmluZyBtb2R1bGVTdWJQYXRoIDogbW9kdWxlcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZXhjbHVkZXMuYWRkKCBtb2R1bGVTdWJQYXRoICsgIi8qKiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZzLnNldEV4Y2x1ZGVzKCBleGNsdWRlcyApOwotICAgICAgICBmcy5zZXRGaWx0ZXJlZCggZmlsZVNldC5pc0ZpbHRlcmVkKCkgKTsKLSAgICAgICAgZnMuc2V0RmlsZU1vZGUoIGZpbGVTZXQuZ2V0RmlsZU1vZGUoKSApOwotICAgICAgICBmcy5zZXRJbmNsdWRlcyggZmlsZVNldC5nZXRJbmNsdWRlcygpICk7Ci0gICAgICAgIGZzLnNldExpbmVFbmRpbmcoIGZpbGVTZXQuZ2V0TGluZUVuZGluZygpICk7Ci0KLSAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciA9IG1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3IoIG1vZHVsZVByb2plY3QgKTsKLSAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yID0gYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yKCBtb2R1bGVQcm9qZWN0ICk7Ci0gICAgICAgIFN0cmluZyBkZXN0UGF0aFByZWZpeCA9ICIiOwotICAgICAgICBpZiAoIHNvdXJjZXMuaXNJbmNsdWRlTW9kdWxlRGlyZWN0b3J5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXN0UGF0aFByZWZpeCA9IEFzc2VtYmx5Rm9ybWF0VXRpbHMuZXZhbHVhdGVGaWxlTmFtZU1hcHBpbmcoIHNvdXJjZXMuZ2V0T3V0cHV0RGlyZWN0b3J5TWFwcGluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9qZWN0LmdldEFydGlmYWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVByb2plY3QuZ2V0QXJ0aWZhY3QoKSwgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9qZWN0SW50ZXJwb2xhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3IgKTsKLQotICAgICAgICAgICAgaWYgKCAhZGVzdFBhdGhQcmVmaXguZW5kc1dpdGgoICIvIiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZXN0UGF0aFByZWZpeCArPSAiLyI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZGVzdFBhdGggPSBmaWxlU2V0LmdldE91dHB1dERpcmVjdG9yeSgpOwotCi0gICAgICAgIGlmICggZGVzdFBhdGggPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlc3RQYXRoID0gZGVzdFBhdGhQcmVmaXg7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXN0UGF0aCA9IGRlc3RQYXRoUHJlZml4ICsgZGVzdFBhdGg7Ci0gICAgICAgIH0KLQotICAgICAgICBkZXN0UGF0aCA9IEFzc2VtYmx5Rm9ybWF0VXRpbHMuZ2V0T3V0cHV0RGlyZWN0b3J5KCBkZXN0UGF0aCwgY29uZmlnU291cmNlLmdldEZpbmFsTmFtZSgpLCBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3IsIGFydGlmYWN0UHJvamVjdEludGVycG9sYXRvciApOwotCi0gICAgICAgIGZzLnNldE91dHB1dERpcmVjdG9yeSggZGVzdFBhdGggKTsKLQotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIm1vZHVsZSBzb3VyY2UgZGlyZWN0b3J5IGlzOiAiICsgc291cmNlUGF0aCApOwotICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIm1vZHVsZSBkZXN0IGRpcmVjdG9yeSBpczogIiArIGRlc3RQYXRoICsgIiAoYXNzZW1ibHkgYmFzZWRpciBtYXkgYmUgcHJlcGVuZGVkKSIgKTsKLQotICAgICAgICByZXR1cm4gZnM7Ci0gICAgfQotCi0gICAgQE5vbm51bGwKLSAgICBwdWJsaWMgc3RhdGljIFNldDxNYXZlblByb2plY3Q+IGdldE1vZHVsZVByb2plY3RzKCBmaW5hbCBNb2R1bGVTZXQgbW9kdWxlU2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIFNldDxNYXZlblByb2plY3Q+IG1vZHVsZVByb2plY3RzID0gbnVsbDsKLQotICAgICAgICBpZiAoIG1vZHVsZVNldC5pc1VzZUFsbFJlYWN0b3JQcm9qZWN0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCAhbW9kdWxlU2V0LmlzSW5jbHVkZVN1Yk1vZHVsZXMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbW9kdWxlUHJvamVjdHMgPSBuZXcgTGlua2VkSGFzaFNldDxNYXZlblByb2plY3Q+KCBjb25maWdTb3VyY2UuZ2V0UmVhY3RvclByb2plY3RzKCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJvamVjdCA9IGNvbmZpZ1NvdXJjZS5nZXRSZWFjdG9yUHJvamVjdHMoKS5nZXQoIDAgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbW9kdWxlUHJvamVjdHMgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1vZHVsZVByb2plY3RzID0gUHJvamVjdFV0aWxzLmdldFByb2plY3RNb2R1bGVzKCBwcm9qZWN0LCBjb25maWdTb3VyY2UuZ2V0UmVhY3RvclByb2plY3RzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVNldC5pc0luY2x1ZGVTdWJNb2R1bGVzKCksIGxvZ2dlciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcmV0cmlldmluZyBtb2R1bGUtc2V0IGZvciBwcm9qZWN0OiAiICsgcHJvamVjdC5nZXRJZCgpICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRmlsdGVyVXRpbHMuZmlsdGVyUHJvamVjdHMoIG1vZHVsZVByb2plY3RzLCBtb2R1bGVTZXQuZ2V0SW5jbHVkZXMoKSwgbW9kdWxlU2V0LmdldEV4Y2x1ZGVzKCksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyICk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgaW50IG9yZGVyKCkKLSAgICB7Ci0gICAgICAgIC8vIENIRUNLU1RZTEVfT0ZGOiBNYWdpY051bWJlcgotICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgIC8vIENIRUNLU1RZTEVfT046IE1hZ2ljTnVtYmVyCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvUGhhc2VPcmRlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvUGhhc2VPcmRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGQ3OGQxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL1BoYXNlT3JkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5waGFzZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBJbmRpY2F0ZXMgdGhlIG9yZGVyIG9mIGEgcGhhc2UKLSAqIEVsZW1lbnRzIHdpdGhvdXQgb3JkZXIgd2lsbCBjb21lIGJlZm9yZSB0aGUgb3JkZXJlZCBlbGVtZW50cwotICovCi1wdWJsaWMgaW50ZXJmYWNlIFBoYXNlT3JkZXIKLXsKLSAgICBpbnQgb3JkZXIoKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL1JlcG9zaXRvcnlBc3NlbWJseVBoYXNlLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9SZXBvc2l0b3J5QXNzZW1ibHlQaGFzZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzQ3MjEwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL1JlcG9zaXRvcnlBc3NlbWJseVBoYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlLndyYXBwZXJzLlJlcG9CdWlsZGVyQ29uZmlnU291cmNlV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlLndyYXBwZXJzLlJlcG9JbmZvV3JhcHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnRhc2suQWRkRGlyZWN0b3J5VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuQXNzZW1ibHlGb3JtYXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5UeXBlQ29udmVyc2lvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUFzc2VtYmxlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5yZXBvc2l0b3J5LlJlcG9zaXRvcnlBc3NlbWJseUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5yZXBvc2l0b3J5LlJlcG9zaXRvcnlCdWlsZGVyQ29uZmlnU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLnJlcG9zaXRvcnkubW9kZWwuUmVwb3NpdG9yeUluZm87Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuUmVxdWlyZW1lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkFic3RyYWN0TG9nRW5hYmxlZDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLUBDb21wb25lbnQoIHJvbGUgPSBBc3NlbWJseUFyY2hpdmVyUGhhc2UuY2xhc3MsIGhpbnQgPSAicmVwb3NpdG9yaWVzIiApCi1wdWJsaWMgY2xhc3MgUmVwb3NpdG9yeUFzc2VtYmx5UGhhc2UKLSAgICBleHRlbmRzIEFic3RyYWN0TG9nRW5hYmxlZAotICAgIGltcGxlbWVudHMgQXNzZW1ibHlBcmNoaXZlclBoYXNlLCBQaGFzZU9yZGVyCi17Ci0KLSAgICBAUmVxdWlyZW1lbnQKLSAgICBwcml2YXRlIFJlcG9zaXRvcnlBc3NlbWJsZXIgcmVwb3NpdG9yeUFzc2VtYmxlcjsKLQotICAgIHB1YmxpYyBSZXBvc2l0b3J5QXNzZW1ibHlQaGFzZSgpCi0gICAgewotICAgICAgICAvLyB1c2VkIGZvciBwbGV4dXMuCi0gICAgfQotCi0gICAgLy8gaW50cm9kdWNlZCBmb3IgdGVzdGluZy4KLSAgICBwdWJsaWMgUmVwb3NpdG9yeUFzc2VtYmx5UGhhc2UoIGZpbmFsIFJlcG9zaXRvcnlBc3NlbWJsZXIgcmVwb3NpdG9yeUFzc2VtYmxlciApCi0gICAgewotICAgICAgICB0aGlzLnJlcG9zaXRvcnlBc3NlbWJsZXIgPSByZXBvc2l0b3J5QXNzZW1ibGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggIlJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQiICkKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSwgZmluYWwgQXJjaGl2ZXIgYXJjaGl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PFJlcG9zaXRvcnk+IHJlcG9zaXRvcmllc0xpc3QgPSBhc3NlbWJseS5nZXRSZXBvc2l0b3JpZXMoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIHRlbXBSb290ID0gY29uZmlnU291cmNlLmdldFRlbXBvcmFyeVJvb3REaXJlY3RvcnkoKTsKLQotICAgICAgICBmb3IgKCBmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnkgOiByZXBvc2l0b3JpZXNMaXN0ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dERpcmVjdG9yeSA9Ci0gICAgICAgICAgICAgICAgQXNzZW1ibHlGb3JtYXRVdGlscy5nZXRPdXRwdXREaXJlY3RvcnkoIHJlcG9zaXRvcnkuZ2V0T3V0cHV0RGlyZWN0b3J5KCksIGNvbmZpZ1NvdXJjZS5nZXRGaW5hbE5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnU291cmNlLCBBc3NlbWJseUZvcm1hdFV0aWxzLm1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpICksIEFzc2VtYmx5Rm9ybWF0VXRpbHMuYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yKCBudWxsICkgKTsKLQotICAgICAgICAgICAgZmluYWwgRmlsZSByZXBvc2l0b3J5RGlyZWN0b3J5ID0gbmV3IEZpbGUoIHRlbXBSb290LCBvdXRwdXREaXJlY3RvcnkgKTsKLQotICAgICAgICAgICAgaWYgKCAhcmVwb3NpdG9yeURpcmVjdG9yeS5leGlzdHMoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVwb3NpdG9yeURpcmVjdG9yeS5ta2RpcnMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJBc3NlbWJsaW5nIHJlcG9zaXRvcnkgdG86ICIgKyByZXBvc2l0b3J5RGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICAgICAgcmVwb3NpdG9yeUFzc2VtYmxlci5idWlsZFJlbW90ZVJlcG9zaXRvcnkoIHJlcG9zaXRvcnlEaXJlY3RvcnksIHdyYXAoIHJlcG9zaXRvcnkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcCggY29uZmlnU291cmNlICkgKTsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIkZpbmlzaGVkIGFzc2VtYmxpbmcgcmVwb3NpdG9yeSB0bzogIiArIHJlcG9zaXRvcnlEaXJlY3RvcnkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgUmVwb3NpdG9yeUFzc2VtYmx5RXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24oICJGYWlsZWQgdG8gYXNzZW1ibGUgcmVwb3NpdG9yeTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIEFkZERpcmVjdG9yeVRhc2sgdGFzayA9IG5ldyBBZGREaXJlY3RvcnlUYXNrKCByZXBvc2l0b3J5RGlyZWN0b3J5ICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBkaXJNb2RlID0gVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoIHJlcG9zaXRvcnkuZ2V0RGlyZWN0b3J5TW9kZSgpLCBnZXRMb2dnZXIoKSApOwotICAgICAgICAgICAgaWYgKCBkaXJNb2RlICE9IC0xICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0YXNrLnNldERpcmVjdG9yeU1vZGUoIGRpck1vZGUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgaW50IGZpbGVNb2RlID0gVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoIHJlcG9zaXRvcnkuZ2V0RmlsZU1vZGUoKSwgZ2V0TG9nZ2VyKCkgKTsKLSAgICAgICAgICAgIGlmICggZmlsZU1vZGUgIT0gLTEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhc2suc2V0RmlsZU1vZGUoIGZpbGVNb2RlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhc2suc2V0T3V0cHV0RGlyZWN0b3J5KCBvdXRwdXREaXJlY3RvcnkgKTsKLQotICAgICAgICAgICAgdGFzay5leGVjdXRlKCBhcmNoaXZlciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXBvc2l0b3J5QnVpbGRlckNvbmZpZ1NvdXJjZSB3cmFwKCBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IFJlcG9CdWlsZGVyQ29uZmlnU291cmNlV3JhcHBlciggY29uZmlnU291cmNlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSZXBvc2l0b3J5SW5mbyB3cmFwKCBmaW5hbCBSZXBvc2l0b3J5IHJlcG9zaXRvcnkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSZXBvSW5mb1dyYXBwZXIoIHJlcG9zaXRvcnkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IG9yZGVyKCkKLSAgICB7Ci0gICAgICAgIC8vIENIRUNLU1RZTEVfT0ZGOiBNYWdpY051bWJlcgotICAgICAgICByZXR1cm4gNTA7Ci0gICAgICAgIC8vIENIRUNLU1RZTEVfT046IE1hZ2ljTnVtYmVyCi0gICAgfQotfQotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS93cmFwcGVycy9Hcm91cFZlcnNpb25BbGlnbm1lbnRXcmFwcGVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS93cmFwcGVycy9Hcm91cFZlcnNpb25BbGlnbm1lbnRXcmFwcGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMTc1MWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2Uvd3JhcHBlcnMvR3JvdXBWZXJzaW9uQWxpZ25tZW50V3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlLndyYXBwZXJzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuR3JvdXBWZXJzaW9uQWxpZ25tZW50OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1jbGFzcyBHcm91cFZlcnNpb25BbGlnbm1lbnRXcmFwcGVyCi0gICAgaW1wbGVtZW50cyBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5yZXBvc2l0b3J5Lm1vZGVsLkdyb3VwVmVyc2lvbkFsaWdubWVudAotewotCi0gICAgcHJpdmF0ZSBmaW5hbCBHcm91cFZlcnNpb25BbGlnbm1lbnQgYWxpZ25tZW50OwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIGFsaWdubWVudCBAe2xpbmsge0BsaW5rIEdyb3VwVmVyc2lvbkFsaWdubWVudH0KLSAgICAgKi8KLSAgICBwdWJsaWMgR3JvdXBWZXJzaW9uQWxpZ25tZW50V3JhcHBlciggZmluYWwgR3JvdXBWZXJzaW9uQWxpZ25tZW50IGFsaWdubWVudCApCi0gICAgewotICAgICAgICB0aGlzLmFsaWdubWVudCA9IGFsaWdubWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRFeGNsdWRlcygpCi0gICAgewotICAgICAgICByZXR1cm4gYWxpZ25tZW50LmdldEV4Y2x1ZGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFsaWdubWVudC5nZXRJZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFsaWdubWVudC5nZXRWZXJzaW9uKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS93cmFwcGVycy9SZXBvQnVpbGRlckNvbmZpZ1NvdXJjZVdyYXBwZXIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL3dyYXBwZXJzL1JlcG9CdWlsZGVyQ29uZmlnU291cmNlV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjEwNTE5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL3dyYXBwZXJzL1JlcG9CdWlsZGVyQ29uZmlnU291cmNlV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlLndyYXBwZXJzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQucmVwb3NpdG9yeS5SZXBvc2l0b3J5QnVpbGRlckNvbmZpZ1NvdXJjZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBvQnVpbGRlckNvbmZpZ1NvdXJjZVdyYXBwZXIKLSAgICBpbXBsZW1lbnRzIFJlcG9zaXRvcnlCdWlsZGVyQ29uZmlnU291cmNlCi17Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlOwotCi0gICAgcHVibGljIFJlcG9CdWlsZGVyQ29uZmlnU291cmNlV3JhcHBlciggQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgKQotICAgIHsKLSAgICAgICAgdGhpcy5jb25maWdTb3VyY2UgPSBjb25maWdTb3VyY2U7Ci0gICAgfQotCi0gICAgcHVibGljIEFydGlmYWN0UmVwb3NpdG9yeSBnZXRMb2NhbFJlcG9zaXRvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ1NvdXJjZS5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWF2ZW5Qcm9qZWN0IGdldFByb2plY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS93cmFwcGVycy9SZXBvSW5mb1dyYXBwZXIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL3dyYXBwZXJzL1JlcG9JbmZvV3JhcHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2Y1MDYxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL3dyYXBwZXJzL1JlcG9JbmZvV3JhcHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5waGFzZS53cmFwcGVyczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkdyb3VwVmVyc2lvbkFsaWdubWVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5SZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLnJlcG9zaXRvcnkubW9kZWwuUmVwb3NpdG9yeUluZm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIFJlcG9JbmZvV3JhcHBlcgotICAgIGltcGxlbWVudHMgUmVwb3NpdG9yeUluZm8KLXsKLQotICAgIHByaXZhdGUgZmluYWwgUmVwb3NpdG9yeSByZXBvOwotCi0gICAgcHJpdmF0ZSBMaXN0PEdyb3VwVmVyc2lvbkFsaWdubWVudFdyYXBwZXI+IGNvbnZlcnRlZEFsaWdubWVudHM7Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0gcmVwbyBUaGUge0BsaW5rIFJlcG9zaXRvcnl9Ci0gICAgICovCi0gICAgcHVibGljIFJlcG9JbmZvV3JhcHBlciggZmluYWwgUmVwb3NpdG9yeSByZXBvICkKLSAgICB7Ci0gICAgICAgIHRoaXMucmVwbyA9IHJlcG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RXhjbHVkZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlcG8uZ2V0RXhjbHVkZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIExpc3Q8R3JvdXBWZXJzaW9uQWxpZ25tZW50V3JhcHBlcj4gZ2V0R3JvdXBWZXJzaW9uQWxpZ25tZW50cygpCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PEdyb3VwVmVyc2lvbkFsaWdubWVudD4gYWxpZ25tZW50cyA9IHJlcG8uZ2V0R3JvdXBWZXJzaW9uQWxpZ25tZW50cygpOwotCi0gICAgICAgIGlmICggY29udmVydGVkQWxpZ25tZW50cyA9PSBudWxsIHx8IGFsaWdubWVudHMuc2l6ZSgpICE9IGNvbnZlcnRlZEFsaWdubWVudHMuc2l6ZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTGlzdDxHcm91cFZlcnNpb25BbGlnbm1lbnRXcmFwcGVyPiBsID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PEdyb3VwVmVyc2lvbkFsaWdubWVudFdyYXBwZXI+KCBhbGlnbm1lbnRzLnNpemUoKSApOwotCi0gICAgICAgICAgICBmb3IgKCBmaW5hbCBHcm91cFZlcnNpb25BbGlnbm1lbnQgYWxpZ25tZW50IDogYWxpZ25tZW50cyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbC5hZGQoIG5ldyBHcm91cFZlcnNpb25BbGlnbm1lbnRXcmFwcGVyKCBhbGlnbm1lbnQgKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb252ZXJ0ZWRBbGlnbm1lbnRzID0gbDsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZWRBbGlnbm1lbnRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEluY2x1ZGVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZXBvLmdldEluY2x1ZGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2NvcGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlcG8uZ2V0U2NvcGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlTWV0YWRhdGEoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlcG8uaXNJbmNsdWRlTWV0YWRhdGEoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkQXJ0aWZhY3RUYXNrLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FkZEFydGlmYWN0VGFzay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDA2ZmY3Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkQXJ0aWZhY3RUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnRhc2s7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5Bc3NlbWJseUZvcm1hdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLlR5cGVDb252ZXJzaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci51dGlsLkRlZmF1bHRBcmNoaXZlZEZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci51dGlsLkRlZmF1bHRGaWxlU2V0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5mdW5jdGlvbnMuSW5wdXRTdHJlYW1UcmFuc2Zvcm1lcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5Rm9ybWF0VXRpbHMuYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5Bc3NlbWJseUZvcm1hdFV0aWxzLm1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQWRkQXJ0aWZhY3RUYXNrCi17Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIERFRkFVTFRfSU5DTFVERVNfQVJSQVkgPSB7ICIqKi8qIiB9OwotCi0gICAgcHJpdmF0ZSBpbnQgZGlyZWN0b3J5TW9kZSA9IC0xOwotCi0gICAgcHJpdmF0ZSBpbnQgZmlsZU1vZGUgPSAtMTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiB1bnBhY2sgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGluY2x1ZGVzOwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhjbHVkZXM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0OwotCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IG1vZHVsZVByb2plY3Q7Ci0KLSAgICBwcml2YXRlIEFydGlmYWN0IG1vZHVsZUFydGlmYWN0OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmlsZU5hbWVNYXBwaW5nOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgbG9nZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbVRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDaGFyc2V0IGVuY29kaW5nOwotCi0gICAgcHVibGljIEFkZEFydGlmYWN0VGFzayggZmluYWwgQXJ0aWZhY3QgYXJ0aWZhY3QsIGZpbmFsIExvZ2dlciBsb2dnZXIsIElucHV0U3RyZWFtVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhcnNldCBlbmNvZGluZyApCi0gICAgewotICAgICAgICB0aGlzLmFydGlmYWN0ID0gYXJ0aWZhY3Q7Ci0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOwotICAgICAgICB0aGlzLnRyYW5zZm9ybWVyID0gdHJhbnNmb3JtZXI7Ci0gICAgICAgIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkQXJ0aWZhY3RUYXNrKCBmaW5hbCBBcnRpZmFjdCBhcnRpZmFjdCwgZmluYWwgTG9nZ2VyIGxvZ2dlciwgQ2hhcnNldCBlbmNvZGluZyApCi0gICAgewotICAgICAgICB0aGlzKCBhcnRpZmFjdCwgbG9nZ2VyLCBudWxsLCBlbmNvZGluZyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyLCBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCBhcnRpZmFjdElzQXJjaGl2ZXJEZXN0aW5hdGlvbiggYXJjaGl2ZXIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFydGlmYWN0LnNldEZpbGUoIG1vdmVBcnRpZmFjdFNvbWV3aGVyZUVsc2UoIGNvbmZpZ1NvdXJjZSApICk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZGVzdERpcmVjdG9yeSA9Ci0gICAgICAgICAgICBBc3NlbWJseUZvcm1hdFV0aWxzLmdldE91dHB1dERpcmVjdG9yeSggb3V0cHV0RGlyZWN0b3J5LCBjb25maWdTb3VyY2UuZ2V0RmluYWxOYW1lKCksIGNvbmZpZ1NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9qZWN0SW50ZXJwb2xhdG9yKCBtb2R1bGVQcm9qZWN0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yKCBwcm9qZWN0ICkgKTsKLQotICAgICAgICBib29sZWFuIGZpbGVNb2RlU2V0ID0gZmFsc2U7Ci0gICAgICAgIGJvb2xlYW4gZGlyTW9kZVNldCA9IGZhbHNlOwotCi0gICAgICAgIGZpbmFsIGludCBvbGREaXJNb2RlID0gYXJjaGl2ZXIuZ2V0T3ZlcnJpZGVEaXJlY3RvcnlNb2RlKCk7Ci0gICAgICAgIGZpbmFsIGludCBvbGRGaWxlTW9kZSA9IGFyY2hpdmVyLmdldE92ZXJyaWRlRmlsZU1vZGUoKTsKLQotICAgICAgICBpZiAoIGZpbGVNb2RlICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RmlsZU1vZGUoIGZpbGVNb2RlICk7Ci0gICAgICAgICAgICBmaWxlTW9kZVNldCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRpcmVjdG9yeU1vZGUgIT0gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXREaXJlY3RvcnlNb2RlKCBkaXJlY3RvcnlNb2RlICk7Ci0gICAgICAgICAgICBkaXJNb2RlU2V0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB0cnkKLSAgICAgICAgewotCi0gICAgICAgICAgICBpZiAoIHVucGFjayApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdW5wYWNrZWQoIGFyY2hpdmVyLCBkZXN0RGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNGaWxlKCBhcmNoaXZlciwgY29uZmlnU291cmNlLCBkZXN0RGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGRpck1vZGVTZXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyLnNldERpcmVjdG9yeU1vZGUoIG9sZERpck1vZGUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBmaWxlTW9kZVNldCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RmlsZU1vZGUoIG9sZEZpbGVNb2RlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc0ZpbGUoIEFyY2hpdmVyIGFyY2hpdmVyLCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSwgU3RyaW5nIGRlc3REaXJlY3RvcnkgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyB0ZW1wTWFwcGluZyA9Ci0gICAgICAgICAgICBBc3NlbWJseUZvcm1hdFV0aWxzLmV2YWx1YXRlRmlsZU5hbWVNYXBwaW5nKCBvdXRwdXRGaWxlTmFtZU1hcHBpbmcsIGFydGlmYWN0LCBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQXJ0aWZhY3QsIGNvbmZpZ1NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3IoIG1vZHVsZVByb2plY3QgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0UHJvamVjdEludGVycG9sYXRvciggcHJvamVjdCApICk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIG91dHB1dExvY2F0aW9uID0gZGVzdERpcmVjdG9yeSArIHRlbXBNYXBwaW5nOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIGFydGlmYWN0RmlsZSA9IGFydGlmYWN0LmdldEZpbGUoKTsKLQotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAotICAgICAgICAgICAgICAgICJBZGRpbmcgYXJ0aWZhY3Q6ICIgKyBhcnRpZmFjdC5nZXRJZCgpICsgIiB3aXRoIGZpbGU6ICIgKyBhcnRpZmFjdEZpbGUgKyAiIHRvIGFzc2VtYmx5IGxvY2F0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICsgb3V0cHV0TG9jYXRpb24gKyAiLiIgKTsKLQotICAgICAgICAgICAgaWYgKCBmaWxlTW9kZSAhPSAtMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZSggYXJ0aWZhY3RGaWxlLCBvdXRwdXRMb2NhdGlvbiwgZmlsZU1vZGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcmNoaXZlci5hZGRGaWxlKCBhcnRpZmFjdEZpbGUsIG91dHB1dExvY2F0aW9uICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiRXJyb3IgYWRkaW5nIGZpbGUgJyIgKyBhcnRpZmFjdC5nZXRJZCgpICsgIicgdG8gYXJjaGl2ZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5wYWNrZWQoIEFyY2hpdmVyIGFyY2hpdmVyLCBTdHJpbmcgZGVzdERpcmVjdG9yeSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBvdXRwdXRMb2NhdGlvbiA9IGRlc3REaXJlY3Rvcnk7Ci0KLSAgICAgICAgaWYgKCAoIG91dHB1dExvY2F0aW9uLmxlbmd0aCgpID4gMCApICYmICFvdXRwdXRMb2NhdGlvbi5lbmRzV2l0aCggIi8iICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRMb2NhdGlvbiArPSAiLyI7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmdbXSBpbmNsdWRlc0FycmF5ID0gVHlwZUNvbnZlcnNpb25VdGlscy50b1N0cmluZ0FycmF5KCBpbmNsdWRlcyApOwotICAgICAgICBpZiAoIGluY2x1ZGVzQXJyYXkgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluY2x1ZGVzQXJyYXkgPSBERUZBVUxUX0lOQ0xVREVTX0FSUkFZOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4Y2x1ZGVzQXJyYXkgPSBUeXBlQ29udmVyc2lvblV0aWxzLnRvU3RyaW5nQXJyYXkoIGV4Y2x1ZGVzICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLQotICAgICAgICAgICAgZmluYWwgRmlsZSBhcnRpZmFjdEZpbGUgPSBhcnRpZmFjdC5nZXRGaWxlKCk7Ci0gICAgICAgICAgICBpZiAoIGFydGlmYWN0RmlsZSA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybigKLSAgICAgICAgICAgICAgICAgICAgIlNraXBwaW5nIGFydGlmYWN0OiAiICsgYXJ0aWZhY3QuZ2V0SWQoKSArICI7IGl0IGRvZXMgbm90IGhhdmUgYW4gYXNzb2NpYXRlZCBmaWxlIG9yIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggYXJ0aWZhY3RGaWxlLmlzRGlyZWN0b3J5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggIkFkZGluZyBhcnRpZmFjdCBkaXJlY3RvcnkgY29udGVudHMgZm9yOiAiICsgYXJ0aWZhY3QgKyAiIHRvOiAiICsgb3V0cHV0TG9jYXRpb24gKTsKLQotICAgICAgICAgICAgICAgIERlZmF1bHRGaWxlU2V0IGZzID0gRGVmYXVsdEZpbGVTZXQuZmlsZVNldCggYXJ0aWZhY3RGaWxlICk7Ci0gICAgICAgICAgICAgICAgZnMuc2V0SW5jbHVkZXMoIGluY2x1ZGVzQXJyYXkgKTsKLSAgICAgICAgICAgICAgICBmcy5zZXRFeGNsdWRlcyggZXhjbHVkZXNBcnJheSApOwotICAgICAgICAgICAgICAgIGZzLnNldFByZWZpeCggb3V0cHV0TG9jYXRpb24gKTsKLSAgICAgICAgICAgICAgICBmcy5zZXRTdHJlYW1UcmFuc2Zvcm1lciggdHJhbnNmb3JtZXIgKTsKLSAgICAgICAgICAgICAgICBhcmNoaXZlci5hZGRGaWxlU2V0KCBmcyApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggIlVucGFja2luZyBhcnRpZmFjdCBjb250ZW50cyBmb3I6ICIgKyBhcnRpZmFjdCArICIgdG86ICIgKyBvdXRwdXRMb2NhdGlvbiApOwotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggImluY2x1ZGVzOlxuIiArIFN0cmluZ1V0aWxzLmpvaW4oIGluY2x1ZGVzQXJyYXksICJcbiIgKSArICJcbiIgKTsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJleGNsdWRlczpcbiIgKyAoIGV4Y2x1ZGVzQXJyYXkgPT0gbnVsbCA/ICJub25lIiA6IFN0cmluZ1V0aWxzLmpvaW4oIGV4Y2x1ZGVzQXJyYXksICJcbiIgKSApCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcbiIgKTsKLSAgICAgICAgICAgICAgICBEZWZhdWx0QXJjaGl2ZWRGaWxlU2V0IGFmcyA9IERlZmF1bHRBcmNoaXZlZEZpbGVTZXQuYXJjaGl2ZWRGaWxlU2V0KCBhcnRpZmFjdEZpbGUgKTsKLSAgICAgICAgICAgICAgICBhZnMuc2V0SW5jbHVkZXMoIGluY2x1ZGVzQXJyYXkgKTsKLSAgICAgICAgICAgICAgICBhZnMuc2V0RXhjbHVkZXMoIGV4Y2x1ZGVzQXJyYXkgKTsKLSAgICAgICAgICAgICAgICBhZnMuc2V0UHJlZml4KCBvdXRwdXRMb2NhdGlvbiApOwotICAgICAgICAgICAgICAgIGFmcy5zZXRTdHJlYW1UcmFuc2Zvcm1lciggdHJhbnNmb3JtZXIgKTsKLSAgICAgICAgICAgICAgICBhcmNoaXZlci5hZGRBcmNoaXZlZEZpbGVTZXQoIGFmcywgZW5jb2RpbmcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJFcnJvciBhZGRpbmcgZmlsZS1zZXQgZm9yICciICsgYXJ0aWZhY3QuZ2V0SWQoKSArICInIHRvIGFyY2hpdmU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIG1vdmVBcnRpZmFjdFNvbWV3aGVyZUVsc2UoIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSB0ZW1wUm9vdCA9IGNvbmZpZ1NvdXJjZS5nZXRUZW1wb3JhcnlSb290RGlyZWN0b3J5KCk7Ci0gICAgICAgIGZpbmFsIEZpbGUgdGVtcEFydGlmYWN0RmlsZSA9IG5ldyBGaWxlKCB0ZW1wUm9vdCwgYXJ0aWZhY3QuZ2V0RmlsZSgpLmdldE5hbWUoKSApOwotCi0gICAgICAgIGxvZ2dlci53YXJuKCAiQXJ0aWZhY3Q6ICIgKyBhcnRpZmFjdC5nZXRJZCgpICsgIiByZWZlcmVuY2VzIHRoZSBzYW1lIGZpbGUgYXMgdGhlIGFzc2VtYmx5IGRlc3RpbmF0aW9uIGZpbGUuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICArICJNb3ZpbmcgaXQgdG8gYSB0ZW1wb3JhcnkgbG9jYXRpb24gZm9yIGluY2x1c2lvbi4iICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoIGFydGlmYWN0LmdldEZpbGUoKSwgdGVtcEFydGlmYWN0RmlsZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkVycm9yIG1vdmluZyBhcnRpZmFjdCBmaWxlOiAnIiArIGFydGlmYWN0LmdldEZpbGUoKSArICInIHRvIHRlbXBvcmFyeSBsb2NhdGlvbjogIiArIHRlbXBBcnRpZmFjdEZpbGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLiBSZWFzb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZW1wQXJ0aWZhY3RGaWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBhcnRpZmFjdElzQXJjaGl2ZXJEZXN0aW5hdGlvbiggQXJjaGl2ZXIgYXJjaGl2ZXIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuICggKCBhcnRpZmFjdC5nZXRGaWxlKCkgIT0gbnVsbCApICYmICggYXJjaGl2ZXIuZ2V0RGVzdEZpbGUoKSAhPSBudWxsICkgKSAmJiBhcnRpZmFjdC5nZXRGaWxlKCkuZXF1YWxzKAotICAgICAgICAgICAgYXJjaGl2ZXIuZ2V0RGVzdEZpbGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeU1vZGUoIGZpbmFsIGludCBkaXJlY3RvcnlNb2RlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGlyZWN0b3J5TW9kZSA9IGRpcmVjdG9yeU1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZU1vZGUoIGZpbmFsIGludCBmaWxlTW9kZSApCi0gICAgewotICAgICAgICB0aGlzLmZpbGVNb2RlID0gZmlsZU1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXhjbHVkZXMoIGZpbmFsIExpc3Q8U3RyaW5nPiBleGNsdWRlcyApCi0gICAgewotICAgICAgICB0aGlzLmV4Y2x1ZGVzID0gZXhjbHVkZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZXMoIGZpbmFsIExpc3Q8U3RyaW5nPiBpbmNsdWRlcyApCi0gICAgewotICAgICAgICB0aGlzLmluY2x1ZGVzID0gaW5jbHVkZXM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VW5wYWNrKCBmaW5hbCBib29sZWFuIHVucGFjayApCi0gICAgewotICAgICAgICB0aGlzLnVucGFjayA9IHVucGFjazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KCBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE91dHB1dERpcmVjdG9yeSggZmluYWwgU3RyaW5nIG91dHB1dERpcmVjdG9yeSApCi0gICAgewotICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTmFtZU1hcHBpbmcoIGZpbmFsIFN0cmluZyBvdXRwdXRGaWxlTmFtZU1hcHBpbmcgKQotICAgIHsKLSAgICAgICAgdGhpcy5vdXRwdXRGaWxlTmFtZU1hcHBpbmcgPSBvdXRwdXRGaWxlTmFtZU1hcHBpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KCBmaW5hbCBTdHJpbmcgb3V0cHV0RGlyZWN0b3J5LCBmaW5hbCBTdHJpbmcgZGVmYXVsdE91dHB1dERpcmVjdG9yeSApCi0gICAgewotICAgICAgICBzZXRPdXRwdXREaXJlY3RvcnkoIG91dHB1dERpcmVjdG9yeSA9PSBudWxsID8gZGVmYXVsdE91dHB1dERpcmVjdG9yeSA6IG91dHB1dERpcmVjdG9yeSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbGVOYW1lTWFwcGluZyggZmluYWwgU3RyaW5nIG91dHB1dEZpbGVOYW1lTWFwcGluZywgZmluYWwgU3RyaW5nIGRlZmF1bHRPdXRwdXRGaWxlTmFtZU1hcHBpbmcgKQotICAgIHsKLSAgICAgICAgc2V0RmlsZU5hbWVNYXBwaW5nKCBvdXRwdXRGaWxlTmFtZU1hcHBpbmcgPT0gbnVsbCA/IGRlZmF1bHRPdXRwdXRGaWxlTmFtZU1hcHBpbmcgOiBvdXRwdXRGaWxlTmFtZU1hcHBpbmcgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVQcm9qZWN0KCBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlUHJvamVjdCApCi0gICAgewotICAgICAgICB0aGlzLm1vZHVsZVByb2plY3QgPSBtb2R1bGVQcm9qZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZUFydGlmYWN0KCBmaW5hbCBBcnRpZmFjdCBtb2R1bGVBcnRpZmFjdCApCi0gICAgewotICAgICAgICB0aGlzLm1vZHVsZUFydGlmYWN0ID0gbW9kdWxlQXJ0aWZhY3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FkZERlcGVuZGVuY3lTZXRzVGFzay5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay9BZGREZXBlbmRlbmN5U2V0c1Rhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDYxYmJmNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FkZERlcGVuZGVuY3lTZXRzVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLkRlcGVuZGVuY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LlJlYWRlckZvcm1hdHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLlVucGFja09wdGlvbnM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuQXNzZW1ibHlGb3JtYXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5GaWx0ZXJVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5UeXBlQ29udmVyc2lvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0LlByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5hcnRpZmFjdC5maWx0ZXIuU2NvcGVBcnRpZmFjdEZpbHRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLmZ1bmN0aW9ucy5JbnB1dFN0cmVhbVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5GaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5Rm9ybWF0VXRpbHMuYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5Bc3NlbWJseUZvcm1hdFV0aWxzLm1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3I7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQWRkRGVwZW5kZW5jeVNldHNUYXNrCi17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gTk9OX0FSQ0hJVkVfREVQRU5ERU5DWV9UWVBFUzsKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG5vbkFyY2ggPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICBub25BcmNoLmFkZCggInBvbSIgKTsKLQotICAgICAgICBOT05fQVJDSElWRV9ERVBFTkRFTkNZX1RZUEVTID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCggbm9uQXJjaCApOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxEZXBlbmRlbmN5U2V0PiBkZXBlbmRlbmN5U2V0czsKLQotICAgIHByaXZhdGUgZmluYWwgTG9nZ2VyIGxvZ2dlcjsKLQotICAgIHByaXZhdGUgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBtb2R1bGVQcm9qZWN0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNYXZlblByb2plY3RCdWlsZGVyIHByb2plY3RCdWlsZGVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVmYXVsdE91dHB1dERpcmVjdG9yeTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRPdXRwdXRGaWxlTmFtZU1hcHBpbmc7Ci0KLSAgICBwcml2YXRlIEFydGlmYWN0IG1vZHVsZUFydGlmYWN0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IHJlc29sdmVkQXJ0aWZhY3RzOwotCi0KLSAgICBwdWJsaWMgQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBmaW5hbCBMaXN0PERlcGVuZGVuY3lTZXQ+IGRlcGVuZGVuY3lTZXRzLCBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IHJlc29sdmVkQXJ0aWZhY3RzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBNYXZlblByb2plY3RCdWlsZGVyIHByb2plY3RCdWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZXBlbmRlbmN5U2V0cyA9IGRlcGVuZGVuY3lTZXRzOwotICAgICAgICB0aGlzLnJlc29sdmVkQXJ0aWZhY3RzID0gcmVzb2x2ZWRBcnRpZmFjdHM7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0gICAgICAgIHRoaXMucHJvamVjdEJ1aWxkZXIgPSBwcm9qZWN0QnVpbGRlcjsKLSAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSggZmluYWwgQXJjaGl2ZXIgYXJjaGl2ZXIsIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCAoIGRlcGVuZGVuY3lTZXRzID09IG51bGwgKSB8fCBkZXBlbmRlbmN5U2V0cy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoICJObyBkZXBlbmRlbmN5IHNldHMgc3BlY2lmaWVkLiIgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApIGZpbmFsIExpc3Q8RGVwZW5kZW5jeT4gZGVwcyA9IHByb2plY3QuZ2V0RGVwZW5kZW5jaWVzKCk7Ci0gICAgICAgIGlmICggKCBkZXBzID09IG51bGwgKSB8fCBkZXBzLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggIlByb2plY3QgIiArIHByb2plY3QuZ2V0SWQoKSArICIgaGFzIG5vIGRlcGVuZGVuY2llcy4gU2tpcHBpbmcgZGVwZW5kZW5jeSBzZXQgYWRkaXRpb24uIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggZmluYWwgRGVwZW5kZW5jeVNldCBkZXBlbmRlbmN5U2V0IDogZGVwZW5kZW5jeVNldHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGREZXBlbmRlbmN5U2V0KCBkZXBlbmRlbmN5U2V0LCBhcmNoaXZlciwgY29uZmlnU291cmNlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGFkZERlcGVuZGVuY3lTZXQoIGZpbmFsIERlcGVuZGVuY3lTZXQgZGVwZW5kZW5jeVNldCwgZmluYWwgQXJjaGl2ZXIgYXJjaGl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGxvZ2dlci5kZWJ1ZyggIlByb2Nlc3NpbmcgRGVwZW5kZW5jeVNldCAob3V0cHV0PSIgKyBkZXBlbmRlbmN5U2V0LmdldE91dHB1dERpcmVjdG9yeSgpICsgIikiICk7Ci0KLSAgICAgICAgaWYgKCAhZGVwZW5kZW5jeVNldC5pc1VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXMoKSAmJiBkZXBlbmRlbmN5U2V0LmlzVXNlVHJhbnNpdGl2ZUZpbHRlcmluZygpICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oICJEZXBlbmRlbmN5U2V0IGhhcyBub25zZW5zaWNhbCBjb25maWd1cmF0aW9uOiB1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzID09IGZhbHNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQU5EIHVzZVRyYW5zaXRpdmVGaWx0ZXJpbmcgPT0gdHJ1ZS4gVHJhbnNpdGl2ZSBmaWx0ZXJpbmcgZmxhZyB3aWxsIGJlIGlnbm9yZWQuIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU2V0PEFydGlmYWN0PiBkZXBlbmRlbmN5QXJ0aWZhY3RzID0gcmVzb2x2ZURlcGVuZGVuY3lBcnRpZmFjdHMoIGRlcGVuZGVuY3lTZXQgKTsKLQotICAgICAgICBpZiAoICF1bnBhY2tUcmFuc2Zvcm1zQ29udGVudCggZGVwZW5kZW5jeVNldCApICYmIGRlcGVuZGVuY3lBcnRpZmFjdHMuc2l6ZSgpID4gMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNoZWNrTXVsdGlBcnRpZmFjdE91dHB1dENvbmZpZyggZGVwZW5kZW5jeVNldCApOwotICAgICAgICB9Ci0KLSAgICAgICAgbG9nZ2VyLmRlYnVnKCAiQWRkaW5nICIgKyBkZXBlbmRlbmN5QXJ0aWZhY3RzLnNpemUoKSArICIgZGVwZW5kZW5jeSBhcnRpZmFjdHMuIiApOwotCi0gICAgICAgIElucHV0U3RyZWFtVHJhbnNmb3JtZXIgZmlsZVNldFRyYW5zZm9ybWVycyA9Ci0gICAgICAgICAgICBpc1VucGFja1dpdGhPcHRpb25zKCBkZXBlbmRlbmN5U2V0ICkKLSAgICAgICAgICAgICAgICA/IFJlYWRlckZvcm1hdHRlci5nZXRGaWxlU2V0VHJhbnNmb3JtZXJzKCBjb25maWdTb3VyY2UsIGRlcGVuZGVuY3lTZXQuZ2V0VW5wYWNrT3B0aW9ucygpLmlzRmlsdGVyZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5U2V0LmdldFVucGFja09wdGlvbnMoKS5nZXRMaW5lRW5kaW5nKCkgKQotICAgICAgICAgICAgICAgIDogbnVsbDsKLQotICAgICAgICBmb3IgKCBmaW5hbCBBcnRpZmFjdCBkZXBBcnRpZmFjdCA6IGRlcGVuZGVuY3lBcnRpZmFjdHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXZlblByb2plY3QgZGVwUHJvamVjdDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGRlcFByb2plY3QgPSBwcm9qZWN0QnVpbGRlci5idWlsZEZyb21SZXBvc2l0b3J5KCBkZXBBcnRpZmFjdCwgY29uZmlnU291cmNlLmdldFJlbW90ZVJlcG9zaXRvcmllcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdTb3VyY2UuZ2V0TG9jYWxSZXBvc2l0b3J5KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIHJldHJpZXZpbmcgUE9NIG9mIG1vZHVsZS1kZXBlbmRlbmN5OiAiICsgZGVwQXJ0aWZhY3QuZ2V0SWQoKSArICI7IFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcblxuQnVpbGRpbmcgc3R1YiBwcm9qZWN0IGluc3RhbmNlLiIgKTsKLQotICAgICAgICAgICAgICAgIGRlcFByb2plY3QgPSBidWlsZFByb2plY3RTdHViKCBkZXBBcnRpZmFjdCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIE5PTl9BUkNISVZFX0RFUEVOREVOQ1lfVFlQRVMuY29udGFpbnMoIGRlcEFydGlmYWN0LmdldFR5cGUoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGROb25BcmNoaXZlRGVwZW5kZW5jeSggZGVwQXJ0aWZhY3QsIGRlcFByb2plY3QsIGRlcGVuZGVuY3lTZXQsIGFyY2hpdmVyLCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGROb3JtYWxBcnRpZmFjdCggZGVwZW5kZW5jeVNldCwgZGVwQXJ0aWZhY3QsIGRlcFByb2plY3QsIGFyY2hpdmVyLCBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVTZXRUcmFuc2Zvcm1lcnMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1VucGFja1dpdGhPcHRpb25zKCBEZXBlbmRlbmN5U2V0IGRlcGVuZGVuY3lTZXQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlcGVuZGVuY3lTZXQuaXNVbnBhY2soKSAmJiBkZXBlbmRlbmN5U2V0LmdldFVucGFja09wdGlvbnMoKSAhPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiB1bnBhY2tUcmFuc2Zvcm1zQ29udGVudCggRGVwZW5kZW5jeVNldCBkZXBlbmRlbmN5U2V0ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc1VucGFja1dpdGhPcHRpb25zKCBkZXBlbmRlbmN5U2V0ICkgJiYgaXNDb25lbnRNb2RpZnlpbmdPcHRpb24oIGRlcGVuZGVuY3lTZXQuZ2V0VW5wYWNrT3B0aW9ucygpICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ29uZW50TW9kaWZ5aW5nT3B0aW9uKCBVbnBhY2tPcHRpb25zIG9wdHMgKQotICAgIHsKLSAgICAgICAgcmV0dXJuICggb3B0cy5pc0ZpbHRlcmVkKCkgfHwgb3B0cy5nZXRMaW5lRW5kaW5nKCkgIT0gbnVsbCApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja011bHRpQXJ0aWZhY3RPdXRwdXRDb25maWcoIGZpbmFsIERlcGVuZGVuY3lTZXQgZGVwZW5kZW5jeVNldCApCi0gICAgewotICAgICAgICBTdHJpbmcgZGlyID0gZGVwZW5kZW5jeVNldC5nZXRPdXRwdXREaXJlY3RvcnkoKTsKLSAgICAgICAgaWYgKCBkaXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRpciA9IGRlZmF1bHRPdXRwdXREaXJlY3Rvcnk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbWFwcGluZyA9IGRlcGVuZGVuY3lTZXQuZ2V0T3V0cHV0RmlsZU5hbWVNYXBwaW5nKCk7Ci0gICAgICAgIGlmICggbWFwcGluZyA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbWFwcGluZyA9IGRlZmF1bHRPdXRwdXRGaWxlTmFtZU1hcHBpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICggZGlyID09IG51bGwgfHwgIWRpci5jb250YWlucyggIiR7IiApICkgJiYgKCBtYXBwaW5nID09IG51bGwgfHwgIW1hcHBpbmcuY29udGFpbnMoICIkeyIgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oICJOT1RFOiBZb3VyIGFzc2VtYmx5IHNwZWNpZmllcyBhIGRlcGVuZGVuY3lTZXQgdGhhdCBtYXRjaGVzIG11bHRpcGxlIGFydGlmYWN0cywgYnV0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAic3BlY2lmaWVzIGEgY29uY3JldGUgb3V0cHV0IGZvcm1hdC4gVEhJUyBNQVkgUkVTVUxUIElOIE9ORSBPUiBNT1JFIEFSVElGQUNUUyBCRUlORyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk9CU0NVUkVEIVxuXG4iICsgIk91dHB1dCBkaXJlY3Rvcnk6ICciICsgZGlyICsgIidcbk91dHB1dCBmaWxlbmFtZSBtYXBwaW5nOiAnIiArIG1hcHBpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGROb3JtYWxBcnRpZmFjdCggZmluYWwgRGVwZW5kZW5jeVNldCBkZXBlbmRlbmN5U2V0LCBmaW5hbCBBcnRpZmFjdCBkZXBBcnRpZmFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBkZXBQcm9qZWN0LCBmaW5hbCBBcmNoaXZlciBhcmNoaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW1UcmFuc2Zvcm1lciBmaWxlU2V0VHJhbnNmb3JtZXJzICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBsb2dnZXIuZGVidWcoICJBZGRpbmcgZGVwZW5kZW5jeSBhcnRpZmFjdCAiICsgZGVwQXJ0aWZhY3QuZ2V0SWQoKSArICIuIiApOwotCi0gICAgICAgIFN0cmluZyBlbmNvZGluZyA9IGlzVW5wYWNrV2l0aE9wdGlvbnMoIGRlcGVuZGVuY3lTZXQgKSA/IGRlcGVuZGVuY3lTZXQuZ2V0VW5wYWNrT3B0aW9ucygpLmdldEVuY29kaW5nKCkgOiBudWxsOwotICAgICAgICBDaGFyc2V0IGNoYXJzZXQgPSBlbmNvZGluZyAhPSBudWxsID8gQ2hhcnNldC5mb3JOYW1lKCBlbmNvZGluZyApIDogbnVsbDsKLSAgICAgICAgZmluYWwgQWRkQXJ0aWZhY3RUYXNrIHRhc2sgPSBuZXcgQWRkQXJ0aWZhY3RUYXNrKCBkZXBBcnRpZmFjdCwgbG9nZ2VyLCBmaWxlU2V0VHJhbnNmb3JtZXJzLCBjaGFyc2V0ICk7Ci0KLSAgICAgICAgdGFzay5zZXRQcm9qZWN0KCBkZXBQcm9qZWN0ICk7Ci0gICAgICAgIHRhc2suc2V0TW9kdWxlUHJvamVjdCggbW9kdWxlUHJvamVjdCApOwotICAgICAgICB0YXNrLnNldE1vZHVsZUFydGlmYWN0KCBtb2R1bGVBcnRpZmFjdCApOwotICAgICAgICB0YXNrLnNldE91dHB1dERpcmVjdG9yeSggZGVwZW5kZW5jeVNldC5nZXRPdXRwdXREaXJlY3RvcnkoKSwgZGVmYXVsdE91dHB1dERpcmVjdG9yeSApOwotICAgICAgICB0YXNrLnNldEZpbGVOYW1lTWFwcGluZyggZGVwZW5kZW5jeVNldC5nZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoKSwgZGVmYXVsdE91dHB1dEZpbGVOYW1lTWFwcGluZyApOwotCi0gICAgICAgIGZpbmFsIGludCBkaXJNb2RlID0gVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoIGRlcGVuZGVuY3lTZXQuZ2V0RGlyZWN0b3J5TW9kZSgpLCBsb2dnZXIgKTsKLSAgICAgICAgaWYgKCBkaXJNb2RlICE9IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFzay5zZXREaXJlY3RvcnlNb2RlKCBkaXJNb2RlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgZmlsZU1vZGUgPSBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggZGVwZW5kZW5jeVNldC5nZXRGaWxlTW9kZSgpLCBsb2dnZXIgKTsKLSAgICAgICAgaWYgKCBmaWxlTW9kZSAhPSAtMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRhc2suc2V0RmlsZU1vZGUoIGZpbGVNb2RlICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0YXNrLnNldFVucGFjayggZGVwZW5kZW5jeVNldC5pc1VucGFjaygpICk7Ci0KLSAgICAgICAgZmluYWwgVW5wYWNrT3B0aW9ucyBvcHRzID0gZGVwZW5kZW5jeVNldC5nZXRVbnBhY2tPcHRpb25zKCk7Ci0gICAgICAgIGlmICggaXNVbnBhY2tXaXRoT3B0aW9ucyggZGVwZW5kZW5jeVNldCApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFzay5zZXRJbmNsdWRlcyggb3B0cy5nZXRJbmNsdWRlcygpICk7Ci0gICAgICAgICAgICB0YXNrLnNldEV4Y2x1ZGVzKCBvcHRzLmdldEV4Y2x1ZGVzKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRhc2suZXhlY3V0ZSggYXJjaGl2ZXIsIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgYnVpbGRQcm9qZWN0U3R1YiggZmluYWwgQXJ0aWZhY3QgZGVwQXJ0aWZhY3QgKQotICAgIHsKLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggZGVwQXJ0aWZhY3QuZ2V0R3JvdXBJZCgpICk7Ci0gICAgICAgIG1vZGVsLnNldEFydGlmYWN0SWQoIGRlcEFydGlmYWN0LmdldEFydGlmYWN0SWQoKSApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCBkZXBBcnRpZmFjdC5nZXRCYXNlVmVyc2lvbigpICk7Ci0gICAgICAgIG1vZGVsLnNldFBhY2thZ2luZyggZGVwQXJ0aWZhY3QuZ2V0VHlwZSgpICk7Ci0KLSAgICAgICAgbW9kZWwuc2V0RGVzY3JpcHRpb24oICJTdHViIGZvciAiICsgZGVwQXJ0aWZhY3QuZ2V0SWQoKSApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLSAgICAgICAgcHJvamVjdC5zZXRBcnRpZmFjdCggZGVwQXJ0aWZhY3QgKTsKLQotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci0KLSAgICBTZXQ8QXJ0aWZhY3Q+IHJlc29sdmVEZXBlbmRlbmN5QXJ0aWZhY3RzKCBmaW5hbCBEZXBlbmRlbmN5U2V0IGRlcGVuZGVuY3lTZXQgKQotICAgICAgICB0aHJvd3MgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFNldDxBcnRpZmFjdD4gZGVwZW5kZW5jeUFydGlmYWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0PEFydGlmYWN0PigpOwotICAgICAgICBpZiAoIHJlc29sdmVkQXJ0aWZhY3RzICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXBlbmRlbmN5QXJ0aWZhY3RzLmFkZEFsbCggcmVzb2x2ZWRBcnRpZmFjdHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZGVwZW5kZW5jeVNldC5pc1VzZVByb2plY3RBcnRpZmFjdCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQXJ0aWZhY3QgcHJvamVjdEFydGlmYWN0ID0gcHJvamVjdC5nZXRBcnRpZmFjdCgpOwotICAgICAgICAgICAgaWYgKCAoIHByb2plY3RBcnRpZmFjdCAhPSBudWxsICkgJiYgKCBwcm9qZWN0QXJ0aWZhY3QuZ2V0RmlsZSgpICE9IG51bGwgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVwZW5kZW5jeUFydGlmYWN0cy5hZGQoIHByb2plY3RBcnRpZmFjdCApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCAiQ2Fubm90IGluY2x1ZGUgcHJvamVjdCBhcnRpZmFjdDogIiArIHByb2plY3RBcnRpZmFjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyBpdCBkb2Vzbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBmaWxlIG9yIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRlcGVuZGVuY3lTZXQuaXNVc2VQcm9qZWN0QXR0YWNobWVudHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApIGZpbmFsIExpc3Q8QXJ0aWZhY3Q+IGF0dGFjaG1lbnRzID0gcHJvamVjdC5nZXRBdHRhY2hlZEFydGlmYWN0cygpOwotICAgICAgICAgICAgaWYgKCBhdHRhY2htZW50cyAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3IgKCBmaW5hbCBBcnRpZmFjdCBhdHRhY2htZW50IDogYXR0YWNobWVudHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBhdHRhY2htZW50LmdldEZpbGUoKSAhPSBudWxsICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeUFydGlmYWN0cy5hZGQoIGF0dGFjaG1lbnQgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDYW5ub3QgaW5jbHVkZSBhdHRhY2hlZCBhcnRpZmFjdDogIiArIHByb2plY3QuZ2V0SWQoKSArICIgZm9yIHByb2plY3Q6ICIgKyBwcm9qZWN0LmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyBpdCBkb2Vzbid0IGhhdmUgYW4gYXNzb2NpYXRlZCBmaWxlIG9yIGRpcmVjdG9yeS4iICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIGRlcGVuZGVuY3lTZXQuaXNVc2VUcmFuc2l0aXZlRmlsdGVyaW5nKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoICJGaWx0ZXJpbmcgZGVwZW5kZW5jeSBhcnRpZmFjdHMgVVNJTkcgdHJhbnNpdGl2ZSBkZXBlbmRlbmN5IHBhdGggaW5mb3JtYXRpb24uIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCAiRmlsdGVyaW5nIGRlcGVuZGVuY3kgYXJ0aWZhY3RzIFdJVEhPVVQgdHJhbnNpdGl2ZSBkZXBlbmRlbmN5IHBhdGggaW5mb3JtYXRpb24uIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgU2NvcGVBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgU2NvcGVBcnRpZmFjdEZpbHRlciggZGVwZW5kZW5jeVNldC5nZXRTY29wZSgpICk7Ci0KLSAgICAgICAgRmlsdGVyVXRpbHMuZmlsdGVyQXJ0aWZhY3RzKCBkZXBlbmRlbmN5QXJ0aWZhY3RzLCBkZXBlbmRlbmN5U2V0LmdldEluY2x1ZGVzKCksIGRlcGVuZGVuY3lTZXQuZ2V0RXhjbHVkZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5U2V0LmlzVXNlU3RyaWN0RmlsdGVyaW5nKCksIGRlcGVuZGVuY3lTZXQuaXNVc2VUcmFuc2l0aXZlRmlsdGVyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLCBmaWx0ZXIgKTsKLQotICAgICAgICByZXR1cm4gZGVwZW5kZW5jeUFydGlmYWN0czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkTm9uQXJjaGl2ZURlcGVuZGVuY3koIGZpbmFsIEFydGlmYWN0IGRlcEFydGlmYWN0LCBmaW5hbCBNYXZlblByb2plY3QgZGVwUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlcGVuZGVuY3lTZXQgZGVwZW5kZW5jeVNldCwgZmluYWwgQXJjaGl2ZXIgYXJjaGl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBzb3VyY2UgPSBkZXBBcnRpZmFjdC5nZXRGaWxlKCk7Ci0KLSAgICAgICAgU3RyaW5nIG91dHB1dERpcmVjdG9yeSA9IGRlcGVuZGVuY3lTZXQuZ2V0T3V0cHV0RGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciA9IG1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3IoIG1vZHVsZVByb2plY3QgKTsKLSAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yID0gYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yKCBkZXBQcm9qZWN0ICk7Ci0gICAgICAgIG91dHB1dERpcmVjdG9yeSA9Ci0gICAgICAgICAgICBBc3NlbWJseUZvcm1hdFV0aWxzLmdldE91dHB1dERpcmVjdG9yeSggb3V0cHV0RGlyZWN0b3J5LCBkZXBQcm9qZWN0LmdldEJ1aWxkKCkuZ2V0RmluYWxOYW1lKCksIGNvbmZpZ1NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9qZWN0SW50ZXJwb2xhdG9yLCBhcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3IgKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgZGVzdE5hbWUgPQotICAgICAgICAgICAgQXNzZW1ibHlGb3JtYXRVdGlscy5ldmFsdWF0ZUZpbGVOYW1lTWFwcGluZyggZGVwZW5kZW5jeVNldC5nZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoKSwgZGVwQXJ0aWZhY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpLCBtb2R1bGVBcnRpZmFjdCwgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciwgYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yICk7Ci0KLSAgICAgICAgU3RyaW5nIHRhcmdldDsKLQotICAgICAgICAvLyBvbWl0IHRoZSBsYXN0IGNoYXIgaWYgZW5kcyB3aXRoIC8gb3IgXFwKLSAgICAgICAgaWYgKCBvdXRwdXREaXJlY3RvcnkuZW5kc1dpdGgoICIvIiApIHx8IG91dHB1dERpcmVjdG9yeS5lbmRzV2l0aCggIlxcIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgdGFyZ2V0ID0gb3V0cHV0RGlyZWN0b3J5ICsgZGVzdE5hbWU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXQgPSBvdXRwdXREaXJlY3RvcnkgKyAiLyIgKyBkZXN0TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbW9kZSA9IFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCBkZXBlbmRlbmN5U2V0LmdldEZpbGVNb2RlKCksIGxvZ2dlciApOwotICAgICAgICAgICAgaWYgKCBtb2RlID4gLTEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyLmFkZEZpbGUoIHNvdXJjZSwgdGFyZ2V0LCBtb2RlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZSggc291cmNlLCB0YXJnZXQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uKCAiRXJyb3IgYWRkaW5nIGZpbGUgdG8gYXJjaGl2ZTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxEZXBlbmRlbmN5U2V0PiBnZXREZXBlbmRlbmN5U2V0cygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVwZW5kZW5jeVNldHM7Ci0gICAgfQotCi0gICAgcHVibGljIExvZ2dlciBnZXRMb2dnZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvZ2dlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0T3V0cHV0RGlyZWN0b3J5KCBmaW5hbCBTdHJpbmcgZGVmYXVsdE91dHB1dERpcmVjdG9yeSApCi0gICAgewotICAgICAgICB0aGlzLmRlZmF1bHRPdXRwdXREaXJlY3RvcnkgPSBkZWZhdWx0T3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoIGZpbmFsIFN0cmluZyBkZWZhdWx0T3V0cHV0RmlsZU5hbWVNYXBwaW5nICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdE91dHB1dEZpbGVOYW1lTWFwcGluZyA9IGRlZmF1bHRPdXRwdXRGaWxlTmFtZU1hcHBpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TW9kdWxlUHJvamVjdCggZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZVByb2plY3QgKQotICAgIHsKLSAgICAgICAgdGhpcy5tb2R1bGVQcm9qZWN0ID0gbW9kdWxlUHJvamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRNb2R1bGVBcnRpZmFjdCggZmluYWwgQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QgKQotICAgIHsKLSAgICAgICAgdGhpcy5tb2R1bGVBcnRpZmFjdCA9IG1vZHVsZUFydGlmYWN0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkRGlyZWN0b3J5VGFzay5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay9BZGREaXJlY3RvcnlUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTE4MWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay9BZGREaXJlY3RvcnlUYXNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnRhc2s7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5Bc3NlbWJseUZvcm1hdFV0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLnV0aWwuRGVmYXVsdEZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLmZ1bmN0aW9ucy5JbnB1dFN0cmVhbVRyYW5zZm9ybWVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQWRkRGlyZWN0b3J5VGFzawotewotCi0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlIGRpcmVjdG9yeTsKLQotICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW1UcmFuc2Zvcm1lciB0cmFuc2Zvcm1lcjsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGluY2x1ZGVzOwotCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZXhjbHVkZXM7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXREaXJlY3Rvcnk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgaW50IGRpcmVjdG9yeU1vZGUgPSAtMTsKLQotICAgIHByaXZhdGUgaW50IGZpbGVNb2RlID0gLTE7Ci0KLSAgICBwdWJsaWMgQWRkRGlyZWN0b3J5VGFzayggZmluYWwgRmlsZSBkaXJlY3RvcnksIElucHV0U3RyZWFtVHJhbnNmb3JtZXIgdHJhbnNmb3JtZXJzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGlyZWN0b3J5ID0gZGlyZWN0b3J5OwotCi0gICAgICAgIHRoaXMudHJhbnNmb3JtZXIgPSB0cmFuc2Zvcm1lcnM7Ci0gICAgfQotCi0gICAgcHVibGljIEFkZERpcmVjdG9yeVRhc2soIGZpbmFsIEZpbGUgZGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIGRpcmVjdG9yeSwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCAiLiIuZXF1YWxzKCBvdXRwdXREaXJlY3RvcnkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dERpcmVjdG9yeSA9ICIiOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCAiLi4iLmVxdWFscyggb3V0cHV0RGlyZWN0b3J5ICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDYW5ub3QgYWRkIHNvdXJjZSBkaXJlY3Rvcnk6ICIgKyBkaXJlY3RvcnkgKyAiIHRvIGFyY2hpdmUtcGF0aDogIiArIG91dHB1dERpcmVjdG9yeQotICAgICAgICAgICAgICAgICAgICArICIuIEFsbCBwYXRocyBtdXN0IGJlIHdpdGhpbiB0aGUgYXJjaGl2ZSByb290IGRpcmVjdG9yeS4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBpbnQgb2xkRGlyTW9kZSA9IGFyY2hpdmVyLmdldE92ZXJyaWRlRGlyZWN0b3J5TW9kZSgpOwotICAgICAgICBmaW5hbCBpbnQgb2xkRmlsZU1vZGUgPSBhcmNoaXZlci5nZXRPdmVycmlkZUZpbGVNb2RlKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBmaWxlTW9kZVNldCA9IGZhbHNlOwotICAgICAgICBib29sZWFuIGRpck1vZGVTZXQgPSBmYWxzZTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkaXJlY3RvcnlNb2RlICE9IC0xICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcmNoaXZlci5zZXREaXJlY3RvcnlNb2RlKCBkaXJlY3RvcnlNb2RlICk7Ci0gICAgICAgICAgICAgICAgZGlyTW9kZVNldCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggZmlsZU1vZGUgIT0gLTEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyLnNldEZpbGVNb2RlKCBmaWxlTW9kZSApOwotICAgICAgICAgICAgICAgIGZpbGVNb2RlU2V0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBkaXJlY3RvcnkuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBkaXJlY3RvcnlFeGNsdWRlczsKLSAgICAgICAgICAgICAgICBpZiAoIGV4Y2x1ZGVzICE9IG51bGwgJiYgIWV4Y2x1ZGVzLmlzRW1wdHkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnlFeGNsdWRlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPiggZXhjbHVkZXMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZGlyZWN0b3J5RXhjbHVkZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZ1tdIGluY2x1ZGVzQXJyYXkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBpZiAoIGluY2x1ZGVzICE9IG51bGwgJiYgIWluY2x1ZGVzLmlzRW1wdHkoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzQXJyYXkgPSBuZXcgU3RyaW5nW2luY2x1ZGVzLnNpemUoKV07Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoIFN0cmluZyBpbmNsdWRlIDogaW5jbHVkZXMgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVzQXJyYXlbaSsrXSA9IG5vcm1hbGl6ZSggaW5jbHVkZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBvbmUgaXMgZ3VhcmFudGVlZCB0byBiZSBub24tbnVsbCBieSBjb2RlIGFib3ZlLgotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNsdWRlc0FycmF5ID0gbmV3IFN0cmluZ1tkaXJlY3RvcnlFeGNsdWRlcy5zaXplKCldOwotCi0gICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICAgICAgICAgICAgZm9yICggU3RyaW5nIGRpcmVjdG9yeUV4Y2x1ZGUgOiBkaXJlY3RvcnlFeGNsdWRlcyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzQXJyYXlbaSsrXSA9IG5vcm1hbGl6ZSggZGlyZWN0b3J5RXhjbHVkZSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVmYXVsdEZpbGVTZXQgZnMgPSBuZXcgRGVmYXVsdEZpbGVTZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgZnMuc2V0VXNpbmdEZWZhdWx0RXhjbHVkZXMoIHVzZURlZmF1bHRFeGNsdWRlcyApOwotICAgICAgICAgICAgICAgICAgICBmcy5zZXRQcmVmaXgoIG91dHB1dERpcmVjdG9yeSApOwotICAgICAgICAgICAgICAgICAgICBmcy5zZXREaXJlY3RvcnkoIGRpcmVjdG9yeSApOwotICAgICAgICAgICAgICAgICAgICBmcy5zZXRJbmNsdWRlcyggaW5jbHVkZXNBcnJheSApOwotICAgICAgICAgICAgICAgICAgICBmcy5zZXRFeGNsdWRlcyggZXhjbHVkZXNBcnJheSApOwotICAgICAgICAgICAgICAgICAgICBpZiAoIHRyYW5zZm9ybWVyICE9IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmcy5zZXRTdHJlYW1UcmFuc2Zvcm1lciggdHJhbnNmb3JtZXIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGFyY2hpdmVyLmFkZEZpbGVTZXQoIGZzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZXJFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uKCAiRXJyb3IgYWRkaW5nIGRpcmVjdG9yeSB0byBhcmNoaXZlOiAiICsgZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGRpck1vZGVTZXQgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyLnNldERpcmVjdG9yeU1vZGUoIG9sZERpck1vZGUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBmaWxlTW9kZVNldCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RmlsZU1vZGUoIG9sZEZpbGVNb2RlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBub3JtYWxpemUoIFN0cmluZyBpbmNsdWRlICkKLSAgICB7Ci0gICAgICAgIFN0cmluZyB2YWx1ZSA9IEFzc2VtYmx5Rm9ybWF0VXRpbHMuZml4UmVsYXRpdmVSZWZzKCBpbmNsdWRlICk7Ci0KLSAgICAgICAgaWYgKCB2YWx1ZS5zdGFydHNXaXRoKCAiLyIgKSB8fCB2YWx1ZS5zdGFydHNXaXRoKCAiXFwiICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyggMSApOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRFeGNsdWRlcyggZmluYWwgTGlzdDxTdHJpbmc+IGV4Y2x1ZGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZXhjbHVkZXMgPSBleGNsdWRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJbmNsdWRlcyggZmluYWwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZXMgPSBpbmNsdWRlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoIGZpbmFsIFN0cmluZyBvdXRwdXREaXJlY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5vdXRwdXREaXJlY3RvcnkgPSBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGlyZWN0b3J5TW9kZSggZmluYWwgaW50IGRpcmVjdG9yeU1vZGUgKQotICAgIHsKLSAgICAgICAgdGhpcy5kaXJlY3RvcnlNb2RlID0gZGlyZWN0b3J5TW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaWxlTW9kZSggZmluYWwgaW50IGZpbGVNb2RlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlsZU1vZGUgPSBmaWxlTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VEZWZhdWx0RXhjbHVkZXMoIGZpbmFsIGJvb2xlYW4gdXNlRGVmYXVsdEV4Y2x1ZGVzICkKLSAgICB7Ci0gICAgICAgIHRoaXMudXNlRGVmYXVsdEV4Y2x1ZGVzID0gdXNlRGVmYXVsdEV4Y2x1ZGVzOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay9BZGRGaWxlU2V0c1Rhc2suamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkRmlsZVNldHNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDllNjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay9BZGRGaWxlU2V0c1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzazsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuUmVhZGVyRm9ybWF0dGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuQXNzZW1ibHlGb3JtYXRVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5UeXBlQ29udmVyc2lvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8uZnVuY3Rpb25zLklucHV0U3RyZWFtVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuY29uc29sZS5Db25zb2xlTG9nZ2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBBZGRGaWxlU2V0c1Rhc2sKLXsKLQotICAgIHByaXZhdGUgZmluYWwgTGlzdDxGaWxlU2V0PiBmaWxlU2V0czsKLQotICAgIHByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBtb2R1bGVQcm9qZWN0OwotCi0gICAgcHVibGljIEFkZEZpbGVTZXRzVGFzayggZmluYWwgTGlzdDxGaWxlU2V0PiBmaWxlU2V0cyApCi0gICAgewotICAgICAgICB0aGlzLmZpbGVTZXRzID0gZmlsZVNldHM7Ci0gICAgfQotCi0gICAgcHVibGljIEFkZEZpbGVTZXRzVGFzayggZmluYWwgRmlsZVNldC4uLiBmaWxlU2V0cyApCi0gICAgewotICAgICAgICB0aGlzLmZpbGVTZXRzID0gbmV3IEFycmF5TGlzdDxGaWxlU2V0PiggQXJyYXlzLmFzTGlzdCggZmlsZVNldHMgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyLCBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgLy8gZG9uJ3QgbmVlZCB0aGlzIGNoZWNrIGhlcmUuIGl0J3MgbW9yZSBlZmZpY2llbnQgaGVyZSwgYnV0IHRoZSBsb2dnZXIgaXMgbm90IGFjdHVhbGx5Ci0gICAgICAgIC8vIHVzZWQgdW50aWwgYWRkRmlsZVNldCguLikuLi5hbmQgdGhlIGNoZWNrIHNob3VsZCBiZSB0aGVyZSBpbiBjYXNlIHNvbWVvbmUgZXh0ZW5kcyB0aGUKLSAgICAgICAgLy8gY2xhc3MuCi0gICAgICAgIC8vIGNoZWNrTG9nZ2VyKCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBhcmNoaXZlQmFzZURpciA9IGNvbmZpZ1NvdXJjZS5nZXRBcmNoaXZlQmFzZURpcmVjdG9yeSgpOwotCi0gICAgICAgIGlmICggYXJjaGl2ZUJhc2VEaXIgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggIWFyY2hpdmVCYXNlRGlyLmV4aXN0cygpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiVGhlIGFyY2hpdmUgYmFzZSBkaXJlY3RvcnkgJyIgKyBhcmNoaXZlQmFzZURpci5nZXRBYnNvbHV0ZVBhdGgoKSArICInIGRvZXMgbm90IGV4aXN0IiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoICFhcmNoaXZlQmFzZURpci5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uKCAiVGhlIGFyY2hpdmUgYmFzZSBkaXJlY3RvcnkgJyIgKyBhcmNoaXZlQmFzZURpci5nZXRBYnNvbHV0ZVBhdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICInIGV4aXN0cywgYnV0IGl0IGlzIG5vdCBhIGRpcmVjdG9yeSIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGZpbmFsIEZpbGVTZXQgZmlsZVNldCA6IGZpbGVTZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgYWRkRmlsZVNldCggZmlsZVNldCwgYXJjaGl2ZXIsIGNvbmZpZ1NvdXJjZSwgYXJjaGl2ZUJhc2VEaXIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgYWRkRmlsZVNldCggZmluYWwgRmlsZVNldCBmaWxlU2V0LCBmaW5hbCBBcmNoaXZlciBhcmNoaXZlciwgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGFyY2hpdmVCYXNlRGlyICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyB0aHJvdyB0aGlzIGNoZWNrIGluIGp1c3QgaW4gY2FzZSBzb21lb25lIGV4dGVuZHMgdGhpcyBjbGFzcy4uLgotICAgICAgICBjaGVja0xvZ2dlcigpOwotCi0gICAgICAgIGlmICggcHJvamVjdCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJvamVjdCA9IGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBwcm9qZWN0LmdldEJhc2VkaXIoKTsKLQotICAgICAgICBTdHJpbmcgZGVzdERpcmVjdG9yeSA9IGZpbGVTZXQuZ2V0T3V0cHV0RGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgaWYgKCBkZXN0RGlyZWN0b3J5ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXN0RGlyZWN0b3J5ID0gZmlsZVNldC5nZXREaXJlY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEFzc2VtYmx5Rm9ybWF0VXRpbHMud2FybkZvclBsYXRmb3JtU3BlY2lmaWNzKCBsb2dnZXIsICBkZXN0RGlyZWN0b3J5ICk7Ci0KLSAgICAgICAgZGVzdERpcmVjdG9yeSA9Ci0gICAgICAgICAgICBBc3NlbWJseUZvcm1hdFV0aWxzLmdldE91dHB1dERpcmVjdG9yeSggZGVzdERpcmVjdG9yeSwgY29uZmlnU291cmNlLmdldEZpbmFsTmFtZSgpLCBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHlGb3JtYXRVdGlscy5tb2R1bGVQcm9qZWN0SW50ZXJwb2xhdG9yKCBtb2R1bGVQcm9qZWN0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzZW1ibHlGb3JtYXRVdGlscy5hcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3IoIHByb2plY3QgKSApOwotCi0gICAgICAgIGlmICggbG9nZ2VyLmlzRGVidWdFbmFibGVkKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2dnZXIuZGVidWcoICJGaWxlU2V0WyIgKyBkZXN0RGlyZWN0b3J5ICsgIl0iICsgIiBkaXIgcGVybXM6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKAotICAgICAgICAgICAgICAgIGFyY2hpdmVyLmdldE92ZXJyaWRlRGlyZWN0b3J5TW9kZSgpLCA4ICkgKyAiIGZpbGUgcGVybXM6ICIgKyBJbnRlZ2VyLnRvU3RyaW5nKAotICAgICAgICAgICAgICAgIGFyY2hpdmVyLmdldE92ZXJyaWRlRmlsZU1vZGUoKSwgOCApICsgKCBmaWxlU2V0LmdldExpbmVFbmRpbmcoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgIDogIiBsaW5lRW5kaW5nczogIiArIGZpbGVTZXQuZ2V0TGluZUVuZGluZygpICkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGxvZ2dlci5kZWJ1ZyggIlRoZSBhcmNoaXZlIGJhc2UgZGlyZWN0b3J5IGlzICciICsgYXJjaGl2ZUJhc2VEaXIgKyAiJyIgKTsKLQotICAgICAgICBGaWxlIGZpbGVTZXREaXIgPSBnZXRGaWxlU2V0RGlyZWN0b3J5KCBmaWxlU2V0LCBiYXNlZGlyLCBhcmNoaXZlQmFzZURpciApOwotCi0gICAgICAgIGlmICggZmlsZVNldERpci5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElucHV0U3RyZWFtVHJhbnNmb3JtZXIgZmlsZVNldFRyYW5zZm9ybWVycyA9Ci0gICAgICAgICAgICAgICAgUmVhZGVyRm9ybWF0dGVyLmdldEZpbGVTZXRUcmFuc2Zvcm1lcnMoIGNvbmZpZ1NvdXJjZSwgZmlsZVNldC5pc0ZpbHRlcmVkKCksIGZpbGVTZXQuZ2V0TGluZUVuZGluZygpICk7Ci0gICAgICAgICAgICBpZiAoIGZpbGVTZXRUcmFuc2Zvcm1lcnMgPT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCAiTk9UIHJlZm9ybWF0dGluZyBhbnkgZmlsZXMgaW4gIiArIGZpbGVTZXREaXIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBmaWxlU2V0RGlyLmdldFBhdGgoKS5lcXVhbHMoIEZpbGUuc2VwYXJhdG9yICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJZb3VyIGFzc2VtYmx5IGRlc2NyaXB0b3Igc3BlY2lmaWVzIGEgZGlyZWN0b3J5IG9mICIgKyBGaWxlLnNlcGFyYXRvcgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCB3aGljaCBpcyB5b3VyICplbnRpcmUqIGZpbGUgc3lzdGVtLlxuVGhlc2UgYXJlIG5vdCB0aGUgZmlsZXMgeW91IGFyZSBsb29raW5nIGZvciIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIEFkZERpcmVjdG9yeVRhc2sgdGFzayA9IG5ldyBBZGREaXJlY3RvcnlUYXNrKCBmaWxlU2V0RGlyLCBmaWxlU2V0VHJhbnNmb3JtZXJzICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBkaXJNb2RlID0gVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoIGZpbGVTZXQuZ2V0RGlyZWN0b3J5TW9kZSgpLCBsb2dnZXIgKTsKLSAgICAgICAgICAgIGlmICggZGlyTW9kZSAhPSAtMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFzay5zZXREaXJlY3RvcnlNb2RlKCBkaXJNb2RlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIGludCBmaWxlTW9kZSA9IFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCBmaWxlU2V0LmdldEZpbGVNb2RlKCksIGxvZ2dlciApOwotICAgICAgICAgICAgaWYgKCBmaWxlTW9kZSAhPSAtMSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFzay5zZXRGaWxlTW9kZSggZmlsZU1vZGUgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdGFzay5zZXRVc2VEZWZhdWx0RXhjbHVkZXMoIGZpbGVTZXQuaXNVc2VEZWZhdWx0RXhjbHVkZXMoKSApOwotCi0gICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gZXhjbHVkZXMgPSBmaWxlU2V0LmdldEV4Y2x1ZGVzKCk7Ci0gICAgICAgICAgICBleGNsdWRlcy5hZGQoICIqKi8qLmZpbHRlcmVkIiApOwotICAgICAgICAgICAgZXhjbHVkZXMuYWRkKCAiKiovKi5mb3JtYXR0ZWQiICk7Ci0gICAgICAgICAgICB0YXNrLnNldEV4Y2x1ZGVzKCBleGNsdWRlcyApOwotCi0gICAgICAgICAgICB0YXNrLnNldEluY2x1ZGVzKCBmaWxlU2V0LmdldEluY2x1ZGVzKCkgKTsKLSAgICAgICAgICAgIHRhc2suc2V0T3V0cHV0RGlyZWN0b3J5KCBkZXN0RGlyZWN0b3J5ICk7Ci0KLSAgICAgICAgICAgIHRhc2suZXhlY3V0ZSggYXJjaGl2ZXIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEZpbGUgZ2V0RmlsZVNldERpcmVjdG9yeSggZmluYWwgRmlsZVNldCBmaWxlU2V0LCBmaW5hbCBGaWxlIGJhc2VkaXIsIGZpbmFsIEZpbGUgYXJjaGl2ZUJhc2VEaXIgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBzb3VyY2VEaXJlY3RvcnkgPSBmaWxlU2V0LmdldERpcmVjdG9yeSgpOwotCi0gICAgICAgIGlmICggc291cmNlRGlyZWN0b3J5ID09IG51bGwgfHwgc291cmNlRGlyZWN0b3J5LnRyaW0oKS5sZW5ndGgoKSA8IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzb3VyY2VEaXJlY3RvcnkgPSBiYXNlZGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgRmlsZSBmaWxlU2V0RGlyOwotCi0gICAgICAgIGlmICggYXJjaGl2ZUJhc2VEaXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbGVTZXREaXIgPSBuZXcgRmlsZSggc291cmNlRGlyZWN0b3J5ICk7Ci0KLSAgICAgICAgICAgIGlmICggIWZpbGVTZXREaXIuaXNBYnNvbHV0ZSgpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWxlU2V0RGlyID0gbmV3IEZpbGUoIGJhc2VkaXIsIHNvdXJjZURpcmVjdG9yeSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgZmlsZVNldERpciA9IG5ldyBGaWxlKCBhcmNoaXZlQmFzZURpciwgc291cmNlRGlyZWN0b3J5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmlsZVNldERpcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tMb2dnZXIoKQotICAgIHsKLSAgICAgICAgaWYgKCBsb2dnZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlciA9IG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfSU5GTywgIkFkZEZpbGVTZXRzVGFzay1pbnRlcm5hbCIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExvZ2dlciggZmluYWwgTG9nZ2VyIGxvZ2dlciApCi0gICAgewotICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0KCBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1vZHVsZVByb2plY3QoIGZpbmFsIE1hdmVuUHJvamVjdCBtb2R1bGVQcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMubW9kdWxlUHJvamVjdCA9IG1vZHVsZVByb2plY3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FyY2hpdmVyVGFzay5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay9BcmNoaXZlclRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyZTY4ZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FyY2hpdmVyVGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnRhc2s7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlcjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXJjaGl2ZXJUYXNrCi17Ci0KLSAgICB2b2lkIGV4ZWN1dGUoIEFyY2hpdmVyIGFyY2hpdmVyLCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcnRpZmFjdC9EZWZhdWx0RGVwZW5kZW5jeVJlc29sdmVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvRGVmYXVsdERlcGVuZGVuY3lSZXNvbHZlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTYxMmY0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcnRpZmFjdC9EZWZhdWx0RGVwZW5kZW5jeVJlc29sdmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5mYWN0b3J5LkFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLkFydGlmYWN0TWV0YWRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdFJlc29sdXRpb25SZXN1bHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5BcnRpZmFjdFJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVzb2x2ZXIuTXVsdGlwbGVBcnRpZmFjdHNOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLmZpbHRlci5BcnRpZmFjdEZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUucGhhc2UuTW9kdWxlU2V0QXNzZW1ibHlQaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLk1vZHVsZUJpbmFyaWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLk1vZHVsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5SZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnJlc29sdmVkLkFzc2VtYmx5SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuRmlsdGVyVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuYXJ0aWZhY3QuSW52YWxpZERlcGVuZGVuY3lWZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmFubm90YXRpb25zLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5SZXF1aXJlbWVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuQWJzdHJhY3RMb2dFbmFibGVkOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEBhdXRob3IgamRjYXNleQotICogQHZlcnNpb24gJElkJAotICovCi1AQ29tcG9uZW50KCByb2xlID0gRGVwZW5kZW5jeVJlc29sdmVyLmNsYXNzICkKLXB1YmxpYyBjbGFzcyBEZWZhdWx0RGVwZW5kZW5jeVJlc29sdmVyCi0gICAgZXh0ZW5kcyBBYnN0cmFjdExvZ0VuYWJsZWQKLSAgICBpbXBsZW1lbnRzIERlcGVuZGVuY3lSZXNvbHZlcgotewotCi0gICAgQFJlcXVpcmVtZW50Ci0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlc29sdmVyIHJlc29sdmVyOwotCi0gICAgQFJlcXVpcmVtZW50Ci0gICAgcHJpdmF0ZSBBcnRpZmFjdE1ldGFkYXRhU291cmNlIG1ldGFkYXRhU291cmNlOwotCi0gICAgQFJlcXVpcmVtZW50Ci0gICAgcHJpdmF0ZSBBcnRpZmFjdEZhY3RvcnkgZmFjdG9yeTsKLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAiVW51c2VkRGVjbGFyYXRpb24iICkKLSAgICBwdWJsaWMgRGVmYXVsdERlcGVuZGVuY3lSZXNvbHZlcigpCi0gICAgewotICAgICAgICAvLyBmb3IgcGxleHVzIGluaXQKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRGVmYXVsdERlcGVuZGVuY3lSZXNvbHZlciggZmluYWwgQXJ0aWZhY3RSZXNvbHZlciByZXNvbHZlciwgZmluYWwgQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSBtZXRhZGF0YVNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJ0aWZhY3RGYWN0b3J5IGZhY3RvcnksIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5yZXNvbHZlciA9IHJlc29sdmVyOwotICAgICAgICB0aGlzLm1ldGFkYXRhU291cmNlID0gbWV0YWRhdGFTb3VyY2U7Ci0gICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIGVuYWJsZUxvZ2dpbmcoIGxvZ2dlciApOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXA8RGVwZW5kZW5jeVNldCwgU2V0PEFydGlmYWN0Pj4gcmVzb2x2ZURlcGVuZGVuY3lTZXRzKCBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSwgTW9kdWxlU2V0IG1vZHVsZVNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RGVwZW5kZW5jeVNldD4gZGVwZW5kZW5jeVNldHMgKQotICAgICAgICB0aHJvd3MgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1hcDxEZXBlbmRlbmN5U2V0LCBTZXQ8QXJ0aWZhY3Q+PiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcDxEZXBlbmRlbmN5U2V0LCBTZXQ8QXJ0aWZhY3Q+PigpOwotCi0gICAgICAgIGZvciAoIERlcGVuZGVuY3lTZXQgZGVwZW5kZW5jeVNldCA6IGRlcGVuZGVuY3lTZXRzICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgY3VycmVudFByb2plY3QgPSBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpOwotCi0gICAgICAgICAgICBmaW5hbCBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8gaW5mbyA9IG5ldyBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8oIGN1cnJlbnRQcm9qZWN0ICk7Ci0gICAgICAgICAgICB1cGRhdGVSZXBvc2l0b3J5UmVzb2x1dGlvblJlcXVpcmVtZW50cyggYXNzZW1ibHksIGluZm8gKTsKLSAgICAgICAgICAgIGZpbmFsIEFzc2VtYmx5SWQgYXNzZW1ibHlJZCA9IEFzc2VtYmx5SWQuY3JlYXRlQXNzZW1ibHlJZCggYXNzZW1ibHkgKTsKLSAgICAgICAgICAgIHVwZGF0ZURlcGVuZGVuY3lTZXRSZXNvbHV0aW9uUmVxdWlyZW1lbnRzKCBkZXBlbmRlbmN5U2V0LCBpbmZvLCBhc3NlbWJseUlkLCBjdXJyZW50UHJvamVjdCApOwotICAgICAgICAgICAgdXBkYXRlTW9kdWxlU2V0UmVzb2x1dGlvblJlcXVpcmVtZW50cyggYXNzZW1ibHlJZCwgbW9kdWxlU2V0LCBkZXBlbmRlbmN5U2V0LCBpbmZvLCBjb25maWdTb3VyY2UgKTsKLQotICAgICAgICAgICAgU2V0PEFydGlmYWN0PiBhcnRpZmFjdHM7Ci0gICAgICAgICAgICBpZiAoIGluZm8uaXNSZXNvbHV0aW9uUmVxdWlyZWQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IHJlcG9zID0KLSAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlUmVtb3RlQXJ0aWZhY3RSZXBvc2l0b3JpZXMoIGNvbmZpZ1NvdXJjZS5nZXRSZW1vdGVSZXBvc2l0b3JpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0RW5hYmxlZFByb2plY3RzKCkgKTsKLQotICAgICAgICAgICAgICAgIGFydGlmYWN0cyA9IGluZm8uZ2V0QXJ0aWZhY3RzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCBpbmZvLmlzUmVzb2x2ZWRUcmFuc2l0aXZlbHkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIlJlc29sdmluZyBwcm9qZWN0IGRlcGVuZGVuY2llcyB0cmFuc2l0aXZlbHkuIiApOwotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHMgPSByZXNvbHZlVHJhbnNpdGl2ZWx5KCBhcnRpZmFjdHMsIHJlcG9zLCBpbmZvLCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJSZXNvbHZpbmcgcHJvamVjdCBkZXBlbmRlbmNpZXMgT05MWS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIFdJTEwgTk9UIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLiIgKTsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzID0gcmVzb2x2ZU5vblRyYW5zaXRpdmVseSggYXNzZW1ibHksIGFydGlmYWN0cywgY29uZmlnU291cmNlLCByZXBvcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdHMgPSBuZXcgSGFzaFNldDxBcnRpZmFjdD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoIGRlcGVuZGVuY3lTZXQsIGFydGlmYWN0cyApOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPERlcGVuZGVuY3lTZXQsIFNldDxBcnRpZmFjdD4+IHJlc29sdmVEZXBlbmRlbmN5U2V0cyggZmluYWwgQXNzZW1ibHkgYXNzZW1ibHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PERlcGVuZGVuY3lTZXQ+IGRlcGVuZGVuY3lTZXRzICkKLSAgICAgICAgdGhyb3dzIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBNYXA8RGVwZW5kZW5jeVNldCwgU2V0PEFydGlmYWN0Pj4gcmVzdWx0ID0gbmV3IExpbmtlZEhhc2hNYXA8RGVwZW5kZW5jeVNldCwgU2V0PEFydGlmYWN0Pj4oKTsKLQotICAgICAgICBmb3IgKCBEZXBlbmRlbmN5U2V0IGRlcGVuZGVuY3lTZXQgOiBkZXBlbmRlbmN5U2V0cyApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IGN1cnJlbnRQcm9qZWN0ID0gY29uZmlnU291cmNlLmdldFByb2plY3QoKTsKLQotICAgICAgICAgICAgZmluYWwgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvIGluZm8gPSBuZXcgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvKCBjdXJyZW50UHJvamVjdCApOwotICAgICAgICAgICAgdXBkYXRlUmVwb3NpdG9yeVJlc29sdXRpb25SZXF1aXJlbWVudHMoIGFzc2VtYmx5LCBpbmZvICk7Ci0gICAgICAgICAgICBmaW5hbCBBc3NlbWJseUlkIGFzc2VtYmx5SWQgPSBBc3NlbWJseUlkLmNyZWF0ZUFzc2VtYmx5SWQoIGFzc2VtYmx5ICk7Ci0gICAgICAgICAgICB1cGRhdGVEZXBlbmRlbmN5U2V0UmVzb2x1dGlvblJlcXVpcmVtZW50cyggZGVwZW5kZW5jeVNldCwgaW5mbywgYXNzZW1ibHlJZCwgY3VycmVudFByb2plY3QgKTsKLQotICAgICAgICAgICAgU2V0PEFydGlmYWN0PiBhcnRpZmFjdHM7Ci0gICAgICAgICAgICBpZiAoIGluZm8uaXNSZXNvbHV0aW9uUmVxdWlyZWQoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IHJlcG9zID0KLSAgICAgICAgICAgICAgICAgICAgYWdncmVnYXRlUmVtb3RlQXJ0aWZhY3RSZXBvc2l0b3JpZXMoIGNvbmZpZ1NvdXJjZS5nZXRSZW1vdGVSZXBvc2l0b3JpZXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8uZ2V0RW5hYmxlZFByb2plY3RzKCkgKTsKLQotICAgICAgICAgICAgICAgIGFydGlmYWN0cyA9IGluZm8uZ2V0QXJ0aWZhY3RzKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCBpbmZvLmlzUmVzb2x2ZWRUcmFuc2l0aXZlbHkoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIlJlc29sdmluZyBwcm9qZWN0IGRlcGVuZGVuY2llcyB0cmFuc2l0aXZlbHkuIiApOwotICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdHMgPSByZXNvbHZlVHJhbnNpdGl2ZWx5KCBhcnRpZmFjdHMsIHJlcG9zLCBpbmZvLCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJSZXNvbHZpbmcgcHJvamVjdCBkZXBlbmRlbmNpZXMgT05MWS4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIFdJTEwgTk9UIGJlIGluY2x1ZGVkIGluIHRoZSByZXN1bHRzLiIgKTsKLSAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RzID0gcmVzb2x2ZU5vblRyYW5zaXRpdmVseSggYXNzZW1ibHksIGFydGlmYWN0cywgY29uZmlnU291cmNlLCByZXBvcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcnRpZmFjdHMgPSBuZXcgSGFzaFNldDxBcnRpZmFjdD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3VsdC5wdXQoIGRlcGVuZGVuY3lTZXQsIGFydGlmYWN0cyApOwotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBTZXQ8QXJ0aWZhY3Q+IHJlc29sdmVOb25UcmFuc2l0aXZlbHkoIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5LCBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IGRlcGVuZGVuY3lBcnRpZmFjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiByZXBvcyApCi0gICAgICAgIHRocm93cyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBmaW5hbCBMaXN0PEFydGlmYWN0PiBtaXNzaW5nID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdD4oKTsKLSAgICAgICAgZmluYWwgU2V0PEFydGlmYWN0PiByZXNvbHZlZCA9IG5ldyBMaW5rZWRIYXNoU2V0PEFydGlmYWN0PigpOwotICAgICAgICBmb3IgKCBmaW5hbCBBcnRpZmFjdCBkZXBBcnRpZmFjdCA6IGRlcGVuZGVuY3lBcnRpZmFjdHMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXNvbHZlci5yZXNvbHZlKCBkZXBBcnRpZmFjdCwgcmVwb3MsIGNvbmZpZ1NvdXJjZS5nZXRMb2NhbFJlcG9zaXRvcnkoKSApOwotICAgICAgICAgICAgICAgIHJlc29sdmVkLmFkZCggZGVwQXJ0aWZhY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggZ2V0TG9nZ2VyKCkuaXNEZWJ1Z0VuYWJsZWQoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsZWQgdG8gcmVzb2x2ZTogIiArIGRlcEFydGlmYWN0LmdldElkKCkgKyAiIGZvciBhc3NlbWJseTogIiArIGFzc2VtYmx5LmdldElkKCkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWlzc2luZy5hZGQoIGRlcEFydGlmYWN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIGZpbmFsIEFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBnZXRMb2dnZXIoKS5pc0RlYnVnRW5hYmxlZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byByZXNvbHZlOiAiICsgZGVwQXJ0aWZhY3QuZ2V0SWQoKSArICIgZm9yIGFzc2VtYmx5OiAiICsgYXNzZW1ibHkuZ2V0SWQoKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtaXNzaW5nLmFkZCggZGVwQXJ0aWZhY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIW1pc3NpbmcuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpOwotICAgICAgICAgICAgZmluYWwgQXJ0aWZhY3Qgcm9vdEFydGlmYWN0ID0gcHJvamVjdC5nZXRBcnRpZmFjdCgpOwotCi0gICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgZXJyb3IgPQotICAgICAgICAgICAgICAgIG5ldyBNdWx0aXBsZUFydGlmYWN0c05vdEZvdW5kRXhjZXB0aW9uKCByb290QXJ0aWZhY3QsIG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3Q+KCByZXNvbHZlZCApLCBtaXNzaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcyApOwotCi0gICAgICAgICAgICB0aHJvdyBuZXcgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24oICJGYWlsZWQgdG8gcmVzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yOiAiICsgYXNzZW1ibHkuZ2V0SWQoKSwgZXJyb3IgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiByZXNvbHZlZDsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKQotICAgIHByaXZhdGUgU2V0PEFydGlmYWN0PiByZXNvbHZlVHJhbnNpdGl2ZWx5KCBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IGRlcGVuZGVuY3lBcnRpZmFjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiByZXBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RGaWx0ZXIgZmlsdGVyID0gaW5mby5nZXRTY29wZUZpbHRlcigpOwotICAgICAgICBmaW5hbCBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5ID0gY29uZmlnU291cmNlLmdldExvY2FsUmVwb3NpdG9yeSgpOwotCi0gICAgICAgIEFydGlmYWN0UmVzb2x1dGlvblJlc3VsdCByZXN1bHQ7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSByZXNvbHZlci5yZXNvbHZlVHJhbnNpdGl2ZWx5KCBkZXBlbmRlbmN5QXJ0aWZhY3RzLCBwcm9qZWN0LmdldEFydGlmYWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldE1hbmFnZWRWZXJzaW9uTWFwKCksIGxvY2FsUmVwb3NpdG9yeSwgcmVwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVNvdXJjZSwgZmlsdGVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBcnRpZmFjdFJlc29sdXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byByZXNvbHZlIGRlcGVuZGVuY2llcyBmb3IgYXNzZW1ibHk6ICIsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEFydGlmYWN0Tm90Rm91bmRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byByZXNvbHZlIGRlcGVuZGVuY2llcyBmb3IgYXNzZW1ibHk6ICIsIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCAiV2hpbGUgcmVzb2x2aW5nIGRlcGVuZGVuY2llcyBvZiAiICsgcHJvamVjdC5nZXRJZCgpICsgIjoiICk7Ci0KLSAgICAgICAgRmlsdGVyVXRpbHMucmVwb3J0RmlsdGVyaW5nU3RhdGlzdGljcyggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBmaWx0ZXIgKSwgZ2V0TG9nZ2VyKCkgKTsKLQotICAgICAgICByZXR1cm4gcmVzdWx0LmdldEFydGlmYWN0cygpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlUmVwb3NpdG9yeVJlc29sdXRpb25SZXF1aXJlbWVudHMoIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5LCBmaW5hbCBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8gcmVxdWlyZW1lbnRzICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8UmVwb3NpdG9yeT4gcmVwb3NpdG9yaWVzID0gYXNzZW1ibHkuZ2V0UmVwb3NpdG9yaWVzKCk7Ci0KLSAgICAgICAgaWYgKCByZXBvc2l0b3JpZXMgIT0gbnVsbCAmJiAhcmVwb3NpdG9yaWVzLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVpcmVtZW50cy5zZXRSZXNvbHV0aW9uUmVxdWlyZWQoIHRydWUgKTsKLSAgICAgICAgICAgIGZvciAoIGZpbmFsIFJlcG9zaXRvcnkgcmVwbyA6IHJlcG9zaXRvcmllcyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW5hYmxlU2NvcGUoIHJlcG8uZ2V0U2NvcGUoKSwgcmVxdWlyZW1lbnRzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHZvaWQgdXBkYXRlTW9kdWxlU2V0UmVzb2x1dGlvblJlcXVpcmVtZW50cyggQXNzZW1ibHlJZCBhc3NlbWJseUlkLCBNb2R1bGVTZXQgc2V0LCBEZXBlbmRlbmN5U2V0IGRlcGVuZGVuY3lTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8gcmVxdWlyZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgKQotICAgICAgICB0aHJvd3MgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZHVsZUJpbmFyaWVzIGJpbmFyaWVzID0gc2V0LmdldEJpbmFyaWVzKCk7Ci0gICAgICAgIGlmICggYmluYXJpZXMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNldDxNYXZlblByb2plY3Q+IHByb2plY3RzOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHJvamVjdHMgPSBNb2R1bGVTZXRBc3NlbWJseVBoYXNlLmdldE1vZHVsZVByb2plY3RzKCBzZXQsIGNvbmZpZ1NvdXJjZSwgZ2V0TG9nZ2VyKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbiggIkVycm9yIGRldGVybWluaW5nIHByb2plY3Qtc2V0IGZvciBtb2R1bGVTZXQgd2l0aCBiaW5hcmllcy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoICFwcm9qZWN0cy5pc0VtcHR5KCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoIGZpbmFsIE1hdmVuUHJvamVjdCBwIDogcHJvamVjdHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmVuYWJsZVByb2plY3RSZXNvbHV0aW9uKCBwICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCBwLmdldEFydGlmYWN0KCkgPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1Y2ggYSBjYWxsIGluIE1hdmVuTWV0YWRhdGFTb3VyY2UgdG9vIC0gcGFja2FnaW5nIG5vdCByZWFsbHkgdGhlIGludGVudGlvbiBvZgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHlwZQotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJ0aWZhY3QgYXJ0aWZhY3QgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3RvcnkuY3JlYXRlQnVpbGRBcnRpZmFjdCggcC5nZXRHcm91cElkKCksIHAuZ2V0QXJ0aWZhY3RJZCgpLCBwLmdldFZlcnNpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UGFja2FnaW5nKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHAuc2V0QXJ0aWZhY3QoIGFydGlmYWN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICggYmluYXJpZXMuaXNJbmNsdWRlRGVwZW5kZW5jaWVzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVwZGF0ZURlcGVuZGVuY3lTZXRSZXNvbHV0aW9uUmVxdWlyZW1lbnRzKCBkZXBlbmRlbmN5U2V0LCByZXF1aXJlbWVudHMsIGFzc2VtYmx5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RzLnRvQXJyYXkoIG5ldyBNYXZlblByb2plY3RbcHJvamVjdHMuc2l6ZSgpXSApICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgdm9pZCB1cGRhdGVEZXBlbmRlbmN5U2V0UmVzb2x1dGlvblJlcXVpcmVtZW50cyggZmluYWwgRGVwZW5kZW5jeVNldCBzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvIHJlcXVpcmVtZW50cywgQXNzZW1ibHlJZCBhc3NlbWJseUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdC4uLiBwcm9qZWN0cyApCi0gICAgICAgIHRocm93cyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmVxdWlyZW1lbnRzLnNldFJlc29sdXRpb25SZXF1aXJlZCggdHJ1ZSApOwotCi0gICAgICAgIHJlcXVpcmVtZW50cy5zZXRSZXNvbHZlZFRyYW5zaXRpdmVseSggc2V0LmlzVXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcygpICk7Ci0KLSAgICAgICAgZW5hYmxlU2NvcGUoIHNldC5nZXRTY29wZSgpLCByZXF1aXJlbWVudHMgKTsKLQotICAgICAgICBmb3IgKCBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA6IHByb2plY3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwcm9qZWN0ID09IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTZXQ8QXJ0aWZhY3Q+IGRlcGVuZGVuY3lBcnRpZmFjdHMgPSBwcm9qZWN0LmdldERlcGVuZGVuY3lBcnRpZmFjdHMoKTsKLSAgICAgICAgICAgIGlmICggZGVwZW5kZW5jeUFydGlmYWN0cyA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lBcnRpZmFjdHMgPSBwcm9qZWN0LmNyZWF0ZUFydGlmYWN0cyggZmFjdG9yeSwgbnVsbCwgcmVxdWlyZW1lbnRzLmdldFNjb3BlRmlsdGVyKCkgKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5zZXREZXBlbmRlbmN5QXJ0aWZhY3RzKCBkZXBlbmRlbmN5QXJ0aWZhY3RzICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggZmluYWwgSW52YWxpZERlcGVuZGVuY3lWZXJzaW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZhaWxlZCB0byBjcmVhdGUgZGVwZW5kZW5jeSBhcnRpZmFjdHMgZm9yIHJlc29sdXRpb24uIEFzc2VtYmx5OiAiICsgYXNzZW1ibHlJZCwgZSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmFkZEFydGlmYWN0cyggZGVwZW5kZW5jeUFydGlmYWN0cyApOwotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJEZXBlbmRlbmNpZXMgZm9yIHByb2plY3Q6ICIgKyBwcm9qZWN0LmdldElkKCkgKyAiIGFyZTpcbiIgKyBTdHJpbmdVdGlscy5qb2luKAotICAgICAgICAgICAgICAgIGRlcGVuZGVuY3lBcnRpZmFjdHMuaXRlcmF0b3IoKSwgIlxuIiApICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5hYmxlU2NvcGUoIGZpbmFsIFN0cmluZyBzY29wZSwgZmluYWwgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvIHJlcXVpcmVtZW50cyApCi0gICAgewotICAgICAgICBpZiAoIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUuZXF1YWxzKCBzY29wZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVxdWlyZW1lbnRzLmVuYWJsZUNvbXBpbGVTY29wZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBBcnRpZmFjdC5TQ09QRV9QUk9WSURFRC5lcXVhbHMoIHNjb3BlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXF1aXJlbWVudHMuZW5hYmxlUHJvdmlkZWRTY29wZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBBcnRpZmFjdC5TQ09QRV9SVU5USU1FLmVxdWFscyggc2NvcGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVpcmVtZW50cy5lbmFibGVSdW50aW1lU2NvcGUoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggQXJ0aWZhY3QuU0NPUEVfU1lTVEVNLmVxdWFscyggc2NvcGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVpcmVtZW50cy5lbmFibGVTeXN0ZW1TY29wZSgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBBcnRpZmFjdC5TQ09QRV9URVNULmVxdWFscyggc2NvcGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcXVpcmVtZW50cy5lbmFibGVUZXN0U2NvcGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApCi0gICAgTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IGFnZ3JlZ2F0ZVJlbW90ZUFydGlmYWN0UmVwb3NpdG9yaWVzKCBmaW5hbCBMaXN0PEFydGlmYWN0UmVwb3NpdG9yeT4gcmVtb3RlUmVwb3NpdG9yaWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMgKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxMaXN0PEFydGlmYWN0UmVwb3NpdG9yeT4+IHJlcG9MaXN0cyA9IG5ldyBBcnJheUxpc3Q8TGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+PigpOwotCi0gICAgICAgIHJlcG9MaXN0cy5hZGQoIHJlbW90ZVJlcG9zaXRvcmllcyApOwotICAgICAgICBmb3IgKCBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA6IHByb2plY3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVwb0xpc3RzLmFkZCggcHJvamVjdC5nZXRSZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllcygpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PEFydGlmYWN0UmVwb3NpdG9yeT4gcmVtb3RlUmVwb3MgPSBuZXcgQXJyYXlMaXN0PEFydGlmYWN0UmVwb3NpdG9yeT4oKTsKLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gZW5jb3VudGVyZWRVcmxzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgICAgIGZvciAoIGZpbmFsIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiByZXBvc2l0b3J5TGlzdCA6IHJlcG9MaXN0cyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggKCByZXBvc2l0b3J5TGlzdCAhPSBudWxsICkgJiYgIXJlcG9zaXRvcnlMaXN0LmlzRW1wdHkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yICggZmluYWwgQXJ0aWZhY3RSZXBvc2l0b3J5IHJlcG8gOiByZXBvc2l0b3J5TGlzdCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoICFlbmNvdW50ZXJlZFVybHMuY29udGFpbnMoIHJlcG8uZ2V0VXJsKCkgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZVJlcG9zLmFkZCggcmVwbyApOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb3VudGVyZWRVcmxzLmFkZCggcmVwby5nZXRVcmwoKSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlbW90ZVJlcG9zOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FydGlmYWN0L0RlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTJmMjE5Zi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICBleHRlbmRzIEV4Y2VwdGlvbgotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24oIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgZXJyb3IgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIGVycm9yICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvRGVwZW5kZW5jeVJlc29sdmVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvRGVwZW5kZW5jeVJlc29sdmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMDk3NmUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FydGlmYWN0L0RlcGVuZGVuY3lSZXNvbHZlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLk1vZHVsZVNldDsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBDb252ZW5pZW5jZSBjb21wb25lbnQgdGhhdCBhaWRzIGluIHRoZSByZXNvbHV0aW9uIG9mIGRlcGVuZGVuY3kgYXJ0aWZhY3RzLCBhY2NvcmRpbmcgdG8gdmFyaW91cyBjb25maWd1cmF0aW9ucyBzdWNoCi0gKiBhcyB0cmFuc2l0aXZpdHkgZmxhZyBhbmQgc2NvcGUuCi0gKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIERlcGVuZGVuY3lSZXNvbHZlcgotewotCi0gICAgTWFwPERlcGVuZGVuY3lTZXQsIFNldDxBcnRpZmFjdD4+IHJlc29sdmVEZXBlbmRlbmN5U2V0cyggZmluYWwgQXNzZW1ibHkgYXNzZW1ibHksIE1vZHVsZVNldCBtb2R1bGVTZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxEZXBlbmRlbmN5U2V0PiBkZXBlbmRlbmN5U2V0cyApCi0gICAgICAgIHRocm93cyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLQotICAgIE1hcDxEZXBlbmRlbmN5U2V0LCBTZXQ8QXJ0aWZhY3Q+PiByZXNvbHZlRGVwZW5kZW5jeVNldHMoIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RGVwZW5kZW5jeVNldD4gZGVwZW5kZW5jeVNldHMgKQotICAgICAgICB0aHJvd3MgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb247Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNjM3OGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FydGlmYWN0L1Jlc29sdXRpb25NYW5hZ2VtZW50SW5mby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3Q7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuYXJ0aWZhY3QuZmlsdGVyLlNjb3BlQXJ0aWZhY3RGaWx0ZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIEhlbHBlciBjbGFzcyB1c2VkIHRvIGFjY3VtdWxhdGUgc2NvcGVzIGFuZCBtb2R1bGVzICh3aXRoIGJpbmFyaWVzIGluY2x1ZGVkKSB0aGF0IGFyZSB1c2VkIGluIGFuIGFzc2VtYmx5LCBmb3IgdGhlCi0gKiBwdXJwb3NlcyBvZiBjcmVhdGluZyBhbiBhZ2dyZWdhdGVkIG1hbmFnZWQtdmVyc2lvbiBtYXAgd2l0aCBkZXBlbmRlbmN5IHZlcnNpb24gY29uZmxpY3RzIHJlc29sdmVkLgotICoKLSAqIEBhdXRob3IgamRjYXNleQotICovCi1jbGFzcyBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8KLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVzb2x1dGlvblJlcXVpcmVkOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTY29wZUFydGlmYWN0RmlsdGVyIHNjb3BlRmlsdGVyID0gbmV3IFNjb3BlQXJ0aWZhY3RGaWx0ZXIoKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiByZXNvbHZlZFRyYW5zaXRpdmVseTsKLQotICAgIHByaXZhdGUgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gZW5hYmxlZFByb2plY3RzID0gbmV3IExpbmtlZEhhc2hTZXQ8TWF2ZW5Qcm9qZWN0PigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRIYXNoU2V0PEFydGlmYWN0PiBhcnRpZmFjdHMgPSBuZXcgTGlua2VkSGFzaFNldDxBcnRpZmFjdD4oKTsKLQotICAgIFJlc29sdXRpb25NYW5hZ2VtZW50SW5mbyggZmluYWwgTWF2ZW5Qcm9qZWN0IGN1cnJlbnRQcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIGVuYWJsZWRQcm9qZWN0cy5hZGQoIGN1cnJlbnRQcm9qZWN0ICk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1Jlc29sdXRpb25SZXF1aXJlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gcmVzb2x1dGlvblJlcXVpcmVkOwotICAgIH0KLQotICAgIHZvaWQgc2V0UmVzb2x1dGlvblJlcXVpcmVkKCBmaW5hbCBib29sZWFuIHJlc29sdXRpb25SZXF1aXJlZCApCi0gICAgewotICAgICAgICB0aGlzLnJlc29sdXRpb25SZXF1aXJlZCA9IHJlc29sdXRpb25SZXF1aXJlZDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzUmVzb2x2ZWRUcmFuc2l0aXZlbHkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlc29sdmVkVHJhbnNpdGl2ZWx5OwotICAgIH0KLQotICAgIHZvaWQgc2V0UmVzb2x2ZWRUcmFuc2l0aXZlbHkoIGZpbmFsIGJvb2xlYW4gcmVzb2x2ZWRUcmFuc2l0aXZlbHkgKQotICAgIHsKLSAgICAgICAgdGhpcy5yZXNvbHZlZFRyYW5zaXRpdmVseSA9IHRoaXMucmVzb2x2ZWRUcmFuc2l0aXZlbHkgfHwgcmVzb2x2ZWRUcmFuc2l0aXZlbHk7Ci0gICAgfQotCi0gICAgU2NvcGVBcnRpZmFjdEZpbHRlciBnZXRTY29wZUZpbHRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gc2NvcGVGaWx0ZXI7Ci0gICAgfQotCi0gICAgdm9pZCBlbmFibGVDb21waWxlU2NvcGUoKQotICAgIHsKLSAgICAgICAgc2NvcGVGaWx0ZXIuc2V0SW5jbHVkZUNvbXBpbGVTY29wZSggdHJ1ZSApOwotICAgICAgICBzY29wZUZpbHRlci5zZXRJbmNsdWRlUHJvdmlkZWRTY29wZSggdHJ1ZSApOwotICAgICAgICBzY29wZUZpbHRlci5zZXRJbmNsdWRlU3lzdGVtU2NvcGUoIHRydWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZVByb3ZpZGVkU2NvcGUoKQotICAgIHsKLSAgICAgICAgc2NvcGVGaWx0ZXIuc2V0SW5jbHVkZVByb3ZpZGVkU2NvcGUoIHRydWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZVJ1bnRpbWVTY29wZSgpCi0gICAgewotICAgICAgICBzY29wZUZpbHRlci5zZXRJbmNsdWRlUnVudGltZVNjb3BlKCB0cnVlICk7Ci0gICAgICAgIHNjb3BlRmlsdGVyLnNldEluY2x1ZGVDb21waWxlU2NvcGUoIHRydWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZVRlc3RTY29wZSgpCi0gICAgewotICAgICAgICBzY29wZUZpbHRlci5zZXRJbmNsdWRlVGVzdFNjb3BlKCB0cnVlICk7Ci0gICAgICAgIHNjb3BlRmlsdGVyLnNldEluY2x1ZGVDb21waWxlU2NvcGUoIHRydWUgKTsKLSAgICAgICAgc2NvcGVGaWx0ZXIuc2V0SW5jbHVkZVByb3ZpZGVkU2NvcGUoIHRydWUgKTsKLSAgICAgICAgc2NvcGVGaWx0ZXIuc2V0SW5jbHVkZVN5c3RlbVNjb3BlKCB0cnVlICk7Ci0gICAgICAgIHNjb3BlRmlsdGVyLnNldEluY2x1ZGVSdW50aW1lU2NvcGUoIHRydWUgKTsKLSAgICB9Ci0KLSAgICB2b2lkIGVuYWJsZVN5c3RlbVNjb3BlKCkKLSAgICB7Ci0gICAgICAgIHNjb3BlRmlsdGVyLnNldEluY2x1ZGVTeXN0ZW1TY29wZSggdHJ1ZSApOwotICAgIH0KLQotICAgIHZvaWQgZW5hYmxlUHJvamVjdFJlc29sdXRpb24oIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIGlmICggIWVuYWJsZWRQcm9qZWN0cy5jb250YWlucyggcHJvamVjdCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZW5hYmxlZFByb2plY3RzLmFkZCggcHJvamVjdCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgU2V0PE1hdmVuUHJvamVjdD4gZ2V0RW5hYmxlZFByb2plY3RzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmFibGVkUHJvamVjdHM7Ci0gICAgfQotCi0gICAgU2V0PEFydGlmYWN0PiBnZXRBcnRpZmFjdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFydGlmYWN0czsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZEFydGlmYWN0cyggZmluYWwgU2V0PEFydGlmYWN0PiBhICkKLSAgICB7Ci0gICAgICAgIGZvciAoIEFydGlmYWN0IGFydGlmYWN0IDogYSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFkZE9uZUFydGlmYWN0KCBhcnRpZmFjdCApOwotICAgICAgICB9Ci0gICAgICAgIGFydGlmYWN0cy5hZGRBbGwoIGEgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYWRkT25lQXJ0aWZhY3QoIEFydGlmYWN0IGFydGlmYWN0ICkKLSAgICB7Ci0gICAgICAgIGZvciAoIEFydGlmYWN0IGV4aXN0aW5nIDogYXJ0aWZhY3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBleGlzdGluZy5lcXVhbHMoIGFydGlmYWN0ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggaXNTY29wZVVwZ3JhZGUoIGFydGlmYWN0LCBleGlzdGluZyApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0cy5yZW1vdmUoIGV4aXN0aW5nICk7Ci0gICAgICAgICAgICAgICAgICAgIGFydGlmYWN0cy5hZGQoIGFydGlmYWN0ICk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTY29wZVVwZ3JhZGUoIEFydGlmYWN0IGEsIEFydGlmYWN0IGV4aXN0aW5nICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBzY29wZVZhbHVlKCBhLmdldFNjb3BlKCkgKSA+IHNjb3BlVmFsdWUoIGV4aXN0aW5nLmdldFNjb3BlKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBzY29wZVZhbHVlKCBmaW5hbCBTdHJpbmcgc2NvcGUgKQotICAgIHsKLSAgICAgICAgaWYgKCBBcnRpZmFjdC5TQ09QRV9DT01QSUxFLmVxdWFscyggc2NvcGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiA1OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBBcnRpZmFjdC5TQ09QRV9QUk9WSURFRC5lcXVhbHMoIHNjb3BlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggQXJ0aWZhY3QuU0NPUEVfUlVOVElNRS5lcXVhbHMoIHNjb3BlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMzsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggQXJ0aWZhY3QuU0NPUEVfU1lTVEVNLmVxdWFscyggc2NvcGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAyOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBBcnRpZmFjdC5TQ09QRV9URVNULmVxdWFscyggc2NvcGUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9BYnN0cmFjdExpbmVBZ2dyZWdhdGluZ0hhbmRsZXIuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9maWx0ZXIvQWJzdHJhY3RMaW5lQWdncmVnYXRpbmdIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2NzA3NWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9BYnN0cmFjdExpbmVBZ2dyZWdhdGluZ0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlcjsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5RmlsZVV0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlJlc291cmNlSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5VbkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVJbmZvOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RMaW5lQWdncmVnYXRpbmdIYW5kbGVyCi0gICAgaW1wbGVtZW50cyBDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcgotewotCi0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGNhdGFsb2cgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4oKTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBleGNsdWRlT3ZlcnJpZGUgPSBmYWxzZTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0T3V0cHV0UGF0aFByZWZpeCggZmluYWwgRmlsZUluZm8gZmlsZUluZm8gKTsKLQotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBib29sZWFuIGZpbGVNYXRjaGVzKCBmaW5hbCBGaWxlSW5mbyBmaWxlSW5mbyApOwotCi0gICAgU3RyaW5nIGdldEVuY29kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiAiVVRGLTgiOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGZpbmFsaXplQXJjaGl2ZUNyZWF0aW9uKCBmaW5hbCBBcmNoaXZlciBhcmNoaXZlciApCi0gICAgewotICAgICAgICAvLyB0aGlzIHdpbGwgcHJvbXB0IHRoZSBpc1NlbGVjdGVkKCkgY2FsbCwgYmVsb3csIGZvciBhbGwgcmVzb3VyY2VzIGFkZGVkIHRvIHRoZSBhcmNoaXZlLgotICAgICAgICAvLyBGSVhNRTogVGhpcyBuZWVkcyB0byBiZSBjb3JyZWN0ZWQgaW4gdGhlIEFic3RyYWN0QXJjaGl2ZXIsIHdoZXJlCi0gICAgICAgIC8vIHJ1bkFyY2hpdmVGaW5hbGl6ZXJzKCkgaXMgY2FsbGVkIGJlZm9yZSByZWd1bGFyIHJlc291cmNlcyBhcmUgYWRkZWQuLi4KLSAgICAgICAgLy8gd2hpY2ggaXMgZG9uZSBiZWNhdXNlIHRoZSBtYW5pZmVzdCBuZWVkcyB0byBiZSBhZGRlZCBmaXJzdCwgYW5kIHRoZQotICAgICAgICAvLyBtYW5pZmVzdC1jcmVhdGlvbiBjb21wb25lbnQgaXMgYSBmaW5hbGl6ZXIgaW4gdGhlIGFzc2VtYmx5IHBsdWdpbi4uLgotICAgICAgICBmb3IgKCBmaW5hbCBSZXNvdXJjZUl0ZXJhdG9yIGl0ID0gYXJjaGl2ZXIuZ2V0UmVzb3VyY2VzKCk7IGl0Lmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpdC5uZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBhZGRUb0FyY2hpdmUoIGFyY2hpdmVyICk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRUb0FyY2hpdmUoIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyICkKLSAgICB7Ci0gICAgICAgIGZvciAoIGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBjYXRhbG9nLmVudHJ5U2V0KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZuYW1lID0gbmV3IEZpbGUoIG5hbWUgKS5nZXROYW1lKCk7Ci0KLSAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgICAgICBGaWxlIGY7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmID0gRmlsZS5jcmVhdGVUZW1wRmlsZSggImFzc2VtYmx5LSIgKyBmbmFtZSwgIi50bXAiICk7Ci0gICAgICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKLQotICAgICAgICAgICAgICAgIHdyaXRlciA9IG5ldyBQcmludFdyaXRlciggbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGYgKSwgZ2V0RW5jb2RpbmcoKSApICk7Ci0gICAgICAgICAgICAgICAgZm9yICggZmluYWwgU3RyaW5nIGxpbmUgOiBlbnRyeS5nZXRWYWx1ZSgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludGxuKCBsaW5lICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciBhZGRpbmcgYWdncmVnYXRlZCBjb250ZW50IGZvcjogIiArIGZuYW1lICsgIiB0byBmaW5hbGl6ZSBhcmNoaXZlIGNyZWF0aW9uLiBSZWFzb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHdyaXRlciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleGNsdWRlT3ZlcnJpZGUgPSB0cnVlOwotICAgICAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZSggZiwgbmFtZSApOwotICAgICAgICAgICAgZXhjbHVkZU92ZXJyaWRlID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZUFyY2hpdmVFeHRyYWN0aW9uKCBmaW5hbCBVbkFyY2hpdmVyIHVuQXJjaGl2ZXIgKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFZpcnR1YWxGaWxlcygpCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCBjYXRhbG9nLmtleVNldCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCggQE5vbm51bGwgZmluYWwgRmlsZUluZm8gZmlsZUluZm8gKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggZXhjbHVkZU92ZXJyaWRlICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbmFtZSA9IEFzc2VtYmx5RmlsZVV0aWxzLm5vcm1hbGl6ZUZpbGVJbmZvKCBmaWxlSW5mbyApOwotCi0gICAgICAgIGlmICggZmlsZUluZm8uaXNGaWxlKCkgJiYgZmlsZU1hdGNoZXMoIGZpbGVJbmZvICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBuYW1lID0gZ2V0T3V0cHV0UGF0aFByZWZpeCggZmlsZUluZm8gKSArIG5ldyBGaWxlKCBuYW1lICkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBMaXN0PFN0cmluZz4gbGluZXMgPSBjYXRhbG9nLmdldCggbmFtZSApOwotICAgICAgICAgICAgaWYgKCBsaW5lcyA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsaW5lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgIGNhdGFsb2cucHV0KCBuYW1lLCBsaW5lcyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZWFkTGluZXMoIGZpbGVJbmZvLCBsaW5lcyApOwotCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlYWRMaW5lcyggZmluYWwgRmlsZUluZm8gZmlsZUluZm8sIGZpbmFsIExpc3Q8U3RyaW5nPiBsaW5lcyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKCBmaWxlSW5mby5nZXRDb250ZW50cygpLCBnZXRFbmNvZGluZygpICkgKTsKLQotICAgICAgICAgICAgU3RyaW5nIGxpbmU7Ci0gICAgICAgICAgICB3aGlsZSAoICggbGluZSA9IHJlYWRlci5yZWFkTGluZSgpICkgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCAhbGluZXMuY29udGFpbnMoIGxpbmUgKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsaW5lcy5hZGQoIGxpbmUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHJlYWRlciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0Q2F0YWxvZygpCi0gICAgewotICAgICAgICByZXR1cm4gY2F0YWxvZzsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBzZXRDYXRhbG9nKCBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGNhdGFsb2cgKQotICAgIHsKLSAgICAgICAgdGhpcy5jYXRhbG9nID0gY2F0YWxvZzsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9maWx0ZXIvQ29tcG9uZW50c1htbEFyY2hpdmVyRmlsZUZpbHRlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9Db21wb25lbnRzWG1sQXJjaGl2ZXJGaWxlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZDk1MjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9Db21wb25lbnRzWG1sQXJjaGl2ZXJGaWxlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5maWx0ZXI7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC51dGlscy5SZWFkZXJGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLnV0aWxzLldyaXRlckZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuUmVzb3VyY2VJdGVyYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlVuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVJbmZvOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbUJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tV3JpdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwucHVsbC5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQ29tcG9uZW50cyBYTUwgZmlsZSBmaWx0ZXIuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnJldHRAYXBhY2hlLm9yZyI+QnJldHQgUG9ydGVyPC9hPgotICogQHZlcnNpb24gJElkJAotICovCi1AQ29tcG9uZW50KCByb2xlID0gQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIuY2xhc3MsIGhpbnQgPSAicGxleHVzIiwgaW5zdGFudGlhdGlvblN0cmF0ZWd5ID0gInBlci1sb29rdXAiICkKLXB1YmxpYyBjbGFzcyBDb21wb25lbnRzWG1sQXJjaGl2ZXJGaWxlRmlsdGVyCi0gICAgaW1wbGVtZW50cyBDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcgotewotICAgIC8vIFtqZGNhc2V5XSBTd2l0Y2hlZCB2aXNpYmlsaXR5IHRvIHByb3RlY3RlZCB0byBhbGxvdyB0ZXN0aW5nLiBBbHNvLCBiZWNhdXNlIHRoaXMgY2xhc3MgaXNuJ3QgZmluYWwsIGl0IHNob3VsZAotICAgIC8vIGFsbG93Ci0gICAgLy8gc29tZSBtaW5pbWFsIGFjY2VzcyB0byB0aGUgY29tcG9uZW50cyBhY2N1bXVsYXRlZCBmb3IgZXh0ZW5kaW5nIGNsYXNzZXMuCi0gICAgTWFwPFN0cmluZywgWHBwM0RvbT4gY29tcG9uZW50czsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBleGNsdWRlT3ZlcnJpZGUgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVFNfWE1MX1BBVEggPSAiTUVUQS1JTkYvcGxleHVzL2NvbXBvbmVudHMueG1sIjsKLQotICAgIHZvaWQgYWRkQ29tcG9uZW50c1htbCggZmluYWwgUmVhZGVyIGNvbXBvbmVudHNSZWFkZXIgKQotICAgICAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFhwcDNEb20gbmV3RG9tID0gWHBwM0RvbUJ1aWxkZXIuYnVpbGQoIGNvbXBvbmVudHNSZWFkZXIgKTsKLQotICAgICAgICBpZiAoIG5ld0RvbSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbmV3RG9tID0gbmV3RG9tLmdldENoaWxkKCAiY29tcG9uZW50cyIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggbmV3RG9tICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBYcHAzRG9tW10gY2hpbGRyZW4gPSBuZXdEb20uZ2V0Q2hpbGRyZW4oKTsKLQotICAgICAgICAgICAgZm9yICggZmluYWwgWHBwM0RvbSBjb21wb25lbnQgOiBjaGlsZHJlbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBjb21wb25lbnRzID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgWHBwM0RvbT4oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcm9sZSA9IGNvbXBvbmVudC5nZXRDaGlsZCggInJvbGUiICkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBYcHAzRG9tIGNoaWxkID0gY29tcG9uZW50LmdldENoaWxkKCAicm9sZS1oaW50IiApOwotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByb2xlSGludCA9IGNoaWxkICE9IG51bGwgPyBjaGlsZC5nZXRWYWx1ZSgpIDogIiI7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gcm9sZSArIHJvbGVIaW50OwotICAgICAgICAgICAgICAgIGlmICggIWNvbXBvbmVudHMuY29udGFpbnNLZXkoIGtleSApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkFkZGluZyAiICsga2V5ICk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMucHV0KCBrZXksIGNvbXBvbmVudCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJDb21wb25lbnQ6ICIgKyBrZXkgKyAiIGlzIGFscmVhZHkgZGVmaW5lZC4gU2tpcHBpbmcuIiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhZGRUb0FyY2hpdmUoIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIGNvbXBvbmVudHMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoICJtYXZlbi1hc3NlbWJseS1wbHVnaW4iLCAidG1wIiApOwotICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKLQotICAgICAgICAgICAgZmluYWwgV3JpdGVyIGZpbGVXcml0ZXIgPSBXcml0ZXJGYWN0b3J5Lm5ld1htbFdyaXRlciggbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGYgKSApOwotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgWHBwM0RvbSBkb20gPSBuZXcgWHBwM0RvbSggImNvbXBvbmVudC1zZXQiICk7Ci0gICAgICAgICAgICAgICAgZmluYWwgWHBwM0RvbSBjb21wb25lbnREb20gPSBuZXcgWHBwM0RvbSggImNvbXBvbmVudHMiICk7Ci0gICAgICAgICAgICAgICAgZG9tLmFkZENoaWxkKCBjb21wb25lbnREb20gKTsKLQotICAgICAgICAgICAgICAgIGZvciAoIGZpbmFsIFhwcDNEb20gY29tcG9uZW50IDogY29tcG9uZW50cy52YWx1ZXMoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb21wb25lbnREb20uYWRkQ2hpbGQoIGNvbXBvbmVudCApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFhwcDNEb21Xcml0ZXIud3JpdGUoIGZpbGVXcml0ZXIsIGRvbSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWxseQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElPVXRpbC5jbG9zZSggZmlsZVdyaXRlciApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBleGNsdWRlT3ZlcnJpZGUgPSB0cnVlOwotCi0gICAgICAgICAgICBhcmNoaXZlci5hZGRGaWxlKCBmLCBDT01QT05FTlRTX1hNTF9QQVRIICk7Ci0KLSAgICAgICAgICAgIGV4Y2x1ZGVPdmVycmlkZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluYWxpemVBcmNoaXZlQ3JlYXRpb24oIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyICkKLSAgICB7Ci0gICAgICAgIC8vIHRoaXMgd2lsbCBwcm9tcHQgdGhlIGlzU2VsZWN0ZWQoKSBjYWxsLCBiZWxvdywgZm9yIGFsbCByZXNvdXJjZXMgYWRkZWQgdG8gdGhlIGFyY2hpdmUuCi0gICAgICAgIC8vIEZJWE1FOiBUaGlzIG5lZWRzIHRvIGJlIGNvcnJlY3RlZCBpbiB0aGUgQWJzdHJhY3RBcmNoaXZlciwgd2hlcmUKLSAgICAgICAgLy8gcnVuQXJjaGl2ZUZpbmFsaXplcnMoKSBpcyBjYWxsZWQgYmVmb3JlIHJlZ3VsYXIgcmVzb3VyY2VzIGFyZSBhZGRlZC4uLgotICAgICAgICAvLyB3aGljaCBpcyBkb25lIGJlY2F1c2UgdGhlIG1hbmlmZXN0IG5lZWRzIHRvIGJlIGFkZGVkIGZpcnN0LCBhbmQgdGhlCi0gICAgICAgIC8vIG1hbmlmZXN0LWNyZWF0aW9uIGNvbXBvbmVudCBpcyBhIGZpbmFsaXplciBpbiB0aGUgYXNzZW1ibHkgcGx1Z2luLi4uCi0gICAgICAgIGZvciAoIGZpbmFsIFJlc291cmNlSXRlcmF0b3IgaXQgPSBhcmNoaXZlci5nZXRSZXNvdXJjZXMoKTsgaXQuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGl0Lm5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhZGRUb0FyY2hpdmUoIGFyY2hpdmVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFyY2hpdmVyRXhjZXB0aW9uKCAiRXJyb3IgZmluYWxpemluZyBjb21wb25lbnQtc2V0IGZvciBhcmNoaXZlLiBSZWFzb246ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRWaXJ0dWFsRmlsZXMoKQotICAgIHsKLSAgICAgICAgaWYgKCAoIGNvbXBvbmVudHMgIT0gbnVsbCApICYmICFjb21wb25lbnRzLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCBDT01QT05FTlRTX1hNTF9QQVRIICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCBATm9ubnVsbCBmaW5hbCBGaWxlSW5mbyBmaWxlSW5mbyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCBmaWxlSW5mby5pc0ZpbGUoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZXhjbHVkZU92ZXJyaWRlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3RyaW5nIGVudHJ5ID0gZmlsZUluZm8uZ2V0TmFtZSgpLnJlcGxhY2UoICdcXCcsICcvJyApOwotCi0gICAgICAgICAgICBpZiAoIGVudHJ5LnN0YXJ0c1dpdGgoICIvIiApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5LnN1YnN0cmluZyggMSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIENvbXBvbmVudHNYbWxBcmNoaXZlckZpbGVGaWx0ZXIuQ09NUE9ORU5UU19YTUxfUEFUSC5lcXVhbHMoIGVudHJ5ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0KLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IGZpbGVJbmZvLmdldENvbnRlbnRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlciA9IFJlYWRlckZhY3RvcnkubmV3WG1sUmVhZGVyKCBzdHJlYW0gKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29tcG9uZW50c1htbCggbmV3IEJ1ZmZlcmVkUmVhZGVyKCByZWFkZXIgKSApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXRjaCAoIGZpbmFsIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24gZSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBJT0V4Y2VwdGlvbiBlcnJvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSU9FeGNlcHRpb24oICJFcnJvciBmaW5hbGl6aW5nIGNvbXBvbmVudC1zZXQgZm9yIGFyY2hpdmUuIFJlYXNvbjogIiArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgIGVycm9yLmluaXRDYXVzZSggZSApOwotCi0gICAgICAgICAgICAgICAgICAgIHRocm93IGVycm9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHN0cmVhbSApOwotICAgICAgICAgICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHJlYWRlciApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZmluYWxpemVBcmNoaXZlRXh0cmFjdGlvbiggZmluYWwgVW5BcmNoaXZlciB1bmFyY2hpdmVyICkKLSAgICB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZmlsdGVyL0NvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZmlsdGVyL0NvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTgxMzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9Db250YWluZXJEZXNjcmlwdG9ySGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5maWx0ZXI7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVGaW5hbGl6ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLmZpbGVzZWxlY3RvcnMuRmlsZVNlbGVjdG9yOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcgotICAgIGV4dGVuZHMgQXJjaGl2ZUZpbmFsaXplciwgRmlsZVNlbGVjdG9yCi17Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9maWx0ZXIvTWV0YUluZlNlcnZpY2VzSGFuZGxlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9NZXRhSW5mU2VydmljZXNIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmMyZTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9NZXRhSW5mU2VydmljZXNIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlcjsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmFubm90YXRpb25zLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8uZmlsZXNlbGVjdG9ycy5GaWxlSW5mbzsKLQotLyoqCi0gKiAKLSAqLwotQENvbXBvbmVudCggcm9sZSA9IENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyLmNsYXNzLCBoaW50ID0gIm1ldGFJbmYtc2VydmljZXMiLCBpbnN0YW50aWF0aW9uU3RyYXRlZ3kgPSAicGVyLWxvb2t1cCIgKQotcHVibGljIGNsYXNzIE1ldGFJbmZTZXJ2aWNlc0hhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0TGluZUFnZ3JlZ2F0aW5nSGFuZGxlcgotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VTX1BBVEhfUFJFRklYID0gIk1FVEEtSU5GL3NlcnZpY2VzLyI7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldE91dHB1dFBhdGhQcmVmaXgoIGZpbmFsIEZpbGVJbmZvIGZpbGVJbmZvICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBTRVJWSUNFU19QQVRIX1BSRUZJWDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBmaWxlTWF0Y2hlcyggZmluYWwgRmlsZUluZm8gZmlsZUluZm8gKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBmaWxlSW5mby5nZXROYW1lKCk7Ci0KLSAgICAgICAgU3RyaW5nIGxlZnRvdmVyID0gbnVsbDsKLSAgICAgICAgaWYgKCBwYXRoLnN0YXJ0c1dpdGgoIFNFUlZJQ0VTX1BBVEhfUFJFRklYICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsZWZ0b3ZlciA9IHBhdGguc3Vic3RyaW5nKCBTRVJWSUNFU19QQVRIX1BSRUZJWC5sZW5ndGgoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBwYXRoLnN0YXJ0c1dpdGgoICIvTUVUQS1JTkYvc2VydmljZXMvIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgbGVmdG92ZXIgPSBwYXRoLnN1YnN0cmluZyggU0VSVklDRVNfUEFUSF9QUkVGSVgubGVuZ3RoKCkgLSAxICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbGVmdG92ZXIgIT0gbnVsbCAmJiBsZWZ0b3Zlci5sZW5ndGgoKSA+IDA7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZmlsdGVyL01ldGFJbmZTcHJpbmdIYW5kbGVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZmlsdGVyL01ldGFJbmZTcHJpbmdIYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZTc2MGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9NZXRhSW5mU3ByaW5nSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5maWx0ZXI7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5hbm5vdGF0aW9ucy5Db21wb25lbnQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLmZpbGVzZWxlY3RvcnMuRmlsZUluZm87Ci0KLS8qKgotICogCi0gKi8KLUBDb21wb25lbnQoIHJvbGUgPSBDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlci5jbGFzcywgaGludCA9ICJtZXRhSW5mLXNwcmluZyIsIGluc3RhbnRpYXRpb25TdHJhdGVneSA9ICJwZXItbG9va3VwIiApCi1wdWJsaWMgY2xhc3MgTWV0YUluZlNwcmluZ0hhbmRsZXIKLSAgICBleHRlbmRzIEFic3RyYWN0TGluZUFnZ3JlZ2F0aW5nSGFuZGxlcgotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNQUklOR19QQVRIX1BSRUZJWCA9ICJNRVRBLUlORi8iOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIFN0cmluZyBnZXRPdXRwdXRQYXRoUHJlZml4KCBmaW5hbCBGaWxlSW5mbyBmaWxlSW5mbyApCi0gICAgewotICAgICAgICByZXR1cm4gU1BSSU5HX1BBVEhfUFJFRklYOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIGZpbGVNYXRjaGVzKCBmaW5hbCBGaWxlSW5mbyBmaWxlSW5mbyApCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IGZpbGVJbmZvLmdldE5hbWUoKTsKLQotICAgICAgICBTdHJpbmcgbGVmdG92ZXIgPSBudWxsOwotICAgICAgICBpZiAoIHBhdGguc3RhcnRzV2l0aCggIi9NRVRBLUlORi9zcHJpbmcuIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgbGVmdG92ZXIgPSBwYXRoLnN1YnN0cmluZyggIi9NRVRBLUlORi9zcHJpbmcuIi5sZW5ndGgoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCBwYXRoLnN0YXJ0c1dpdGgoICJNRVRBLUlORi9zcHJpbmcuIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgbGVmdG92ZXIgPSBwYXRoLnN1YnN0cmluZyggIk1FVEEtSU5GL3NwcmluZy4iLmxlbmd0aCgpIC0gMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxlZnRvdmVyICE9IG51bGwgJiYgbGVmdG92ZXIubGVuZ3RoKCkgPiAwOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9TaW1wbGVBZ2dyZWdhdGluZ0Rlc2NyaXB0b3JIYW5kbGVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZmlsdGVyL1NpbXBsZUFnZ3JlZ2F0aW5nRGVzY3JpcHRvckhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI5NzZmZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZmlsdGVyL1NpbXBsZUFnZ3JlZ2F0aW5nRGVzY3JpcHRvckhhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlcjsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5RmlsZVV0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlVuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuQ29tcG9uZW50OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVJbmZvOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dFbmFibGVkOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLmNvbnNvbGUuQ29uc29sZUxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5EYXRlOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotQENvbXBvbmVudCggcm9sZSA9IENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyLmNsYXNzLCBoaW50ID0gImZpbGUtYWdncmVnYXRvciIsIGluc3RhbnRpYXRpb25TdHJhdGVneSA9ICJwZXItbG9va3VwIiApCi1wdWJsaWMgY2xhc3MgU2ltcGxlQWdncmVnYXRpbmdEZXNjcmlwdG9ySGFuZGxlcgotICAgIGltcGxlbWVudHMgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIsIExvZ0VuYWJsZWQKLXsKLQotICAgIC8vIGNvbXBvbmVudCBjb25maWd1cmF0aW9uLgotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZmlsZVBhdHRlcm47Ci0KLSAgICBwcml2YXRlIFN0cmluZyBvdXRwdXRQYXRoOwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJGaWVsZENhbkJlTG9jYWwiICkKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb21tZW50Q2hhcnMgPSAiIyI7Ci0KLSAgICAvLyBjYWxjdWxhdGVkLCB0ZW1wb3JhcnkgdmFsdWVzLgotCi0gICAgcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRlRmlsdGVyQWN0aW9uOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdXcml0ZXIgYWdncmVnYXRlV3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gZmlsZW5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAvLyBpbmplY3RlZCBieSB0aGUgY29udGFpbmVyLgotCi0gICAgcHJpdmF0ZSBMb2dnZXIgbG9nZ2VyOwotCi0gICAgcHVibGljIHZvaWQgZmluYWxpemVBcmNoaXZlQ3JlYXRpb24oIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyICkKLSAgICB7Ci0gICAgICAgIGNoZWNrQ29uZmlnKCk7Ci0KLSAgICAgICAgaWYgKCBvdXRwdXRQYXRoLmVuZHNXaXRoKCAiLyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBcmNoaXZlckV4Y2VwdGlvbiggIkNhbm5vdCB3cml0ZSBhZ2dyZWdhdGVkIHByb3BlcnRpZXMgdG8gYSBkaXJlY3RvcnkuICIKLSAgICAgICAgICAgICAgICArICJZb3UgbXVzdCBzcGVjaWZ5IGEgZmlsZSBuYW1lIGluIHRoZSBvdXRwdXRQYXRoIGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgaGFuZGxlci4gKGhhbmRsZXI6ICIKLSAgICAgICAgICAgICAgICArIGdldENsYXNzKCkuZ2V0TmFtZSgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG91dHB1dFBhdGguc3RhcnRzV2l0aCggIi8iICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRQYXRoID0gb3V0cHV0UGF0aC5zdWJzdHJpbmcoIDEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEZpbGUgdGVtcCA9IHdyaXRlUHJvcGVydGllc0ZpbGUoKTsKLQotICAgICAgICBvdmVycmlkZUZpbHRlckFjdGlvbiA9IHRydWU7Ci0KLSAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZSggdGVtcCwgb3V0cHV0UGF0aCApOwotCi0gICAgICAgIG92ZXJyaWRlRmlsdGVyQWN0aW9uID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBGaWxlIHdyaXRlUHJvcGVydGllc0ZpbGUoKQotICAgIHsKLSAgICAgICAgRmlsZSBmOwotCi0gICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZiA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoICJtYXZlbi1hc3NlbWJseS1wbHVnaW4iLCAidG1wIiApOwotICAgICAgICAgICAgZi5kZWxldGVPbkV4aXQoKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBpc1Byb3BlcnR5ID0gQXNzZW1ibHlGaWxlVXRpbHMuaXNQcm9wZXJ0eUZpbGUoIGYgKTsKLSAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGYgKTsKLSAgICAgICAgICAgIHdyaXRlciA9IGlzUHJvcGVydHkKLSAgICAgICAgICAgICAgICA/IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIGZvcywgIklTTy04ODU5LTEiICkKLSAgICAgICAgICAgICAgICA6IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIGZvcyApOyAvLyBTdGlsbCBwbGF0Zm9ybSBlbmNvZGluZwotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIGNvbW1lbnRDaGFycyArICIgQWdncmVnYXRlZCBvbiAiICsgbmV3IERhdGUoKSArICIgZnJvbTogIiApOwotCi0gICAgICAgICAgICBmb3IgKCBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgOiBmaWxlbmFtZXMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSggIlxuIiArIGNvbW1lbnRDaGFycyArICIgIiArIGZpbGVuYW1lICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZSggIlxuXG4iICk7Ci0KLSAgICAgICAgICAgIHdyaXRlci53cml0ZSggYWdncmVnYXRlV3JpdGVyLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIElPRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgIkVycm9yIGFkZGluZyBhZ2dyZWdhdGVkIHByb3BlcnRpZXMgdG8gZmluYWxpemUgYXJjaGl2ZSBjcmVhdGlvbi4gUmVhc29uOiAiICsgZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jbG9zZSggd3JpdGVyICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBmaW5hbGl6ZUFyY2hpdmVFeHRyYWN0aW9uKCBmaW5hbCBVbkFyY2hpdmVyIHVuYXJjaGl2ZXIgKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFZpcnR1YWxGaWxlcygpCi0gICAgewotICAgICAgICBjaGVja0NvbmZpZygpOwotCi0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCBvdXRwdXRQYXRoICk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCggIEBOb25udWxsIGZpbmFsIEZpbGVJbmZvIGZpbGVJbmZvICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBjaGVja0NvbmZpZygpOwotCi0gICAgICAgIGlmICggb3ZlcnJpZGVGaWx0ZXJBY3Rpb24gKQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJGaWx0ZXJpbmcgb3ZlcnJpZGRlbi4gUmV0dXJuaW5nIHRydWUuIiApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgbmFtZSA9IEFzc2VtYmx5RmlsZVV0aWxzLm5vcm1hbGl6ZUZpbGVJbmZvKCBmaWxlSW5mbyApOwotCi0gICAgICAgIGlmICggZmlsZUluZm8uaXNGaWxlKCkgJiYgbmFtZS5tYXRjaGVzKCBmaWxlUGF0dGVybiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcmVhZFByb3BlcnRpZXMoIGZpbGVJbmZvICk7Ci0gICAgICAgICAgICBmaWxlbmFtZXMuYWRkKCBuYW1lICk7Ci0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0NvbmZpZygpCi0gICAgewotICAgICAgICBpZiAoIGZpbGVQYXR0ZXJuID09IG51bGwgfHwgb3V0cHV0UGF0aCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiWW91IG11c3QgY29uZmlndXJlIGZpbGVQYXR0ZXJuIGFuZCBvdXRwdXRQYXRoIGluIHlvdXIgY29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIgZGVjbGFyYXRpb24uIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRQcm9wZXJ0aWVzKCBmaW5hbCBGaWxlSW5mbyBmaWxlSW5mbyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIGlzUHJvcGVydHkgPSBBc3NlbWJseUZpbGVVdGlscy5pc1Byb3BlcnR5RmlsZSggZmlsZUluZm8uZ2V0TmFtZSgpICk7Ci0KLSAgICAgICAgICAgIHJlYWRlciA9IGlzUHJvcGVydHkKLSAgICAgICAgICAgICAgICA/IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggZmlsZUluZm8uZ2V0Q29udGVudHMoKSwgIklTTy04ODU5LTEiICkKLSAgICAgICAgICAgICAgICA6IG5ldyBJbnB1dFN0cmVhbVJlYWRlciggZmlsZUluZm8uZ2V0Q29udGVudHMoKSApOyAvLyBwbGF0Zm9ybSBlbmNvZGluZwotCi0gICAgICAgICAgICBJT1V0aWwuY29weSggcmVhZGVyLCB3cml0ZXIgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jbG9zZSggcmVhZGVyICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudCA9IHdyaXRlci50b1N0cmluZygpOwotCi0gICAgICAgIGFnZ3JlZ2F0ZVdyaXRlci53cml0ZSggIlxuIiApOwotICAgICAgICBhZ2dyZWdhdGVXcml0ZXIud3JpdGUoIGNvbnRlbnQgKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgTG9nZ2VyIGdldExvZ2dlcigpCi0gICAgewotICAgICAgICBpZiAoIGxvZ2dlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9JTkZPLCAiIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxvZ2dlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBlbmFibGVMb2dnaW5nKCBmaW5hbCBMb2dnZXIgbG9nZ2VyICkKLSAgICB7Ci0gICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAiVW51c2VkRGVjbGFyYXRpb24iICkKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVQYXR0ZXJuKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBmaWxlUGF0dGVybjsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggIlVudXNlZERlY2xhcmF0aW9uIiApCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZVBhdHRlcm4oIGZpbmFsIFN0cmluZyBmaWxlUGF0dGVybiApCi0gICAgewotICAgICAgICB0aGlzLmZpbGVQYXR0ZXJuID0gZmlsZVBhdHRlcm47Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJVbnVzZWREZWNsYXJhdGlvbiIgKQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3V0cHV0UGF0aCgpCi0gICAgewotICAgICAgICByZXR1cm4gb3V0cHV0UGF0aDsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggIlVudXNlZERlY2xhcmF0aW9uIiApCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0UGF0aCggZmluYWwgU3RyaW5nIG91dHB1dFBhdGggKQotICAgIHsKLSAgICAgICAgdGhpcy5vdXRwdXRQYXRoID0gb3V0cHV0UGF0aDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9mb3JtYXQvQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZm9ybWF0L0Fzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMjVjMDNkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9mb3JtYXQvQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICBleHRlbmRzIEV4Y2VwdGlvbgotewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGVycm9yICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlLCBlcnJvciApOwotICAgIH0KLQotICAgIHB1YmxpYyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24oIGZpbmFsIFN0cmluZyBtZXNzYWdlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZm9ybWF0L1JlYWRlckZvcm1hdHRlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2Zvcm1hdC9SZWFkZXJGb3JtYXR0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg3ZWJmMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZm9ybWF0L1JlYWRlckZvcm1hdHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0OwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmlvLmlucHV0LlJlYWRlcklucHV0U3RyZWFtOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuQXNzZW1ibHlGaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuTGluZUVuZGluZ3M7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuTGluZUVuZGluZ3NVdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5maWx0ZXJpbmcuTWF2ZW5GaWx0ZXJpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuZmlsdGVyaW5nLk1hdmVuUmVhZGVyRmlsdGVyUmVxdWVzdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8uZnVuY3Rpb25zLklucHV0U3RyZWFtVHJhbnNmb3JtZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLnJlc291cmNlcy5QbGV4dXNJb1Jlc291cmNlOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICoKLSAqLwotcHVibGljIGNsYXNzIFJlYWRlckZvcm1hdHRlcgotewotICAgIHByaXZhdGUgc3RhdGljIFJlYWRlciBjcmVhdGVSZWFkZXJGaWx0ZXIoIEBOb25udWxsIFJlYWRlciBzb3VyY2UsIFN0cmluZyBlc2NhcGVTdHJpbmcsIExpc3Q8U3RyaW5nPiBkZWxpbWl0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlLCBib29sZWFuIGlzUHJvcGVydGllc0ZpbGUgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIE1hdmVuUmVhZGVyRmlsdGVyUmVxdWVzdCBmaWx0ZXJSZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICBuZXcgTWF2ZW5SZWFkZXJGaWx0ZXJSZXF1ZXN0KCBzb3VyY2UsIHRydWUsIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCksIGNvbmZpZ1NvdXJjZS5nZXRGaWx0ZXJzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQcm9wZXJ0aWVzRmlsZSwgbnVsbCwgY29uZmlnU291cmNlLmdldE1hdmVuU2Vzc2lvbigpLCBudWxsICk7Ci0gICAgICAgICAgICBmaWx0ZXJSZXF1ZXN0LnNldEVzY2FwZVN0cmluZyggZXNjYXBlU3RyaW5nICk7Ci0KLSAgICAgICAgICAgIC8vIGlmIHRoZXNlIGFyZSBOT1Qgc2V0LCBqdXN0IHVzZSB0aGUgZGVmYXVsdHMsIHdoaWNoIGFyZSAnJHsqfScgYW5kICdAJy4KLSAgICAgICAgICAgIGlmICggZGVsaW1pdGVycyAhPSBudWxsICYmICFkZWxpbWl0ZXJzLmlzRW1wdHkoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlua2VkSGFzaFNldDxTdHJpbmc+IGRlbGltcyA9IG5ldyBMaW5rZWRIYXNoU2V0PFN0cmluZz4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKCBTdHJpbmcgZGVsaW0gOiBkZWxpbWl0ZXJzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICggZGVsaW0gPT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiAke2ZpbHRlcjoqfSBjb3VsZCBhbHNvIHRyaWdnZXIgdGhpcyBjb25kaXRpb24uIE5lZWQgYSBiZXR0ZXIgbG9uZy10ZXJtIHNvbHV0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1zLmFkZCggIiR7Kn0iICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWxpbXMuYWRkKCBkZWxpbSApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmlsdGVyUmVxdWVzdC5zZXREZWxpbWl0ZXJzKCBkZWxpbXMgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXJSZXF1ZXN0LnNldERlbGltaXRlcnMoIGZpbHRlclJlcXVlc3QuZ2V0RGVsaW1pdGVycygpICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbHRlclJlcXVlc3Quc2V0SW5qZWN0UHJvamVjdEJ1aWxkRmlsdGVycyggY29uZmlnU291cmNlLmlzSW5jbHVkZVByb2plY3RCdWlsZEZpbHRlcnMoKSApOwotICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ1NvdXJjZS5nZXRNYXZlblJlYWRlckZpbHRlcigpLmZpbHRlciggZmlsdGVyUmVxdWVzdCApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggTWF2ZW5GaWx0ZXJpbmdFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIElPRXhjZXB0aW9uIGlvZSA9IG5ldyBJT0V4Y2VwdGlvbiggIkVycm9yIGZpbHRlcmluZyBmaWxlICciICsgc291cmNlICsgIic6ICIgKyBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICAgICAgaW9lLmluaXRDYXVzZSggZSApOyAvLyBwbGFpbiBvbGQgSmF2YSA1Li4uCi0gICAgICAgICAgICB0aHJvdyBpb2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNGb3JiaWRkZW5GaWxldHlwZXMoIFBsZXh1c0lvUmVzb3VyY2UgcGxleHVzSW9SZXNvdXJjZSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGZpbGVOYW1lID0gcGxleHVzSW9SZXNvdXJjZS5nZXROYW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgcmV0dXJuICggZmlsZU5hbWUuZW5kc1dpdGgoICIuemlwIiApIHx8IGZpbGVOYW1lLmVuZHNXaXRoKCAiLmphciIgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tpZkZpbGVUeXBlSXNBcHByb3ByaWF0ZUZvckxpbmVFbmRpbmdUcmFuc2Zvcm1hdGlvbiggUGxleHVzSW9SZXNvdXJjZSBwbGV4dXNJb1Jlc291cmNlICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIGlzRm9yYmlkZGVuRmlsZXR5cGVzKCBwbGV4dXNJb1Jlc291cmNlICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oICJDYW5ub3QgdHJhbnNmb3JtIGxpbmUgZW5kaW5ncyBvbiB0aGlzIGtpbmQgb2YgZmlsZTogIiArIHBsZXh1c0lvUmVzb3VyY2UuZ2V0TmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJcbkRvaW5nIHNvIGlzIG1vcmUgb3IgbGVzcyBndWFyYW50ZWVkIHRvIGRlc3Ryb3kgdGhlIGZpbGUsIGFuZCBpdCBpbmRpY2F0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYSBwcm9ibGVtIHdpdGggeW91ciBhc3NlbWJseSBkZXNjcmlwdG9yLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuVGhpcyBlcnJvciBtZXNzYWdlIGlzIG5ldyBhcyBvZiAyLjUuMy4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG5FYXJsaWVyIHZlcnNpb25zIG9mIGFzc2VtYmx5LXBsdWdpbiB3aWxsIHNpbGVudGx5IGRlc3Ryb3kgeW91ciBmaWxlLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJGaXggeW91ciBkZXNjcmlwdG9yIiApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtVHJhbnNmb3JtZXIgZ2V0RmlsZVNldFRyYW5zZm9ybWVycyggZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNGaWx0ZXJlZCwgU3RyaW5nIGZpbGVTZXRMaW5lRW5kaW5nICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgTGluZUVuZGluZ3MgbGluZUVuZGluZ1RvVXNlID0gTGluZUVuZGluZ3NVdGlscy5nZXRMaW5lRW5kaW5nKCBmaWxlU2V0TGluZUVuZGluZyApOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gdHJhbnNmb3JtTGluZUVuZGluZ3MgPSAhTGluZUVuZGluZ3Mua2VlcC5lcXVhbHMoIGxpbmVFbmRpbmdUb1VzZSApOwotCi0gICAgICAgIGlmICggdHJhbnNmb3JtTGluZUVuZGluZ3MgfHwgaXNGaWx0ZXJlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW1UcmFuc2Zvcm1lcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQE5vbm51bGwKLSAgICAgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gdHJhbnNmb3JtKCBATm9ubnVsbCBQbGV4dXNJb1Jlc291cmNlIHBsZXh1c0lvUmVzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE5vbm51bGwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHJlc3VsdCA9IGlucHV0U3RyZWFtOwotICAgICAgICAgICAgICAgICAgICBpZiAoIGlzRmlsdGVyZWQgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUHJvcGVydHlGaWxlID0gQXNzZW1ibHlGaWxlVXRpbHMuaXNQcm9wZXJ0eUZpbGUoIHBsZXh1c0lvUmVzb3VyY2UuZ2V0TmFtZSgpICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RpbmcgPSBpc1Byb3BlcnR5RmlsZSA/ICJJU08tODg1OS0xIiA6IGNvbmZpZ1NvdXJjZS5nZXRFbmNvZGluZygpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBSZWFkZXIgc291cmNlID0gZW5jb2RpbmcgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IElucHV0U3RyZWFtUmVhZGVyKCBpbnB1dFN0cmVhbSwgZW5jb2RpbmcgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IElucHV0U3RyZWFtUmVhZGVyKCBpbnB1dFN0cmVhbSApOyAvLyB3dGYgcGxhdGZvcm0gZW5jb2RpbmcgPyBUT0RPOiBGaXggdGhpcwotICAgICAgICAgICAgICAgICAgICAgICAgUmVhZGVyIGZpbHRlcmVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVSZWFkZXJGaWx0ZXIoIHNvdXJjZSwgY29uZmlnU291cmNlLmdldEVzY2FwZVN0cmluZygpLCBjb25maWdTb3VyY2UuZ2V0RGVsaW1pdGVycygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnU291cmNlLCBpc1Byb3BlcnR5RmlsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZW5jb2RpbmcgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFJlYWRlcklucHV0U3RyZWFtKCBmaWx0ZXJlZCwgZW5jb2RpbmcgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFJlYWRlcklucHV0U3RyZWFtKCBmaWx0ZXJlZCApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICggdHJhbnNmb3JtTGluZUVuZGluZ3MgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja2lmRmlsZVR5cGVJc0FwcHJvcHJpYXRlRm9yTGluZUVuZGluZ1RyYW5zZm9ybWF0aW9uKCBwbGV4dXNJb1Jlc291cmNlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBMaW5lRW5kaW5nc1V0aWxzLmxpbmVFbmRpbmdDb252ZXJ0ZXIoIHJlc3VsdCwgbGluZUVuZGluZ1RvVXNlICk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9mb3JtYXQvUmVmbGVjdGlvblByb3BlcnRpZXMuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9mb3JtYXQvUmVmbGVjdGlvblByb3BlcnRpZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY0MmI2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZm9ybWF0L1JlZmxlY3Rpb25Qcm9wZXJ0aWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLlN0cmluZ1V0aWxzOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5pbnRyb3NwZWN0aW9uLlJlZmxlY3Rpb25WYWx1ZUV4dHJhY3RvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIEBhdXRob3IgQW5kcmVhcyBIb2hlbmVkZXIgKGFob2hfYXRfaW5vZGUuYXQpCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZGVwcmVjYXRlZAotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGNsYXNzIFJlZmxlY3Rpb25Qcm9wZXJ0aWVzCi0gICAgZXh0ZW5kcyBQcm9wZXJ0aWVzCi17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBmaW5hbCBib29sZWFuIGVzY2FwZWRCYWNrc2xhc2hlc0luRmlsZVBhdGg7Ci0KLSAgICBwdWJsaWMgUmVmbGVjdGlvblByb3BlcnRpZXMoIGZpbmFsIE1hdmVuUHJvamVjdCBhUHJvamVjdCwgZmluYWwgYm9vbGVhbiBlc2NhcGVkQmFja3NsYXNoZXNJbkZpbGVQYXRoICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCk7Ci0KLSAgICAgICAgcHJvamVjdCA9IGFQcm9qZWN0OwotCi0gICAgICAgIHRoaXMuZXNjYXBlZEJhY2tzbGFzaGVzSW5GaWxlUGF0aCA9IGVzY2FwZWRCYWNrc2xhc2hlc0luRmlsZVBhdGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXQoIGZpbmFsIE9iamVjdCBrZXkgKQotICAgIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gUmVmbGVjdGlvblZhbHVlRXh0cmFjdG9yLmV2YWx1YXRlKCAiIiArIGtleSwgcHJvamVjdCApOwotCi0gICAgICAgICAgICBpZiAoIGVzY2FwZWRCYWNrc2xhc2hlc0luRmlsZVBhdGggJiYgdmFsdWUgIT0gbnVsbCAmJiAiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKAotICAgICAgICAgICAgICAgIHZhbHVlLmdldENsYXNzKCkuZ2V0TmFtZSgpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB2YWx1ZTsKLQotICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYSB3aW5kb3dzIHBhdGgKLSAgICAgICAgICAgICAgICBpZiAoIHZhbC5pbmRleE9mKCAiOlxcIiApID09IDEgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmdVdGlscy5yZXBsYWNlKCAoU3RyaW5nKSB2YWx1ZSwgIlxcIiwgIlxcXFwiICk7Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nVXRpbHMucmVwbGFjZSggKFN0cmluZykgdmFsdWUsICI6IiwgIlxcOiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgdHJ5LWNhdGNoIGJsb2NrIHdoZW4gUmVmbGVjdGlvblZhbHVlRXh0cmFjdG9yLmV2YWx1YXRlKCkgdGhyb3dzIG5vIG1vcmUgZXhjZXB0aW9ucwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZnVuY3Rpb25zL01hdmVuUHJvamVjdENvbnN1bWVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZnVuY3Rpb25zL01hdmVuUHJvamVjdENvbnN1bWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzdmZDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2Z1bmN0aW9ucy9NYXZlblByb2plY3RDb25zdW1lci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mdW5jdGlvbnM7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1hdmVuUHJvamVjdENvbnN1bWVyCi17Ci0gICAgdm9pZCBhY2NlcHQoIE1hdmVuUHJvamVjdCBwcm9qZWN0ICk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZnVuY3Rpb25zL01hdmVuUHJvamVjdHMuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9mdW5jdGlvbnMvTWF2ZW5Qcm9qZWN0cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2RjZWU5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9mdW5jdGlvbnMvTWF2ZW5Qcm9qZWN0cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZnVuY3Rpb25zOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0VXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgTWF2ZW5Qcm9qZWN0cwotewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3aXRob3V0KCBJdGVyYWJsZTxNYXZlblByb2plY3Q+IHNvdXJjZSwgU3RyaW5nIHBhY2thZ2luZ1R5cGUsIE1hdmVuUHJvamVjdENvbnN1bWVyIGNvbnN1bWVyICkKLSAgICB7Ci0gICAgICAgIGZvciAoIE1hdmVuUHJvamVjdCBwcm9qZWN0IDogc291cmNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCAhcGFja2FnaW5nVHlwZS5lcXVhbHMoIHByb2plY3QuZ2V0UGFja2FnaW5nKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY29uc3VtZXIuYWNjZXB0KCBwcm9qZWN0ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0KCBJdGVyYWJsZTxNYXZlblByb2plY3Q+IHNvdXJjZSwgU3RyaW5nIHBhY2thZ2luZ1R5cGUsIE1hdmVuUHJvamVjdENvbnN1bWVyIGNvbnN1bWVyICkKLSAgICB7Ci0gICAgICAgIGZvciAoIE1hdmVuUHJvamVjdCBwcm9qZWN0IDogc291cmNlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBwYWNrYWdpbmdUeXBlLmVxdWFscyggcHJvamVjdC5nZXRQYWNrYWdpbmcoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb25zdW1lci5hY2NlcHQoIHByb2plY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3QoIEl0ZXJhYmxlPE1hdmVuUHJvamVjdD4gc291cmNlLCBTdHJpbmcgcGFja2FnaW5nVHlwZSwgTWF2ZW5Qcm9qZWN0Q29uc3VtZXIgaW5jbHVkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXZlblByb2plY3RDb25zdW1lciBleGNsdWRlZCApCi0gICAgewotICAgICAgICBmb3IgKCBNYXZlblByb2plY3QgcHJvamVjdCA6IHNvdXJjZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggcGFja2FnaW5nVHlwZS5lcXVhbHMoIHByb2plY3QuZ2V0UGFja2FnaW5nKCkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5jbHVkZS5hY2NlcHQoIHByb2plY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleGNsdWRlZC5hY2NlcHQoIHByb2plY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBzdGF0aWMgQXJ0aWZhY3QgZmluZEFydGlmYWN0QnlDbGFzc2lmaWVyKCBNYXZlblByb2plY3QgbWF2ZW5Qcm9qZWN0LCBTdHJpbmcgY2xhc3NpZmllciApCi0gICAgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKSBmaW5hbCBMaXN0PEFydGlmYWN0PiBhdHRhY2htZW50cyA9IG1hdmVuUHJvamVjdC5nZXRBdHRhY2hlZEFydGlmYWN0cygpOwotICAgICAgICBpZiAoICggYXR0YWNobWVudHMgIT0gbnVsbCApICYmICFhdHRhY2htZW50cy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBmaW5hbCBBcnRpZmFjdCBhdHRhY2htZW50IDogYXR0YWNobWVudHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggY2xhc3NpZmllci5lcXVhbHMoIGF0dGFjaG1lbnQuZ2V0Q2xhc3NpZmllcigpICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dGFjaG1lbnQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotCi0gICAgcHVibGljIHN0YXRpYyBNYXZlblByb2plY3RDb25zdW1lciBsb2coIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNYXZlblByb2plY3RDb25zdW1lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjY2VwdCggTWF2ZW5Qcm9qZWN0IHByb2plY3QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0SWQgPSBBcnRpZmFjdFV0aWxzLnZlcnNpb25sZXNzS2V5KCBwcm9qZWN0LmdldEdyb3VwSWQoKSwgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKTsKLQotICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggIkV4Y2x1ZGluZyBQT00tcGFja2FnaW5nIG1vZHVsZTogIiArIHByb2plY3RJZCApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWF2ZW5Qcm9qZWN0Q29uc3VtZXIgYWRkVG8oIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IHNldCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IE1hdmVuUHJvamVjdENvbnN1bWVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcHVibGljIHZvaWQgYWNjZXB0KCBNYXZlblByb2plY3QgcHJvamVjdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc2V0LmFkZCggcHJvamVjdCApOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2Z1bmN0aW9ucy9Nb2R1bGVTZXRDb25zdW1lci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2Z1bmN0aW9ucy9Nb2R1bGVTZXRDb25zdW1lci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTE0MTYxLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9mdW5jdGlvbnMvTW9kdWxlU2V0Q29uc3VtZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZnVuY3Rpb25zOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Nb2R1bGVTZXQ7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTW9kdWxlU2V0Q29uc3VtZXIKLXsKLSAgICB2b2lkIGFjY2VwdCggTW9kdWxlU2V0IHJlc29sdmVkTW9kdWxlICkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW50ZXJwb2xhdGlvbi9Bc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pbnRlcnBvbGF0aW9uL0Fzc2VtYmx5RXhwcmVzc2lvbkV2YWx1YXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YTVlODM1Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pbnRlcnBvbGF0aW9uL0Fzc2VtYmx5RXhwcmVzc2lvbkV2YWx1YXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pbnRlcnBvbGF0aW9uOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pby5EZWZhdWx0QXNzZW1ibHlSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuSW50ZXJwb2xhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmNvbmZpZ3VyYXRvci5leHByZXNzaW9uLkV4cHJlc3Npb25FdmFsdWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50LmNvbmZpZ3VyYXRvci5leHByZXNzaW9uLkV4cHJlc3Npb25FdmFsdWF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLlByZWZpeEF3YXJlUmVjdXJzaW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5JbnRlcnBvbGF0aW9uU3RhdGU7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLS8qKgotICogCi0gKi8KLXB1YmxpYyBjbGFzcyBBc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IKLSAgICBpbXBsZW1lbnRzIEV4cHJlc3Npb25FdmFsdWF0b3IKLXsKLQotICAgIHByaXZhdGUgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcjsKLQotICAgIHByaXZhdGUgZmluYWwgUHJlZml4QXdhcmVSZWN1cnNpb25JbnRlcmNlcHRvciBpbnRlcmNlcHRvcjsKLQotICAgIHB1YmxpYyBBc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IoIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29uZmlnU291cmNlID0gY29uZmlnU291cmNlOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gY29uZmlnU291cmNlLmdldFByb2plY3QoKTsKLSAgICAgICAgZmluYWwgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgcHJvamVjdEludGVycG9sYXRvciA9Ci0gICAgICAgICAgICBEZWZhdWx0QXNzZW1ibHlSZWFkZXIuY3JlYXRlUHJvamVjdEludGVycG9sYXRvciggcHJvamVjdCApOwotICAgICAgICBpbnRlcnBvbGF0b3IgPSBBc3NlbWJseUludGVycG9sYXRvci5mdWxsSW50ZXJwb2xhdG9yKCBwcm9qZWN0LCBwcm9qZWN0SW50ZXJwb2xhdG9yLCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgaW50ZXJjZXB0b3IgPSBuZXcgUHJlZml4QXdhcmVSZWN1cnNpb25JbnRlcmNlcHRvciggSW50ZXJwb2xhdGlvbkNvbnN0YW50cy5QUk9KRUNUX1BSRUZJWEVTLCB0cnVlICk7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgYWxpZ25Ub0Jhc2VEaXJlY3RvcnkoIEZpbGUgZiApCi0gICAgewotICAgICAgICBTdHJpbmcgYmFzZVBhdGggPSBjb25maWdTb3VyY2UuZ2V0QmFzZWRpcigpLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBTdHJpbmcgcGF0aCA9IGYuZ2V0UGF0aCgpOwotCi0gICAgICAgIGlmICggIWYuaXNBYnNvbHV0ZSgpICYmICFwYXRoLnN0YXJ0c1dpdGgoIGJhc2VQYXRoICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpbGUoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCksIHBhdGggKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBldmFsdWF0ZSggU3RyaW5nIGV4cHJlc3Npb24gKQotICAgICAgICB0aHJvd3MgRXhwcmVzc2lvbkV2YWx1YXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEludGVycG9sYXRpb25TdGF0ZSBpcyA9IG5ldyBJbnRlcnBvbGF0aW9uU3RhdGUoKTsKLSAgICAgICAgaXMuc2V0UmVjdXJzaW9uSW50ZXJjZXB0b3IoIGludGVyY2VwdG9yICk7Ci0gICAgICAgIHJldHVybiBpbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUoIGV4cHJlc3Npb24sIGlzICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW50ZXJwb2xhdGlvbi9Bc3NlbWJseUludGVycG9sYXRpb25FeGNlcHRpb24uamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pbnRlcnBvbGF0aW9uL0Fzc2VtYmx5SW50ZXJwb2xhdGlvbkV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGU1Y2ZlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pbnRlcnBvbGF0aW9uL0Fzc2VtYmx5SW50ZXJwb2xhdGlvbkV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pbnRlcnBvbGF0aW9uOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEFzc2VtYmx5SW50ZXJwb2xhdGlvbkV4Y2VwdGlvbgotICAgIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwdWJsaWMgQXNzZW1ibHlJbnRlcnBvbGF0aW9uRXhjZXB0aW9uKCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgVGhyb3dhYmxlIGNhdXNlICkKLSAgICB7Ci0gICAgICAgIHN1cGVyKCBtZXNzYWdlLCBjYXVzZSApOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ludGVycG9sYXRpb24vQXNzZW1ibHlJbnRlcnBvbGF0b3IuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pbnRlcnBvbGF0aW9uL0Fzc2VtYmx5SW50ZXJwb2xhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3MGE3OWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ludGVycG9sYXRpb24vQXNzZW1ibHlJbnRlcnBvbGF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmludGVycG9sYXRpb247Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLmlvLnhwcDMuQXNzZW1ibHlYcHAzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLmlvLnhwcDMuQ29tcG9uZW50WHBwM1JlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5yZXNvbHZlZC5Bc3NlbWJseUlkOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5RmlsZVV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLkludGVycG9sYXRpb25Qb3N0UHJvY2Vzc29yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5GaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmludGVycG9sYXRpb24uZml4ZWQuSW50ZXJwb2xhdGlvblN0YXRlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5vYmplY3QuRmllbGRCYXNlZE9iamVjdEludGVycG9sYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgY2xhc3MgQXNzZW1ibHlJbnRlcnBvbGF0b3IKLXsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBJTlRFUlBPTEFUSU9OX0JMQUNLTElTVDsKLQotICAgIHN0YXRpYwotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYmxhY2tsaXN0ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotCi0gICAgICAgIGJsYWNrbGlzdC5hZGQoICJvdXRwdXRGaWxlTmFtZU1hcHBpbmciICk7Ci0gICAgICAgIGJsYWNrbGlzdC5hZGQoICJvdXRwdXREaXJlY3RvcnlNYXBwaW5nIiApOwotICAgICAgICBibGFja2xpc3QuYWRkKCAib3V0cHV0RGlyZWN0b3J5IiApOwotCi0gICAgICAgIElOVEVSUE9MQVRJT05fQkxBQ0tMSVNUID0gYmxhY2tsaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyBBc3NlbWJseUludGVycG9sYXRvcigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEFzc2VtYmx5WHBwM1JlYWRlci5Db250ZW50VHJhbnNmb3JtZXIgYXNzZW1ibHlJbnRlcnBvbGF0b3IoCi0gICAgICAgIGZpbmFsIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvciwgZmluYWwgSW50ZXJwb2xhdGlvblN0YXRlIGlzLCBmaW5hbCBMb2dnZXIgbG9nZ2VyICkKLSAgICB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApIGZpbmFsIFNldDxTdHJpbmc+IGJsYWNrbGlzdEZpZWxkcyA9Ci0gICAgICAgICAgICBuZXcgSGFzaFNldDxTdHJpbmc+KCBGaWVsZEJhc2VkT2JqZWN0SW50ZXJwb2xhdG9yLkRFRkFVTFRfQkxBQ0tMSVNURURfRklFTERfTkFNRVMgKTsKLSAgICAgICAgYmxhY2tsaXN0RmllbGRzLmFkZEFsbCggSU5URVJQT0xBVElPTl9CTEFDS0xJU1QgKTsKLQotICAgICAgICByZXR1cm4gbmV3IEFzc2VtYmx5WHBwM1JlYWRlci5Db250ZW50VHJhbnNmb3JtZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYW5zZm9ybSggU3RyaW5nIHNvdXJjZSwgU3RyaW5nIGNvbnRleHREZXNjcmlwdGlvbiApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBibGFja2xpc3RGaWVsZHMuY29udGFpbnMoIGNvbnRleHREZXNjcmlwdGlvbiApICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgU3RyaW5nIGludGVycG9sYXRlZCA9IGludGVycG9sYXRvci5pbnRlcnBvbGF0ZSggc291cmNlLCBpcyApOwotICAgICAgICAgICAgICAgIGlmICggIXNvdXJjZS5lcXVhbHMoIGludGVycG9sYXRlZCApICYmIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJGaWVsZCAiICsgY29udGV4dERlc2NyaXB0aW9uICsgIiBzb3VyY2U6ICIgKyBzb3VyY2UgKyAiIGludGVycG9sYXRlZCB0bzogIiArIGludGVycG9sYXRlZCApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQ29tcG9uZW50WHBwM1JlYWRlci5Db250ZW50VHJhbnNmb3JtZXIgY29tcG9uZW50SW50ZXJwb2xhdG9yKAotICAgICAgICBmaW5hbCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IsIGZpbmFsIEludGVycG9sYXRpb25TdGF0ZSBpcywgZmluYWwgTG9nZ2VyIGxvZ2dlciApCi0gICAgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKSBmaW5hbCBTZXQ8U3RyaW5nPiBibGFja2xpc3RGaWVsZHMgPQotICAgICAgICAgICAgbmV3IEhhc2hTZXQ8U3RyaW5nPiggRmllbGRCYXNlZE9iamVjdEludGVycG9sYXRvci5ERUZBVUxUX0JMQUNLTElTVEVEX0ZJRUxEX05BTUVTICk7Ci0gICAgICAgIGJsYWNrbGlzdEZpZWxkcy5hZGRBbGwoIElOVEVSUE9MQVRJT05fQkxBQ0tMSVNUICk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRYcHAzUmVhZGVyLkNvbnRlbnRUcmFuc2Zvcm1lcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmb3JtKCBTdHJpbmcgc291cmNlLCBTdHJpbmcgY29udGV4dERlc2NyaXB0aW9uICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIGJsYWNrbGlzdEZpZWxkcy5jb250YWlucyggY29udGV4dERlc2NyaXB0aW9uICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTdHJpbmcgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdG9yLmludGVycG9sYXRlKCBzb3VyY2UsIGlzICk7Ci0gICAgICAgICAgICAgICAgaWYgKCAhc291cmNlLmVxdWFscyggaW50ZXJwb2xhdGVkICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKAotICAgICAgICAgICAgICAgICAgICAgICAgIkZpZWxkICIgKyBjb250ZXh0RGVzY3JpcHRpb24gKyAiIHNvdXJjZTogIiArIHNvdXJjZSArICIgaW50ZXJwb2xhdGVkIHRvOiAiICsgaW50ZXJwb2xhdGVkICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tFcnJvcnMoIEFzc2VtYmx5SWQgYXNzZW1ibHlJZCwgSW50ZXJwb2xhdGlvblN0YXRlIGludGVycG9sYXRpb25TdGF0ZSwgTG9nZ2VyIGxvZ2dlciApCi0gICAgewotICAgICAgICBpZiAoIGludGVycG9sYXRpb25TdGF0ZS5hc0xpc3QoKSAhPSBudWxsICYmIGludGVycG9sYXRpb25TdGF0ZS5hc0xpc3QoKS5zaXplKCkgPiAwICYmIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgICAgIHNiLmFwcGVuZCggIk9uZSBvciBtb3JlIG1pbm9yIGVycm9ycyBvY2N1cnJlZCB3aGlsZSBpbnRlcnBvbGF0aW5nIHRoZSBhc3NlbWJseSB3aXRoIElEOiAiICkuYXBwZW5kKAotICAgICAgICAgICAgICAgIGFzc2VtYmx5SWQgKS5hcHBlbmQoICI6XG4iICk7Ci0KLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCAidW5jaGVja2VkIiApIGZpbmFsIExpc3Q8T2JqZWN0PiB3YXJuaW5ncyA9IGludGVycG9sYXRpb25TdGF0ZS5hc0xpc3QoKTsKLSAgICAgICAgICAgIGZvciAoIGZpbmFsIE9iamVjdCB3YXJuaW5nIDogd2FybmluZ3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNiLmFwcGVuZCggJ1xuJyApLmFwcGVuZCggd2FybmluZyApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzYi5hcHBlbmQoICJcblxuVGhlc2UgdmFsdWVzIHdlcmUgU0tJUFBFRCwgYnV0IHRoZSBhc3NlbWJseSBwcm9jZXNzIHdpbGwgY29udGludWUuXG4iICk7Ci0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1Zyggc2IudG9TdHJpbmcoKSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBmdWxsSW50ZXJwb2xhdG9yKCBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25udWxsIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIHByb2plY3RJcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICB7Ci0gICAgICAgIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yID0KLSAgICAgICAgICAgIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSggY29uZmlnU291cmNlLmdldFJlcG9zaXRvcnlJbnRlcnBvbGF0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnU291cmNlLmdldENvbW1hbmRMaW5lUHJvcHNJbnRlcnBvbGF0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnU291cmNlLmdldEVudkludGVycG9sYXRvcigpLCBwcm9qZWN0SXAgKTsKLSAgICAgICAgcmV0dXJuIGZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLndpdGhQb3N0UHJvY2Vzc29yKAotICAgICAgICAgICAgbmV3IFBhdGhUcmFuc2xhdGluZ1Bvc3RQcm9jZXNzb3IoIHByb2plY3QuZ2V0QmFzZWRpcigpICkgKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGhUcmFuc2xhdGluZ1Bvc3RQcm9jZXNzb3IKLSAgICAgICAgaW1wbGVtZW50cyBJbnRlcnBvbGF0aW9uUG9zdFByb2Nlc3NvcgotICAgIHsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEZpbGUgYmFzZWRpcjsKLQotICAgICAgICBwdWJsaWMgUGF0aFRyYW5zbGF0aW5nUG9zdFByb2Nlc3NvciggZmluYWwgRmlsZSBiYXNlZGlyICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5iYXNlZGlyID0gYmFzZWRpcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZSggZmluYWwgU3RyaW5nIGV4cHJlc3Npb24sIGZpbmFsIE9iamVjdCB2YWx1ZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gU3RyaW5nLnZhbHVlT2YoIHZhbHVlICk7Ci0gICAgICAgICAgICByZXR1cm4gQXNzZW1ibHlGaWxlVXRpbHMubWFrZVBhdGhSZWxhdGl2ZVRvKCBwYXRoLCBiYXNlZGlyICk7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pby9Bc3NlbWJseVJlYWRFeGNlcHRpb24uamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pby9Bc3NlbWJseVJlYWRFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzY0ODFhMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vQXNzZW1ibHlSZWFkRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmlvOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbgotICAgIGV4dGVuZHMgRXhjZXB0aW9uCi17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHB1YmxpYyBBc3NlbWJseVJlYWRFeGNlcHRpb24oIGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UsIGNhdXNlICk7Ci0gICAgfQotCi0gICAgcHVibGljIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiggZmluYWwgU3RyaW5nIG1lc3NhZ2UgKQotICAgIHsKLSAgICAgICAgc3VwZXIoIG1lc3NhZ2UgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pby9Bc3NlbWJseVJlYWRlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2lvL0Fzc2VtYmx5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhODgxMjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2lvL0Fzc2VtYmx5UmVhZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmlvOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQXNzZW1ibHlSZWFkZXIKLXsKLQotICAgIExpc3Q8QXNzZW1ibHk+IHJlYWRBc3NlbWJsaWVzKCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi0gICAgQXNzZW1ibHkgZ2V0QXNzZW1ibHlGb3JEZXNjcmlwdG9yUmVmZXJlbmNlKCBTdHJpbmcgcmVmLCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi0gICAgQXNzZW1ibHkgZ2V0QXNzZW1ibHlGcm9tRGVzY3JpcHRvckZpbGUoIEZpbGUgZmlsZSwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotICAgIHZvaWQgaW5jbHVkZVNpdGVJbkFzc2VtYmx5KCBBc3NlbWJseSBhc3NlbWJseSwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgKQotICAgICAgICB0aHJvd3MgTW9qb0ZhaWx1cmVFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vRGVmYXVsdEFzc2VtYmx5UmVhZGVyLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vRGVmYXVsdEFzc2VtYmx5UmVhZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjZDA4YjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2lvL0RlZmF1bHRBc3NlbWJseVJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTY0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuaW87Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmludGVycG9sYXRpb24uQXNzZW1ibHlFeHByZXNzaW9uRXZhbHVhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Db250YWluZXJEZXNjcmlwdG9ySGFuZGxlckNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVJdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuTW9kdWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuaW8ueHBwMy5Bc3NlbWJseVhwcDNSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuaW8ueHBwMy5Bc3NlbWJseVhwcDNXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuaW8ueHBwMy5Db21wb25lbnRYcHAzUmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnJlc29sdmVkLkFzc2VtYmx5SWQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuSW50ZXJwb2xhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmlvLmxvY2F0aW9uLkNsYXNzcGF0aFJlc291cmNlTG9jYXRvclN0cmF0ZWd5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmlvLmxvY2F0aW9uLkZpbGVMb2NhdG9yU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuaW8ubG9jYXRpb24uTG9jYXRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuaW8ubG9jYXRpb24uTG9jYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5pby5sb2NhdGlvbi5Mb2NhdG9yU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQudXRpbHMuUmVhZGVyRmFjdG9yeTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmludGVycG9sYXRpb24uUHJlZml4QXdhcmVSZWN1cnNpb25JbnRlcmNlcHRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmludGVycG9sYXRpb24uUmVjdXJzaW9uSW50ZXJjZXB0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5JbnRlcnBvbGF0aW9uU3RhdGU7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLlByZWZpeGVkT2JqZWN0VmFsdWVTb3VyY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLlByZWZpeGVkUHJvcGVydGllc1ZhbHVlU291cmNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5BYnN0cmFjdExvZ0VuYWJsZWQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuY29uc29sZS5Db25zb2xlTG9nZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5EaXJlY3RvcnlTY2FubmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5wdWxsLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pbnRlcnBvbGF0aW9uLkFzc2VtYmx5SW50ZXJwb2xhdG9yLmNvbXBvbmVudEludGVycG9sYXRvcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuaW50ZXJwb2xhdGlvbi5Bc3NlbWJseUludGVycG9sYXRvci5hc3NlbWJseUludGVycG9sYXRvcjsKLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuaW50ZXJwb2xhdGlvbi5Bc3NlbWJseUludGVycG9sYXRvci5mdWxsSW50ZXJwb2xhdG9yOwotaW1wb3J0IHN0YXRpYyBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pbnRlcnBvbGF0aW9uLkFzc2VtYmx5SW50ZXJwb2xhdG9yLmNoZWNrRXJyb3JzOwotCi0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1Ab3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnQuYW5ub3RhdGlvbnMuQ29tcG9uZW50KCByb2xlID0gQXNzZW1ibHlSZWFkZXIuY2xhc3MgKQotcHVibGljIGNsYXNzIERlZmF1bHRBc3NlbWJseVJlYWRlcgotICAgIGV4dGVuZHMgQWJzdHJhY3RMb2dFbmFibGVkCi0gICAgaW1wbGVtZW50cyBBc3NlbWJseVJlYWRlcgotewotCi0gICAgcHVibGljIExpc3Q8QXNzZW1ibHk+IHJlYWRBc3NlbWJsaWVzKCBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBMb2NhdG9yIGxvY2F0b3IgPSBuZXcgTG9jYXRvcigpOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TG9jYXRvclN0cmF0ZWd5PiBzdHJhdGVnaWVzID0gbmV3IEFycmF5TGlzdDxMb2NhdG9yU3RyYXRlZ3k+KCk7Ci0gICAgICAgIHN0cmF0ZWdpZXMuYWRkKCBuZXcgUmVsYXRpdmVGaWxlTG9jYXRvclN0cmF0ZWd5KCBjb25maWdTb3VyY2UuZ2V0QmFzZWRpcigpICkgKTsKLSAgICAgICAgc3RyYXRlZ2llcy5hZGQoIG5ldyBGaWxlTG9jYXRvclN0cmF0ZWd5KCkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PExvY2F0b3JTdHJhdGVneT4gcmVmU3RyYXRlZ2llcyA9IG5ldyBBcnJheUxpc3Q8TG9jYXRvclN0cmF0ZWd5PigpOwotICAgICAgICByZWZTdHJhdGVnaWVzLmFkZCggbmV3IFByZWZpeGVkQ2xhc3NwYXRoTG9jYXRvclN0cmF0ZWd5KCAiL2Fzc2VtYmxpZXMvIiApICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBc3NlbWJseT4gYXNzZW1ibGllcyA9IG5ldyBBcnJheUxpc3Q8QXNzZW1ibHk+KCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0b3IgPSBjb25maWdTb3VyY2UuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRvcklkID0gY29uZmlnU291cmNlLmdldERlc2NyaXB0b3JJZCgpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBkZXNjcmlwdG9ycyA9IGNvbmZpZ1NvdXJjZS5nZXREZXNjcmlwdG9ycygpOwotICAgICAgICBmaW5hbCBTdHJpbmdbXSBkZXNjcmlwdG9yUmVmcyA9IGNvbmZpZ1NvdXJjZS5nZXREZXNjcmlwdG9yUmVmZXJlbmNlcygpOwotICAgICAgICBmaW5hbCBGaWxlIGRlc2NyaXB0b3JTb3VyY2VEaXJlY3RvcnkgPSBjb25maWdTb3VyY2UuZ2V0RGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeSgpOwotCi0gICAgICAgIGlmICggZGVzY3JpcHRvciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jYXRvci5zZXRTdHJhdGVnaWVzKCBzdHJhdGVnaWVzICk7Ci0gICAgICAgICAgICBhZGRBc3NlbWJseUZyb21EZXNjcmlwdG9yKCBkZXNjcmlwdG9yLCBsb2NhdG9yLCBjb25maWdTb3VyY2UsIGFzc2VtYmxpZXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZGVzY3JpcHRvcklkICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2NhdG9yLnNldFN0cmF0ZWdpZXMoIHJlZlN0cmF0ZWdpZXMgKTsKLSAgICAgICAgICAgIGFkZEFzc2VtYmx5Rm9yRGVzY3JpcHRvclJlZmVyZW5jZSggZGVzY3JpcHRvcklkLCBjb25maWdTb3VyY2UsIGFzc2VtYmxpZXMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKCBkZXNjcmlwdG9ycyAhPSBudWxsICkgJiYgKCBkZXNjcmlwdG9ycy5sZW5ndGggPiAwICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2NhdG9yLnNldFN0cmF0ZWdpZXMoIHN0cmF0ZWdpZXMgKTsKLSAgICAgICAgICAgIGZvciAoIFN0cmluZyBkZXNjcmlwdG9yMSA6IGRlc2NyaXB0b3JzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCAiUmVhZGluZyBhc3NlbWJseSBkZXNjcmlwdG9yOiAiICsgZGVzY3JpcHRvcjEgKTsKLSAgICAgICAgICAgICAgICBhZGRBc3NlbWJseUZyb21EZXNjcmlwdG9yKCBkZXNjcmlwdG9yMSwgbG9jYXRvciwgY29uZmlnU291cmNlLCBhc3NlbWJsaWVzICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICggZGVzY3JpcHRvclJlZnMgIT0gbnVsbCApICYmICggZGVzY3JpcHRvclJlZnMubGVuZ3RoID4gMCApICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jYXRvci5zZXRTdHJhdGVnaWVzKCByZWZTdHJhdGVnaWVzICk7Ci0gICAgICAgICAgICBmb3IgKCBTdHJpbmcgZGVzY3JpcHRvclJlZiA6IGRlc2NyaXB0b3JSZWZzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhZGRBc3NlbWJseUZvckRlc2NyaXB0b3JSZWZlcmVuY2UoIGRlc2NyaXB0b3JSZWYsIGNvbmZpZ1NvdXJjZSwgYXNzZW1ibGllcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoIGRlc2NyaXB0b3JTb3VyY2VEaXJlY3RvcnkgIT0gbnVsbCApICYmIGRlc2NyaXB0b3JTb3VyY2VEaXJlY3RvcnkuaXNEaXJlY3RvcnkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvY2F0b3Iuc2V0U3RyYXRlZ2llcygKLSAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCBuZXcgUmVsYXRpdmVGaWxlTG9jYXRvclN0cmF0ZWd5KCBkZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5ICkgKSApOwotCi0gICAgICAgICAgICBmaW5hbCBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKCBkZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICBzY2FubmVyLnNldEluY2x1ZGVzKCBuZXcgU3RyaW5nW117ICIqKi8qLnhtbCIgfSApOwotICAgICAgICAgICAgc2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZXMoKTsKLQotICAgICAgICAgICAgc2Nhbm5lci5zY2FuKCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhdGhzID0gc2Nhbm5lci5nZXRJbmNsdWRlZEZpbGVzKCk7Ci0KLSAgICAgICAgICAgIGZvciAoIFN0cmluZyBwYXRoIDogcGF0aHMgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZEFzc2VtYmx5RnJvbURlc2NyaXB0b3IoIHBhdGgsIGxvY2F0b3IsIGNvbmZpZ1NvdXJjZSwgYXNzZW1ibGllcyApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBhc3NlbWJsaWVzLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggY29uZmlnU291cmNlLmlzSWdub3JlTWlzc2luZ0Rlc2NyaXB0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgICAgICJJZ25vcmluZyBtaXNzaW5nIGFzc2VtYmx5IGRlc2NyaXB0b3JzIHBlciBjb25maWd1cmF0aW9uLiBTZWUgbWVzc2FnZXMgYWJvdmUgZm9yIHNwZWNpZmljcy4iICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiggIk5vIGFzc2VtYmx5IGRlc2NyaXB0b3JzIGZvdW5kLiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNoZWNrIHVuaXF1ZSBJRHMKLSAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gaWRzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgICBmb3IgKCBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA6IGFzc2VtYmxpZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoICFpZHMuYWRkKCBhc3NlbWJseS5nZXRJZCgpICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZ2dlcigpLndhcm4oICJUaGUgYXNzZW1ibHkgaWQgIiArIGFzc2VtYmx5LmdldElkKCkgKyAiIGlzIHVzZWQgbW9yZSB0aGFuIG9uY2UuIiApOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFzc2VtYmxpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEFzc2VtYmx5IGdldEFzc2VtYmx5Rm9yRGVzY3JpcHRvclJlZmVyZW5jZSggZmluYWwgU3RyaW5nIHJlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gYWRkQXNzZW1ibHlGb3JEZXNjcmlwdG9yUmVmZXJlbmNlKCByZWYsIGNvbmZpZ1NvdXJjZSwgbmV3IEFycmF5TGlzdDxBc3NlbWJseT4oIDEgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyBBc3NlbWJseSBnZXRBc3NlbWJseUZyb21EZXNjcmlwdG9yRmlsZSggZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICByZXR1cm4gYWRkQXNzZW1ibHlGcm9tRGVzY3JpcHRvckZpbGUoIGZpbGUsIGNvbmZpZ1NvdXJjZSwgbmV3IEFycmF5TGlzdDxBc3NlbWJseT4oIDEgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgQXNzZW1ibHkgYWRkQXNzZW1ibHlGb3JEZXNjcmlwdG9yUmVmZXJlbmNlKCBmaW5hbCBTdHJpbmcgcmVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBc3NlbWJseT4gYXNzZW1ibGllcyApCi0gICAgICAgIHRocm93cyBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSByZXNvdXJjZUFzU3RyZWFtID0KLSAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSggImFzc2VtYmxpZXMvIiArIHJlZiArICIueG1sIiApOwotCi0gICAgICAgIGlmICggcmVzb3VyY2VBc1N0cmVhbSA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBjb25maWdTb3VyY2UuaXNJZ25vcmVNaXNzaW5nRGVzY3JpcHRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIklnbm9yaW5nIG1pc3NpbmcgYXNzZW1ibHkgZGVzY3JpcHRvciB3aXRoIElEICciICsgcmVmICsgIicgcGVyIGNvbmZpZ3VyYXRpb24uIiApOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlbWJseVJlYWRFeGNlcHRpb24oICJEZXNjcmlwdG9yIHdpdGggSUQgJyIgKyByZWYgKyAiJyBub3QgZm91bmQiICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlciA9IFJlYWRlckZhY3RvcnkubmV3WG1sUmVhZGVyKCByZXNvdXJjZUFzU3RyZWFtICk7Ci0gICAgICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IHJlYWRBc3NlbWJseSggcmVhZGVyLCByZWYsIG51bGwsIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgICAgICBhc3NlbWJsaWVzLmFkZCggYXNzZW1ibHkgKTsKLSAgICAgICAgICAgIHJldHVybiBhc3NlbWJseTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIElPRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXNzZW1ibHlSZWFkRXhjZXB0aW9uKCAiUHJvYmxlbSB3aXRoIGRlc2NyaXB0b3Igd2l0aCBJRCAnIiArIHJlZiArICInIiwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgSU9VdGlscy5jbG9zZVF1aWV0bHkoIHJlYWRlciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBc3NlbWJseSBhZGRBc3NlbWJseUZyb21EZXNjcmlwdG9yRmlsZSggZmluYWwgRmlsZSBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QXNzZW1ibHk+IGFzc2VtYmxpZXMgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCAhZGVzY3JpcHRvci5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggY29uZmlnU291cmNlLmlzSWdub3JlTWlzc2luZ0Rlc2NyaXB0b3IoKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoICJJZ25vcmluZyBtaXNzaW5nIGFzc2VtYmx5IGRlc2NyaXB0b3I6ICciICsgZGVzY3JpcHRvciArICInIHBlciBjb25maWd1cmF0aW9uLiIgKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZW1ibHlSZWFkRXhjZXB0aW9uKCAiRGVzY3JpcHRvcjogJyIgKyBkZXNjcmlwdG9yICsgIicgbm90IGZvdW5kIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUmVhZGVyIHIgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgciA9IFJlYWRlckZhY3RvcnkubmV3WG1sUmVhZGVyKCBkZXNjcmlwdG9yICk7Ci0gICAgICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9Ci0gICAgICAgICAgICAgICAgcmVhZEFzc2VtYmx5KCByLCBkZXNjcmlwdG9yLmdldEFic29sdXRlUGF0aCgpLCBkZXNjcmlwdG9yLmdldFBhcmVudEZpbGUoKSwgY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgICAgIGFzc2VtYmxpZXMuYWRkKCBhc3NlbWJseSApOwotCi0gICAgICAgICAgICByZXR1cm4gYXNzZW1ibHk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiggIkVycm9yIHJlYWRpbmcgYXNzZW1ibHkgZGVzY3JpcHRvcjogIiArIGRlc2NyaXB0b3IsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jbG9zZSggciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBc3NlbWJseSBhZGRBc3NlbWJseUZyb21EZXNjcmlwdG9yKCBmaW5hbCBTdHJpbmcgc3BlYywgZmluYWwgTG9jYXRvciBsb2NhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEFzc2VtYmx5PiBhc3NlbWJsaWVzICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIExvY2F0aW9uIGxvY2F0aW9uID0gbG9jYXRvci5yZXNvbHZlKCBzcGVjICk7Ci0KLSAgICAgICAgaWYgKCBsb2NhdGlvbiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBjb25maWdTb3VyY2UuaXNJZ25vcmVNaXNzaW5nRGVzY3JpcHRvcigpICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXRMb2dnZXIoKS5kZWJ1ZyggIklnbm9yaW5nIG1pc3NpbmcgYXNzZW1ibHkgZGVzY3JpcHRvciB3aXRoIElEICciICsgc3BlYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiJyBwZXIgY29uZmlndXJhdGlvbi5cbkxvY2F0b3Igb3V0cHV0IHdhczpcblxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBsb2NhdG9yLmdldE1lc3NhZ2VIb2xkZXIoKS5yZW5kZXIoKSApOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlbWJseVJlYWRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJFcnJvciBsb2NhdGluZyBhc3NlbWJseSBkZXNjcmlwdG9yOiAiICsgc3BlYyArICJcblxuIiArIGxvY2F0b3IuZ2V0TWVzc2FnZUhvbGRlcigpLnJlbmRlcigpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBSZWFkZXIgciA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICByID0gUmVhZGVyRmFjdG9yeS5uZXdYbWxSZWFkZXIoIGxvY2F0aW9uLmdldElucHV0U3RyZWFtKCkgKTsKLQotICAgICAgICAgICAgRmlsZSBkaXIgPSBudWxsOwotICAgICAgICAgICAgaWYgKCBsb2NhdGlvbi5nZXRGaWxlKCkgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGlyID0gbG9jYXRpb24uZ2V0RmlsZSgpLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSByZWFkQXNzZW1ibHkoIHIsIHNwZWMsIGRpciwgY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgICAgIGFzc2VtYmxpZXMuYWRkKCBhc3NlbWJseSApOwotCi0gICAgICAgICAgICByZXR1cm4gYXNzZW1ibHk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiggIkVycm9yIHJlYWRpbmcgYXNzZW1ibHkgZGVzY3JpcHRvcjogIiArIHNwZWMsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jbG9zZSggciApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXNzZW1ibHkgcmVhZEFzc2VtYmx5KCBmaW5hbCBSZWFkZXIgcmVhZGVyLCBmaW5hbCBTdHJpbmcgbG9jYXRpb25EZXNjcmlwdGlvbiwgZmluYWwgRmlsZSBhc3NlbWJseURpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBBc3NlbWJseSBhc3NlbWJseTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIEludGVycG9sYXRpb25TdGF0ZSBpcyA9IG5ldyBJbnRlcnBvbGF0aW9uU3RhdGUoKTsKLSAgICAgICAgICAgIGZpbmFsIFJlY3Vyc2lvbkludGVyY2VwdG9yIGludGVyY2VwdG9yID0KLSAgICAgICAgICAgICAgICBuZXcgUHJlZml4QXdhcmVSZWN1cnNpb25JbnRlcmNlcHRvciggSW50ZXJwb2xhdGlvbkNvbnN0YW50cy5QUk9KRUNUX1BSRUZJWEVTLCB0cnVlICk7Ci0gICAgICAgICAgICBpcy5zZXRSZWN1cnNpb25JbnRlcmNlcHRvciggaW50ZXJjZXB0b3IgKTsKLQotICAgICAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgaW50ZXJwb2xhdG9yID0KLSAgICAgICAgICAgICAgICBmdWxsSW50ZXJwb2xhdG9yKCBwcm9qZWN0LCBjcmVhdGVQcm9qZWN0SW50ZXJwb2xhdG9yKCBwcm9qZWN0ICksIGNvbmZpZ1NvdXJjZSApOwotICAgICAgICAgICAgQXNzZW1ibHlYcHAzUmVhZGVyLkNvbnRlbnRUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IGFzc2VtYmx5SW50ZXJwb2xhdG9yKCBpbnRlcnBvbGF0b3IsIGlzLCBnZXRMb2dnZXIoKSApOwotCi0gICAgICAgICAgICBmaW5hbCBBc3NlbWJseVhwcDNSZWFkZXIgciA9IG5ldyBBc3NlbWJseVhwcDNSZWFkZXIoIHRyYW5zZm9ybWVyICk7Ci0gICAgICAgICAgICBhc3NlbWJseSA9IHIucmVhZCggcmVhZGVyICk7Ci0KLSAgICAgICAgICAgIENvbXBvbmVudFhwcDNSZWFkZXIuQ29udGVudFRyYW5zZm9ybWVyIGN0cmFucyA9IGNvbXBvbmVudEludGVycG9sYXRvciggaW50ZXJwb2xhdG9yLCBpcywgZ2V0TG9nZ2VyKCkgKTsKLSAgICAgICAgICAgIG1lcmdlQ29tcG9uZW50c1dpdGhNYWluQXNzZW1ibHkoIGFzc2VtYmx5LCBhc3NlbWJseURpciwgY29uZmlnU291cmNlLCBjdHJhbnMgKTsKLSAgICAgICAgICAgIGRlYnVnUHJpbnRBc3NlbWJseSggIkFmdGVyIGFzc2VtYmx5IGlzIGludGVycG9sYXRlZDoiLCBhc3NlbWJseSApOwotCi0gICAgICAgICAgICBjaGVja0Vycm9ycyggQXNzZW1ibHlJZC5jcmVhdGVBc3NlbWJseUlkKCBhc3NlbWJseSApLCBpcywgZ2V0TG9nZ2VyKCkgKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSU9FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlbWJseVJlYWRFeGNlcHRpb24oICJFcnJvciByZWFkaW5nIGRlc2NyaXB0b3I6ICIgKyBsb2NhdGlvbkRlc2NyaXB0aW9uICsgIjogIiArIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiggIkVycm9yIHJlYWRpbmcgZGVzY3JpcHRvcjogIiArIGxvY2F0aW9uRGVzY3JpcHRpb24gKyAiOiAiICsgZS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHJlYWRlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBjb25maWdTb3VyY2UuaXNTaXRlSW5jbHVkZWQoKSB8fCBhc3NlbWJseS5pc0luY2x1ZGVTaXRlRGlyZWN0b3J5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmNsdWRlU2l0ZUluQXNzZW1ibHkoIGFzc2VtYmx5LCBjb25maWdTb3VyY2UgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBhc3NlbWJseTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBzdGF0aWMgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgY3JlYXRlUHJvamVjdEludGVycG9sYXRvciggTWF2ZW5Qcm9qZWN0IHByb2plY3QgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSgKLSAgICAgICAgICAgIG5ldyBQcmVmaXhlZFByb3BlcnRpZXNWYWx1ZVNvdXJjZSggSW50ZXJwb2xhdGlvbkNvbnN0YW50cy5QUk9KRUNUX1BST1BFUlRJRVNfUFJFRklYRVMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0UHJvcGVydGllcygpLCB0cnVlICksCi0gICAgICAgICAgICBuZXcgUHJlZml4ZWRPYmplY3RWYWx1ZVNvdXJjZSggSW50ZXJwb2xhdGlvbkNvbnN0YW50cy5QUk9KRUNUX1BSRUZJWEVTLCBwcm9qZWN0LCB0cnVlICkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGVidWdQcmludEFzc2VtYmx5KCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHNXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXcgQXNzZW1ibHlYcHAzV3JpdGVyKCkud3JpdGUoIHNXcml0ZXIsIGFzc2VtYmx5ICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZGVidWcoCi0gICAgICAgICAgICAgICAgIkZhaWxlZCB0byBwcmludCBkZWJ1ZyBtZXNzYWdlIHdpdGggYXNzZW1ibHkgZGVzY3JpcHRvciBsaXN0aW5nLCBhbmQgbWVzc2FnZTogIiArIG1lc3NhZ2UsIGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldExvZ2dlcigpLmRlYnVnKCBtZXNzYWdlICsgIlxuXG4iICsgc1dyaXRlci50b1N0cmluZygpICsgIlxuXG4iICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHRoZSBjb250ZW50cyBvZiBhbGwgaW5jbHVkZWQgY29tcG9uZW50cyB0byBtYWluIGFzc2VtYmx5Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXNzZW1ibHkgICAgVGhlIGFzc2VtYmx5Ci0gICAgICogQHBhcmFtIGFzc2VtYmx5RGlyIFRoZSBhc3NlbWJseSBkaXJlY3RvcnkKLSAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgVGhlIGNvbXBvbmVudCBpbnRlcnBvbGF0b3IKLSAgICAgKiBAdGhyb3dzIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiAuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VDb21wb25lbnRzV2l0aE1haW5Bc3NlbWJseSggZmluYWwgQXNzZW1ibHkgYXNzZW1ibHksIGZpbmFsIEZpbGUgYXNzZW1ibHlEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50WHBwM1JlYWRlci5Db250ZW50VHJhbnNmb3JtZXIgdHJhbnNmb3JtZXIgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlSZWFkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBMb2NhdG9yIGxvY2F0b3IgPSBuZXcgTG9jYXRvcigpOwotCi0gICAgICAgIGlmICggYXNzZW1ibHlEaXIgIT0gbnVsbCAmJiBhc3NlbWJseURpci5leGlzdHMoKSAmJiBhc3NlbWJseURpci5pc0RpcmVjdG9yeSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9jYXRvci5hZGRTdHJhdGVneSggbmV3IFJlbGF0aXZlRmlsZUxvY2F0b3JTdHJhdGVneSggYXNzZW1ibHlEaXIgKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gYWxsb3cgYWJzb2x1dGUgcGF0aHMgaW4gY29tcG9uZW50RGVzY3JpcHRvci4uLiBNQVNTRU1CTFktNDg2Ci0gICAgICAgIGxvY2F0b3IuYWRkU3RyYXRlZ3koIG5ldyBSZWxhdGl2ZUZpbGVMb2NhdG9yU3RyYXRlZ3koIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkgKSApOwotICAgICAgICBsb2NhdG9yLmFkZFN0cmF0ZWd5KCBuZXcgRmlsZUxvY2F0b3JTdHJhdGVneSgpICk7Ci0gICAgICAgIGxvY2F0b3IuYWRkU3RyYXRlZ3koIG5ldyBDbGFzc3BhdGhSZXNvdXJjZUxvY2F0b3JTdHJhdGVneSgpICk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibHlFeHByZXNzaW9uRXZhbHVhdG9yIGFlZSA9IG5ldyBBc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IoIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjb21wb25lbnRMb2NhdGlvbnMgPSBhc3NlbWJseS5nZXRDb21wb25lbnREZXNjcmlwdG9ycygpOwotCi0gICAgICAgIGZvciAoIFN0cmluZyBsb2NhdGlvbiA6IGNvbXBvbmVudExvY2F0aW9ucyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGFsbG93IGV4cHJlc3Npb25zIGluIHBhdGggdG8gY29tcG9uZW50IGRlc2NyaXB0b3IuLi4gTUFTU0VNQkxZLTQ4NgotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9jYXRpb24gPSBhZWUuZXZhbHVhdGUoIGxvY2F0aW9uICkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgRXhjZXB0aW9uIGVlZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZ2V0TG9nZ2VyKCkuZXJyb3IoICJFcnJvciBpbnRlcnBvbGF0aW5nIGNvbXBvbmVudERlc2NyaXB0b3I6ICIgKyBsb2NhdGlvbiwgZWVlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbmFsIExvY2F0aW9uIHJlc29sdmVkTG9jYXRpb24gPSBsb2NhdG9yLnJlc29sdmUoIGxvY2F0aW9uICk7Ci0KLSAgICAgICAgICAgIGlmICggcmVzb2x2ZWRMb2NhdGlvbiA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZW1ibHlSZWFkRXhjZXB0aW9uKCAiRmFpbGVkIHRvIGxvY2F0ZSBjb21wb25lbnQgZGVzY3JpcHRvcjogIiArIGxvY2F0aW9uICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENvbXBvbmVudCBjb21wb25lbnQgPSBudWxsOwotICAgICAgICAgICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIHJlc29sdmVkTG9jYXRpb24uZ2V0SW5wdXRTdHJlYW0oKSApOwotICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnRYcHAzUmVhZGVyKCB0cmFuc2Zvcm1lciApLnJlYWQoIHJlYWRlciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZW1ibHlSZWFkRXhjZXB0aW9uKCAiRXJyb3IgcmVhZGluZyBjb21wb25lbnQgZGVzY3JpcHRvcjogIiArIGxvY2F0aW9uICsgIiAocmVzb2x2ZWQgdG86ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByZXNvbHZlZExvY2F0aW9uLmdldFNwZWNpZmljYXRpb24oKSArICIpIiwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlbWJseVJlYWRFeGNlcHRpb24oICJFcnJvciByZWFkaW5nIGNvbXBvbmVudCBkZXNjcmlwdG9yOiAiICsgbG9jYXRpb24gKyAiIChyZXNvbHZlZCB0bzogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHJlc29sdmVkTG9jYXRpb24uZ2V0U3BlY2lmaWNhdGlvbigpICsgIikiLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbGx5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSU9VdGlsLmNsb3NlKCByZWFkZXIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbWVyZ2VDb21wb25lbnRXaXRoQXNzZW1ibHkoIGNvbXBvbmVudCwgYXNzZW1ibHkgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCB0aGUgY29udGVudCBvZiBhIHNpbmdsZSBDb21wb25lbnQgdG8gbWFpbiBhc3NlbWJseQotICAgICAqCi0gICAgICogQHBhcmFtIGNvbXBvbmVudCBUaGUgY29tcG9uZW50Ci0gICAgICogQHBhcmFtIGFzc2VtYmx5ICBUaGUgYXNzZW1ibHkKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtZXJnZUNvbXBvbmVudFdpdGhBc3NlbWJseSggZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudCwgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgKQotICAgIHsKLSAgICAgICAgZmluYWwgTGlzdDxDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlckNvbmZpZz4gY29udGFpbmVySGFuZGxlckRlc2NyaXB0b3JzID0KLSAgICAgICAgICAgIGNvbXBvbmVudC5nZXRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnMoKTsKLQotICAgICAgICBmb3IgKCBmaW5hbCBDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlckNvbmZpZyBjZmcgOiBjb250YWluZXJIYW5kbGVyRGVzY3JpcHRvcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlbWJseS5hZGRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlciggY2ZnICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PERlcGVuZGVuY3lTZXQ+IGRlcGVuZGVuY3lTZXRMaXN0ID0gY29tcG9uZW50LmdldERlcGVuZGVuY3lTZXRzKCk7Ci0KLSAgICAgICAgZm9yICggZmluYWwgRGVwZW5kZW5jeVNldCBkZXBlbmRlbmN5U2V0IDogZGVwZW5kZW5jeVNldExpc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlbWJseS5hZGREZXBlbmRlbmN5U2V0KCBkZXBlbmRlbmN5U2V0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRMaXN0ID0gY29tcG9uZW50LmdldEZpbGVTZXRzKCk7Ci0KLSAgICAgICAgZm9yICggZmluYWwgRmlsZVNldCBmaWxlU2V0IDogZmlsZVNldExpc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlbWJseS5hZGRGaWxlU2V0KCBmaWxlU2V0ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PEZpbGVJdGVtPiBmaWxlTGlzdCA9IGNvbXBvbmVudC5nZXRGaWxlcygpOwotCi0gICAgICAgIGZvciAoIGZpbmFsIEZpbGVJdGVtIGZpbGVJdGVtIDogZmlsZUxpc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlbWJseS5hZGRGaWxlKCBmaWxlSXRlbSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTGlzdDxSZXBvc2l0b3J5PiByZXBvc2l0b3JpZXNMaXN0ID0gY29tcG9uZW50LmdldFJlcG9zaXRvcmllcygpOwotCi0gICAgICAgIGZvciAoIGZpbmFsIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA6IHJlcG9zaXRvcmllc0xpc3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlbWJseS5hZGRSZXBvc2l0b3J5KCByZXBvc2l0b3J5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBMaXN0PE1vZHVsZVNldD4gbW9kdWxlU2V0cyA9IGNvbXBvbmVudC5nZXRNb2R1bGVTZXRzKCk7Ci0gICAgICAgIGZvciAoIGZpbmFsIE1vZHVsZVNldCBtb2R1bGVTZXQgOiBtb2R1bGVTZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZW1ibHkuYWRkTW9kdWxlU2V0KCBtb2R1bGVTZXQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGluY2x1ZGVTaXRlSW5Bc3NlbWJseSggZmluYWwgQXNzZW1ibHkgYXNzZW1ibHksIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIHNpdGVEaXJlY3RvcnkgPSBjb25maWdTb3VyY2UuZ2V0U2l0ZURpcmVjdG9yeSgpOwotCi0gICAgICAgIGlmICggIXNpdGVEaXJlY3RvcnkuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgInNpdGUgZGlkIG5vdCBleGlzdCBpbiB0aGUgdGFyZ2V0IGRpcmVjdG9yeSAtIHBsZWFzZSBydW4gc2l0ZTpzaXRlIGJlZm9yZSBjcmVhdGluZyB0aGUgYXNzZW1ibHkiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRMb2dnZXIoKS5pbmZvKCAiQWRkaW5nIHNpdGUgZGlyZWN0b3J5IHRvIGFzc2VtYmx5IDogIiArIHNpdGVEaXJlY3RvcnkgKTsKLQotICAgICAgICBmaW5hbCBGaWxlU2V0IHNpdGVGaWxlU2V0ID0gbmV3IEZpbGVTZXQoKTsKLQotICAgICAgICBzaXRlRmlsZVNldC5zZXREaXJlY3RvcnkoIHNpdGVEaXJlY3RvcnkuZ2V0UGF0aCgpICk7Ci0KLSAgICAgICAgc2l0ZUZpbGVTZXQuc2V0T3V0cHV0RGlyZWN0b3J5KCAiL3NpdGUiICk7Ci0KLSAgICAgICAgYXNzZW1ibHkuYWRkRmlsZVNldCggc2l0ZUZpbGVTZXQgKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgTG9nZ2VyIGdldExvZ2dlcigpCi0gICAgewotICAgICAgICBMb2dnZXIgbG9nZ2VyID0gc3VwZXIuZ2V0TG9nZ2VyKCk7Ci0KLSAgICAgICAgaWYgKCBsb2dnZXIgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlciA9IG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfSU5GTywgImFzc2VtYmx5UmVhZGVyLWludGVybmFsIiApOwotICAgICAgICAgICAgZW5hYmxlTG9nZ2luZyggbG9nZ2VyICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbG9nZ2VyOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2lvL1ByZWZpeGVkQ2xhc3NwYXRoTG9jYXRvclN0cmF0ZWd5LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vUHJlZml4ZWRDbGFzc3BhdGhMb2NhdG9yU3RyYXRlZ3kuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg3MDE3MC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vUHJlZml4ZWRDbGFzc3BhdGhMb2NhdG9yU3RyYXRlZ3kuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuaW87Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5pby5sb2NhdGlvbi5DbGFzc3BhdGhSZXNvdXJjZUxvY2F0b3JTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5pby5sb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5pby5sb2dnaW5nLk1lc3NhZ2VIb2xkZXI7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1jbGFzcyBQcmVmaXhlZENsYXNzcGF0aExvY2F0b3JTdHJhdGVneQotICAgIGV4dGVuZHMgQ2xhc3NwYXRoUmVzb3VyY2VMb2NhdG9yU3RyYXRlZ3kKLXsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKLQotICAgIHB1YmxpYyBQcmVmaXhlZENsYXNzcGF0aExvY2F0b3JTdHJhdGVneSggU3RyaW5nIHByZWZpeCApCi0gICAgewotICAgICAgICB0aGlzLnByZWZpeCA9IGZvcm1hdFByZWZpeCggcHJlZml4ICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZm9ybWF0UHJlZml4KCBTdHJpbmcgcHJlZml4ICkKLSAgICB7Ci0gICAgICAgIGlmICggcHJlZml4LnN0YXJ0c1dpdGgoICIvIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ID0gcHJlZml4LnN1YnN0cmluZyggMSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBwcmVmaXgubGVuZ3RoKCkgPiAwICYmICFwcmVmaXguZW5kc1dpdGgoICIvIiApICkKLSAgICAgICAgewotICAgICAgICAgICAgcHJlZml4ICs9ICIvIjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBwcmVmaXg7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIHJlc29sdmUoIFN0cmluZyBsb2NhdGlvblNwZWNpZmljYXRpb24sIE1lc3NhZ2VIb2xkZXIgbWVzc2FnZUhvbGRlciApCi0gICAgewotICAgICAgICBTdHJpbmcgc3BlYyA9IGZvcm1hdExvY2F0aW9uKCBsb2NhdGlvblNwZWNpZmljYXRpb24gKTsKLQotICAgICAgICByZXR1cm4gc3VwZXIucmVzb2x2ZSggc3BlYywgbWVzc2FnZUhvbGRlciApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIGZvcm1hdExvY2F0aW9uKCBTdHJpbmcgbG9jYXRpb24gKQotICAgIHsKLSAgICAgICAgaWYgKCBsb2NhdGlvbi5zdGFydHNXaXRoKCAiLyIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb24uc3Vic3RyaW5nKCAxICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcHJlZml4ICsgbG9jYXRpb247Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vUmVsYXRpdmVGaWxlTG9jYXRvclN0cmF0ZWd5LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vUmVsYXRpdmVGaWxlTG9jYXRvclN0cmF0ZWd5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MzBkNGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2lvL1JlbGF0aXZlRmlsZUxvY2F0b3JTdHJhdGVneS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pbzsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmlvLmxvY2F0aW9uLkZpbGVMb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5pby5sb2NhdGlvbi5Mb2NhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5pby5sb2NhdGlvbi5Mb2NhdG9yU3RyYXRlZ3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuaW8ubG9nZ2luZy5NZXNzYWdlSG9sZGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotY2xhc3MgUmVsYXRpdmVGaWxlTG9jYXRvclN0cmF0ZWd5Ci0gICAgaW1wbGVtZW50cyBMb2NhdG9yU3RyYXRlZ3kKLXsKLQotICAgIHByaXZhdGUgZmluYWwgRmlsZSBiYXNlZGlyOwotCi0gICAgcHVibGljIFJlbGF0aXZlRmlsZUxvY2F0b3JTdHJhdGVneSggRmlsZSBiYXNlZGlyICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZWRpciA9IGJhc2VkaXI7Ci0gICAgfQotCi0gICAgcHVibGljIExvY2F0aW9uIHJlc29sdmUoIFN0cmluZyBsb2NhdGlvblNwZWNpZmljYXRpb24sIE1lc3NhZ2VIb2xkZXIgbWVzc2FnZUhvbGRlciApCi0gICAgewotICAgICAgICBGaWxlIGZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgbG9jYXRpb25TcGVjaWZpY2F0aW9uICk7Ci0gICAgICAgIG1lc3NhZ2VIb2xkZXIuYWRkSW5mb01lc3NhZ2UoICJTZWFyY2hpbmcgZm9yIGZpbGUgbG9jYXRpb246ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0KLSAgICAgICAgTG9jYXRpb24gbG9jYXRpb24gPSBudWxsOwotCi0gICAgICAgIGlmICggZmlsZS5leGlzdHMoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IEZpbGVMb2NhdGlvbiggZmlsZSwgbG9jYXRpb25TcGVjaWZpY2F0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlSG9sZGVyLmFkZE1lc3NhZ2UoICJGaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSArICIgZG9lcyBub3QgZXhpc3QuIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGxvY2F0aW9uOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vZGVsL0Fzc2VtYmxpZXMuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9tb2RlbC9Bc3NlbWJsaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0YTVmNDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vZGVsL0Fzc2VtYmxpZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWw7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZ1bmN0aW9ucy5Nb2R1bGVTZXRDb25zdW1lcjsKLQotLyoqCi0gKiAKLSAqLwotcHVibGljIGNsYXNzIEFzc2VtYmxpZXMKLXsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBmb3JFYWNoTW9kdWxlU2V0KCBBc3NlbWJseSBhc3NlbWJseSwgTW9kdWxlU2V0Q29uc3VtZXIgbW9kdWxlU2V0Q29uc3VtZXIgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotICAgICAgICBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZm9yICggTW9kdWxlU2V0IHJlc29sdmVkTW9kdWxlU2V0IDogYXNzZW1ibHkuZ2V0TW9kdWxlU2V0cygpICkKLSAgICAgICAgewotICAgICAgICAgICAgbW9kdWxlU2V0Q29uc3VtZXIuYWNjZXB0KCByZXNvbHZlZE1vZHVsZVNldCApOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL0Fic3RyYWN0QXNzZW1ibHlNb2pvLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvQWJzdHJhY3RBc3NlbWJseU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5MzljMC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvQWJzdHJhY3RBc3NlbWJseU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMjYgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2pvczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uZXhlY3V0aW9uLk1hdmVuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXNzZW1ibHlBcmNoaXZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmlvLkFzc2VtYmx5UmVhZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pby5Bc3NlbWJseVJlYWRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5Bc3NlbWJseUZvcm1hdFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkludGVycG9sYXRpb25Db25zdGFudHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5maWx0ZXJpbmcuTWF2ZW5SZWFkZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQudXRpbHMuY2xpLkNvbW1hbmRMaW5lVXRpbHM7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb25maWd1cmF0aW9uLlBsZXh1c0NvbmZpZ3VyYXRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5QcmVmaXhlZFByb3BlcnRpZXNWYWx1ZVNvdXJjZTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmludGVycG9sYXRpb24uZml4ZWQuUHJvcGVydGllc0Jhc2VkVmFsdWVTb3VyY2U7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpicmV0dEBhcGFjaGUub3JnIj5CcmV0dCBQb3J0ZXI8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp2aW5jZW50LnNpdmV0b25AZ21haWwuY29tIj5WaW5jZW50IFNpdmV0b248L2E+Ci0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAdGhyZWFkU2FmZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RBc3NlbWJseU1vam8KLSAgICBleHRlbmRzIEFic3RyYWN0TW9qbwotICAgIGltcGxlbWVudHMgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZQotewotICAgIC8qKgotICAgICAqIFRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2NoZW1lIHRvIGJlIGFwcGxpZWQgd2hlbiBmaWx0ZXJpbmcgcmVzb3VyY2VzLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImVuY29kaW5nIiwgZGVmYXVsdFZhbHVlID0gIiR7cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZ30iICkKLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKLQotICAgIC8qKgotICAgICAqIEV4cHJlc3Npb25zIHByZWNlZGVkIHdpdGggdGhpcyBTdHJpbmcgd29uJ3QgYmUgaW50ZXJwb2xhdGVkLgotICAgICAqIElmIHlvdSB1c2UgIlwiIGFzIHRoZSBlc2NhcGUgc3RyaW5nIHRoZW4gXCR7Zm9vfSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggJHtmb299LgotICAgICAqCi0gICAgICogQHNpbmNlIDIuNAotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImFzc2VtYmx5LmVzY2FwZVN0cmluZyIgKQotICAgIHByaXZhdGUgU3RyaW5nIGVzY2FwZVN0cmluZzsKLQotICAgIC8qKgotICAgICAqIEZsYWcgYWxsb3dpbmcgb25lIG9yIG1vcmUgZXhlY3V0aW9ucyBvZiB0aGUgYXNzZW1ibHkgcGx1Z2luIHRvIGJlIGNvbmZpZ3VyZWQgYXMgc2tpcHBlZCBmb3IgYSBwYXJ0aWN1bGFyIGJ1aWxkLgotICAgICAqIFRoaXMgbWFrZXMgdGhlIGFzc2VtYmx5IHBsdWdpbiBtb3JlIGNvbnRyb2xsYWJsZSBmcm9tIHByb2ZpbGVzLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImFzc2VtYmx5LnNraXBBc3NlbWJseSIsIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIgKQotICAgIHByaXZhdGUgYm9vbGVhbiBza2lwQXNzZW1ibHk7Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCBldmVyeXRoaW5nIHVwIHRvIHRoZSBjYWxsIHRvIEFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUoKSB3aWxsIGJlIGV4ZWN1dGVkLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImFzc2VtYmx5LmRyeVJ1biIsIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIgKQotICAgIHByaXZhdGUgYm9vbGVhbiBkcnlSdW47Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgIi5kaXIiIHN1ZmZpeCB3aWxsIGJlIHN1cHByZXNzZWQgaW4gdGhlIG91dHB1dCBkaXJlY3RvcnkgbmFtZSB3aGVuIHVzaW5nIGFzc2VtYmx5L2Zvcm1hdAotICAgICAqID09ICdkaXInIGFuZCBvdGhlciBmb3JtYXRzIHRoYXQgYmVnaW4gd2l0aCAnZGlyJy4gPGJyLz4KLSAgICAgKiA8Yj5OT1RFOjwvYj4gU2luY2UgMi4yLWJldGEtMywgdGhlIGRlZmF1bHQtdmFsdWUgZm9yIHRoaXMgaXMgdHJ1ZSwgTk9UIGZhbHNlIGFzIGl0IHVzZWQgdG8gYmUuCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gInRydWUiICkKLSAgICBwcml2YXRlIGJvb2xlYW4gaWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9uczsKLQotICAgIC8qKgotICAgICAqIExvY2FsIE1hdmVuIHJlcG9zaXRvcnkgd2hlcmUgYXJ0aWZhY3RzIGFyZSBjYWNoZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICIke2xvY2FsUmVwb3NpdG9yeX0iLCByZXF1aXJlZCA9IHRydWUsIHJlYWRvbmx5ID0gdHJ1ZSApCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnkgbG9jYWxSZXBvc2l0b3J5OwotCi0gICAgLyoqCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7cHJvamVjdC5yZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllc30iLCByZXF1aXJlZCA9IHRydWUsIHJlYWRvbmx5ID0gdHJ1ZSApCi0gICAgcHJpdmF0ZSBMaXN0PEFydGlmYWN0UmVwb3NpdG9yeT4gcmVtb3RlUmVwb3NpdG9yaWVzOwotCi0gICAgLyoqCi0gICAgICogQ29udGFpbnMgdGhlIGZ1bGwgbGlzdCBvZiBwcm9qZWN0cyBpbiB0aGUgcmVhY3Rvci4KLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtyZWFjdG9yUHJvamVjdHN9IiwgcmVxdWlyZWQgPSB0cnVlLCByZWFkb25seSA9IHRydWUgKQotICAgIHByaXZhdGUgTGlzdDxNYXZlblByb2plY3Q+IHJlYWN0b3JQcm9qZWN0czsKLQotICAgIC8qKgotICAgICAqIFRoZSBvdXRwdXQgZGlyZWN0b3J5IG9mIHRoZSBhc3NlbWJsZWQgZGlzdHJpYnV0aW9uIGZpbGUuCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IiwgcmVxdWlyZWQgPSB0cnVlICkKLSAgICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogVGhlIGZpbGVuYW1lIG9mIHRoZSBhc3NlbWJsZWQgZGlzdHJpYnV0aW9uIGZpbGUuCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IiwgcmVxdWlyZWQgPSB0cnVlICkKLSAgICBwcml2YXRlIFN0cmluZyBmaW5hbE5hbWU7Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RvcnkgdG8gdW5wYWNrIEpBUnMgaW50byBpZiBuZWVkZWQKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vYXNzZW1ibHkvd29yayIsIHJlcXVpcmVkID0gdHJ1ZSApCi0gICAgcHJpdmF0ZSBGaWxlIHdvcmtEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBTcGVjaWZpZXMgdGhlIGZvcm1hdHMgb2YgdGhlIGFzc2VtYmx5LgotICAgICAqIE11bHRpcGxlIGZvcm1hdHMgY2FuIGJlIHN1cHBsaWVkIGFuZCB0aGUgQXNzZW1ibHkgUGx1Z2luIHdpbGwgZ2VuZXJhdGUgYW4gYXJjaGl2ZSBmb3IgZWFjaCBkZXNpcmVkIGZvcm1hdHMuCi0gICAgICogV2hlbiBkZXBsb3lpbmcgeW91ciBwcm9qZWN0LCBhbGwgZmlsZSBmb3JtYXRzIHNwZWNpZmllZCB3aWxsIGFsc28gYmUgZGVwbG95ZWQuIEEgZm9ybWF0IGlzIHNwZWNpZmllZCBieSBzdXBwbHlpbmcKLSAgICAgKiBvbmUgb2YgdGhlIGZvbGxvd2luZwotICAgICAqIHZhbHVlcyBpbiBhICZsdDtmb3JtYXQmZ3Q7IHN1YmVsZW1lbnQ6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT48ZW0+ZGlyPC9lbT4gLSBDcmVhdGVzIGEgZGlyZWN0b3J5PC9saT4KLSAgICAgKiA8bGk+PGVtPnppcDwvZW0+IC0gQ3JlYXRlcyBhIFpJUCBmaWxlIGZvcm1hdDwvbGk+Ci0gICAgICogPGxpPjxlbT50YXI8L2VtPiAtIENyZWF0ZXMgYSBUQVIgZm9ybWF0PC9saT4KLSAgICAgKiA8bGk+PGVtPnRhci5nejwvZW0+IG9yIDxlbT50Z3o8L2VtPiAtIENyZWF0ZXMgYSBnemlwJ2QgVEFSIGZvcm1hdDwvbGk+Ci0gICAgICogPGxpPjxlbT50YXIuYnoyPC9lbT4gb3IgPGVtPnRiejI8L2VtPiAtIENyZWF0ZXMgYSBiemlwJ2QgVEFSIGZvcm1hdDwvbGk+Ci0gICAgICogPC91bD4KLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZm9ybWF0czsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIGFydGlmYWN0IGNsYXNzaWZpZXIgdG8gYmUgdXNlZCBmb3IgdGhlIHJlc3VsdGFudCBhc3NlbWJseSBhcnRpZmFjdC4gTm9ybWFsbHksIHlvdSB3b3VsZCB1c2UgdGhlCi0gICAgICogYXNzZW1ibHktaWQgaW5zdGVhZCBvZiBzcGVjaWZ5aW5nIHRoaXMgaGVyZS4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgdGhlIEFzc2VtYmx5J3MgaWQgZm9yIGNsYXNzaWZpZXIgaW5zdGVhZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAiY2xhc3NpZmllciIgKQotICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzaWZpZXI7Ci0KLSAgICAvKioKLSAgICAgKiBBIGxpc3Qgb2YgZGVzY3JpcHRvciBmaWxlcyB0byBnZW5lcmF0ZSBmcm9tLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIKLSAgICBwcml2YXRlIFN0cmluZ1tdIGRlc2NyaXB0b3JzOwotCi0gICAgLyoqCi0gICAgICogQSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gYXNzZW1ibHkgZGVzY3JpcHRvcnMgYXZhaWxhYmxlIG9uIHRoZSBwbHVnaW4ncyBjbGFzc3BhdGguIFRoZSBkZWZhdWx0IGNsYXNzcGF0aAotICAgICAqIGluY2x1ZGVzIHRoZXNlIGJ1aWx0LWluIGRlc2NyaXB0b3JzOiA8Y29kZT5iaW48L2NvZGU+LCA8Y29kZT5qYXItd2l0aC1kZXBlbmRlbmNpZXM8L2NvZGU+LCA8Y29kZT5zcmM8L2NvZGU+LCBhbmQKLSAgICAgKiA8Y29kZT5wcm9qZWN0PC9jb2RlPi4gWW91IGNhbiBhZGQgb3RoZXJzIGJ5IGFkZGluZyBkZXBlbmRlbmNpZXMKLSAgICAgKiB0byB0aGUgcGx1Z2luLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIKLSAgICBwcml2YXRlIFN0cmluZ1tdIGRlc2NyaXB0b3JSZWZzOwotCi0gICAgLyoqCi0gICAgICogRGlyZWN0b3J5IHRvIHNjYW4gZm9yIGRlc2NyaXB0b3IgZmlsZXMgaW4uIDxiPk5PVEU6PC9iPiBUaGlzIG1heSBub3Qgd29yayBjb3JyZWN0bHkgd2l0aCBhc3NlbWJseSBjb21wb25lbnRzLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIKLSAgICBwcml2YXRlIEZpbGUgZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFRoaXMgaXMgdGhlIGJhc2UgZGlyZWN0b3J5IGZyb20gd2hpY2ggYXJjaGl2ZSBmaWxlcyBhcmUgY3JlYXRlZC4gVGhpcyBiYXNlIGRpcmVjdG9yeSBwcmUtcGVuZGVkIHRvIGFueQotICAgICAqIDxjb2RlPiZsdDtkaXJlY3RvcnkmZ3Q7PC9jb2RlPiBzcGVjaWZpY2F0aW9ucyBpbiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvci4gVGhpcyBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIuCi0gICAgICovCi0gICAgQFBhcmFtZXRlcgotICAgIHByaXZhdGUgRmlsZSBhcmNoaXZlQmFzZURpcmVjdG9yeTsKLQotICAgIC8qKgotICAgICAqIFByZWRlZmluZWQgQXNzZW1ibHkgRGVzY3JpcHRvciBJZCdzLiBZb3UgY2FuIHNlbGVjdCBiaW4sIGphci13aXRoLWRlcGVuZGVuY2llcywgb3Igc3JjLgotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgUGxlYXNlIHVzZSBkZXNjcmlwdG9yUmVmcyBpbnN0ZWFkCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJkZXNjcmlwdG9ySWQiICkKLSAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdG9ySWQ7Ci0KLSAgICAvKioKLSAgICAgKiBBc3NlbWJseSBYTUwgRGVzY3JpcHRvciBmaWxlLiBUaGlzIG11c3QgYmUgdGhlIHBhdGggdG8geW91ciBjdXN0b21pemVkIGRlc2NyaXB0b3IgZmlsZS4KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFBsZWFzZSB1c2UgZGVzY3JpcHRvcnMgaW5zdGVhZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAiZGVzY3JpcHRvciIgKQotICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBUYXJBcmNoaXZlciBiZWhhdmlvciBvbiBmaWxlIHBhdGhzIHdpdGggbW9yZSB0aGFuIDEwMCBjaGFyYWN0ZXJzIGxlbmd0aC4gVmFsaWQgdmFsdWVzIGFyZTogIndhcm4iCi0gICAgICogKGRlZmF1bHQpLCAiZmFpbCIsICJ0cnVuY2F0ZSIsICJnbnUiLCAicG9zaXgiLCAicG9zaXhfd2FybiIgb3IgIm9taXQiLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImFzc2VtYmx5LnRhckxvbmdGaWxlTW9kZSIsIGRlZmF1bHRWYWx1ZSA9ICJ3YXJuIiApCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyTG9uZ0ZpbGVNb2RlOwotCi0gICAgLyoqCi0gICAgICogQmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QuCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7cHJvamVjdC5iYXNlZGlyfSIsIHJlcXVpcmVkID0gdHJ1ZSwgcmVhZG9ubHkgPSB0cnVlICkKLSAgICBwcml2YXRlIEZpbGUgYmFzZWRpcjsKLQotICAgIC8qKgotICAgICAqIE1hdmVuIFByb2plY3RIZWxwZXIuCi0gICAgICovCi0gICAgQENvbXBvbmVudAotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0SGVscGVyIHByb2plY3RIZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBNYXZlbiBzaGFyZWQgZmlsdGVyaW5nIHV0aWxpdHkuCi0gICAgICovCi0gICAgQENvbXBvbmVudAotICAgIHByaXZhdGUgTWF2ZW5SZWFkZXJGaWx0ZXIgbWF2ZW5SZWFkZXJGaWx0ZXI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgTWF2ZW4gU2Vzc2lvbiBPYmplY3QKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtzZXNzaW9ufSIsIHJlYWRvbmx5ID0gdHJ1ZSwgcmVxdWlyZWQgPSB0cnVlICkKLSAgICBwcml2YXRlIE1hdmVuU2Vzc2lvbiBtYXZlblNlc3Npb247Ci0KLSAgICAvKioKLSAgICAgKiBUZW1wb3JhcnkgZGlyZWN0b3J5IHRoYXQgY29udGFpbiB0aGUgZmlsZXMgdG8gYmUgYXNzZW1ibGVkLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcmNoaXZlLXRtcCIsIHJlcXVpcmVkID0gdHJ1ZSwgcmVhZG9ubHkgPSB0cnVlICkKLSAgICBwcml2YXRlIEZpbGUgdGVtcFJvb3Q7Ci0KLSAgICAvKioKLSAgICAgKiBEaXJlY3RvcnkgZm9yIHNpdGUgZ2VuZXJhdGVkLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICIke3Byb2plY3QucmVwb3J0aW5nLm91dHB1dERpcmVjdG9yeX0iLCByZWFkb25seSA9IHRydWUgKQotICAgIHByaXZhdGUgRmlsZSBzaXRlRGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICogU2V0IHRvIHRydWUgdG8gaW5jbHVkZSB0aGUgc2l0ZSBnZW5lcmF0ZWQgYnkgc2l0ZTpzaXRlIGdvYWwuCi0gICAgICoKLSAgICAgKiBAZGVwcmVjYXRlZCBQbGVhc2Ugc2V0IHRoaXMgdmFyaWFibGUgaW4gdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IgaW5zdGVhZAotICAgICAqLwotICAgIEBEZXByZWNhdGVkCi0gICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAiaW5jbHVkZVNpdGUiLCBkZWZhdWx0VmFsdWUgPSAiZmFsc2UiICkKLSAgICBwcml2YXRlIGJvb2xlYW4gaW5jbHVkZVNpdGU7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdG8gZmFsc2UgdG8gZXhjbHVkZSB0aGUgYXNzZW1ibHkgaWQgZnJvbSB0aGUgYXNzZW1ibHkgZmluYWwgbmFtZS4KLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJhc3NlbWJseS5hcHBlbmRBc3NlbWJseUlkIiwgZGVmYXVsdFZhbHVlID0gInRydWUiICkKLSAgICBib29sZWFuIGFwcGVuZEFzc2VtYmx5SWQ7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBub3QgZmFpbCB3aGVuIGEgZGVzY3JpcHRvciBpcyBtaXNzaW5nLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImFzc2VtYmx5Lmlnbm9yZU1pc3NpbmdEZXNjcmlwdG9yIiwgZGVmYXVsdFZhbHVlID0gImZhbHNlIiApCi0gICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZU1pc3NpbmdEZXNjcmlwdG9yOwotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBhIHNldCBvZiBpbnN0cnVjdGlvbnMgdG8gdGhlIGFyY2hpdmUgYnVpbGRlciwgZXNwZWNpYWxseSBmb3IgYnVpbGRpbmcgLmphciBmaWxlcy4gSXQgZW5hYmxlcyB5b3UgdG8KLSAgICAgKiBzcGVjaWZ5IGEgTWFuaWZlc3QgZmlsZSBmb3IgdGhlIGphciwgaW4gYWRkaXRpb24gdG8gb3RoZXIgb3B0aW9ucy4KLSAgICAgKiBTZWUgPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvc2hhcmVkL21hdmVuLWFyY2hpdmVyL2luZGV4Lmh0bWwiPk1hdmVuIEFyY2hpdmVyIFJlZmVyZW5jZTwvYT4uCi0gICAgICovCi0gICAgQFBhcmFtZXRlcgotICAgIHByaXZhdGUgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBhcmNoaXZlOwotCi0gICAgLyoqCi0gICAgICogVGhlIGxpc3Qgb2YgZXh0cmEgZmlsdGVyIHByb3BlcnRpZXMgZmlsZXMgdG8gYmUgdXNlZCBhbG9uZyB3aXRoIFN5c3RlbSBwcm9wZXJ0aWVzLCBwcm9qZWN0Ci0gICAgICogcHJvcGVydGllcywgYW5kIGZpbHRlciBwcm9wZXJ0aWVzIGZpbGVzIHNwZWNpZmllZCBpbiB0aGUgUE9NIGJ1aWxkL2ZpbHRlcnMgc2VjdGlvbiwgd2hpY2gKLSAgICAgKiBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIGZpbHRlcmluZyBkdXJpbmcgdGhlIGN1cnJlbnQgbW9qbyBleGVjdXRpb24uIDxici8+Ci0gICAgICogTm9ybWFsbHksIHRoZXNlIHdpbGwgYmUgY29uZmlndXJlZCBmcm9tIGEgcGx1Z2luJ3MgZXhlY3V0aW9uIHNlY3Rpb24sIHRvIHByb3ZpZGUgYSBkaWZmZXJlbnQKLSAgICAgKiBzZXQgb2YgZmlsdGVycyBmb3IgYSBwYXJ0aWN1bGFyIGV4ZWN1dGlvbi4KLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmlsdGVyczsKLQotICAgIC8qKgotICAgICAqIElmIFRydWUgKGRlZmF1bHQpIHRoZW4gdGhlICR7cHJvamVjdC5idWlsZC5maWx0ZXJzfSBhcmUgYWxzbyB1c2VkIGluIGFkZGl0aW9uIHRvIGFueQotICAgICAqIGZ1cnRoZXIgZmlsdGVycyBkZWZpbmVkIGZvciB0aGUgQXNzZW1ibHkuCi0gICAgICoKLSAgICAgKiBAc2luY2UgMi40LjIKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJhc3NlbWJseS5pbmNsdWRlUHJvamVjdEJ1aWxkRmlsdGVycyIsIGRlZmF1bHRWYWx1ZSA9ICJ0cnVlIiApCi0gICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGVQcm9qZWN0QnVpbGRGaWx0ZXJzOwotCi0gICAgLyoqCi0gICAgICogQ29udHJvbHMgd2hldGhlciB0aGUgYXNzZW1ibHkgcGx1Z2luIHRyaWVzIHRvIGF0dGFjaCB0aGUgcmVzdWx0aW5nIGFzc2VtYmx5IHRvIHRoZSBwcm9qZWN0LgotICAgICAqCi0gICAgICogQHNpbmNlIDIuMi1iZXRhLTEKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJhc3NlbWJseS5hdHRhY2giLCBkZWZhdWx0VmFsdWUgPSAidHJ1ZSIgKQotICAgIHByaXZhdGUgYm9vbGVhbiBhdHRhY2g7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgemlwIGFyY2hpdmVzIChqYXIsemlwIGV0YykgYmVpbmcgYWRkZWQgdG8gdGhlIGFzc2VtYmx5IHNob3VsZCBiZSBjb21wcmVzc2VkIGFnYWluLgotICAgICAqIENvbXByZXNzaW5nIGFnYWluIGNhbiByZXN1bHQgaW4gc21hbGxlciBhcmNoaXZlIHNpemUsIGJ1dCBnaXZlcyBub3RpY2VhYmx5IGxvbmdlciBleGVjdXRpb24gdGltZS4KLSAgICAgKgotICAgICAqIEBzaW5jZSAyLjQKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAidHJ1ZSIgKQotICAgIHByaXZhdGUgYm9vbGVhbiByZWNvbXByZXNzWmlwcGVkRmlsZXM7Ci0KLSAgICAvKioKLSAgICAgKi8KLSAgICBAQ29tcG9uZW50Ci0gICAgcHJpdmF0ZSBBc3NlbWJseUFyY2hpdmVyIGFzc2VtYmx5QXJjaGl2ZXI7Ci0KLSAgICAvKioKLSAgICAgKi8KLSAgICBAQ29tcG9uZW50Ci0gICAgcHJpdmF0ZSBBc3NlbWJseVJlYWRlciBhc3NlbWJseVJlYWRlcjsKLQotICAgIC8qKgotICAgICAqIEFsbG93cyBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGFyZSBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgdHlwZSBvZiBhcmNoaXZlIGZvcm1hdC4gVGhpcyBpcwotICAgICAqIGludGVuZGVkIHRvIGNhcHR1cmUgYW4gWE1MIGNvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVmbGVjdGl2ZWx5IHNldHVwIHRoZSBvcHRpb25zIG9uIHRoZSBhcmNoaXZlcgotICAgICAqIGluc3RhbmNlLiA8YnIvPgotICAgICAqIEZvciBpbnN0YW5jZSwgdG8gZGlyZWN0IGFuIGFzc2VtYmx5IHdpdGggdGhlICJlYXIiIGZvcm1hdCB0byB1c2UgYSBwYXJ0aWN1bGFyIGRlcGxveW1lbnQgZGVzY3JpcHRvciwgeW91IHNob3VsZAotICAgICAqIHNwZWNpZnkgdGhlIGZvbGxvd2luZyBmb3IgdGhlIGFyY2hpdmVyQ29uZmlnIHZhbHVlIGluIHlvdXIgcGx1Z2luIGNvbmZpZ3VyYXRpb246IDxici8+Ci0gICAgICogPHAvPgotICAgICAqIDxwLz4KLSAgICAgKiA8cHJlPgotICAgICAqICZsdDthcHB4bWwmZ3Q7JHtwcm9qZWN0LmJhc2VkaXJ9L3NvbWVwYXRoL2FwcC54bWwmbHQ7L2FwcHhtbCZndDsKLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBzaW5jZSAyLjItYmV0YS0zCi0gICAgICovCi0gICAgQFBhcmFtZXRlcgotICAgIHByaXZhdGUgUGxleHVzQ29uZmlndXJhdGlvbiBhcmNoaXZlckNvbmZpZzsKLQotICAgIC8qKgotICAgICAqIFRoaXMgd2lsbCBjYXVzZSB0aGUgYXNzZW1ibHkgdG8gcnVuIG9ubHkgYXQgdGhlIHRvcCBvZiBhIGdpdmVuIG1vZHVsZSB0cmVlLiBUaGF0IGlzLCBydW4gaW4gdGhlIHByb2plY3QgY29udGFpbmVkCi0gICAgICogaW4gdGhlIHNhbWUgZm9sZGVyIHdoZXJlIHRoZSBtdm4gZXhlY3V0aW9uIHdhcyBsYXVuY2hlZC4KLSAgICAgKgotICAgICAqIEBzaW5jZSAyLjItYmV0YS00Ci0gICAgICovCi0gICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAiYXNzZW1ibHkucnVuT25seUF0RXhlY3V0aW9uUm9vdCIsIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIgKQotICAgIHByaXZhdGUgYm9vbGVhbiBydW5Pbmx5QXRFeGVjdXRpb25Sb290OwotCi0gICAgLyoqCi0gICAgICogVGhpcyB3aWxsIGNhdXNlIHRoZSBhc3NlbWJseSB0byBvbmx5IHVwZGF0ZSBhbiBleGlzdGluZyBhcmNoaXZlLCBpZiBpdCBleGlzdHMuCi0gICAgICogPHA+Ci0gICAgICogPHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgdXNlZCBvbiB0aGUgY29tbWFuZCBsaW5lIHdhcyBtaXNzcGVsbGVkIGFzICJhc3NlbWJseS51cGRhdE9ubHkiCi0gICAgICogaW4gdmVyc2lvbnMgcHJpb3IgdG8gdmVyc2lvbiAyLjQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNpbmNlIDIuMgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImFzc2VtYmx5LnVwZGF0ZU9ubHkiLCBkZWZhdWx0VmFsdWUgPSAiZmFsc2UiICkKLSAgICBwcml2YXRlIGJvb2xlYW4gdXBkYXRlT25seTsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIHdpbGwgdXNlIHRoZSBqdm0gY2htb2QsIHRoaXMgaXMgYXZhaWxhYmxlIGZvciB1c2VyIGFuZCBhbGwgbGV2ZWwgZ3JvdXAgbGV2ZWwgd2lsbCBiZSBpZ25vcmVkIEFzIG9mCi0gICAgICogYXNzZW1ibHktcGx1Z2luIDIuNSwgdGhpcyBmbGFnIGlzIGlnbm9yZWQgZm9yIHVzZXJzIG9mIGphdmE3KwotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZSAyLjIKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJhc3NlbWJseS51c2VKdm1DaG1vZCIsIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIgKQotICAgIHByaXZhdGUgYm9vbGVhbiB1c2VKdm1DaG1vZDsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNldCB0byA8Y29kZT50cnVlPC9jb2RlPiBpbiBvcmRlciB0byBhdm9pZCBhbGwgY2htb2QgY2FsbHMuCi0gICAgICogPC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cD4KLSAgICAgKiA8Yj5OT1RFOjwvYj4gVGhpcyB3aWxsIGNhdXNlIHRoZSBhc3NlbWJseSBwbHVnaW4gdG8gPGI+RElTUkVHQVJEPC9iPiBhbGwgZmlsZU1vZGUvZGlyZWN0b3J5TW9kZSBzZXR0aW5ncyBpbiB0aGUKLSAgICAgKiBhc3NlbWJseSBkZXNjcmlwdG9yLCBhbmQgYWxsIGZpbGUgcGVybWlzc2lvbnMgaW4gdW5wYWNrZWQgZGVwZW5kZW5jaWVzIQotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZSAyLjIKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBwcm9wZXJ0eSA9ICJhc3NlbWJseS5pZ25vcmVQZXJtaXNzaW9ucyIsIGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIgKQotICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVQZXJtaXNzaW9uczsKLQotICAgIC8qKgotICAgICAqIDxwPgotICAgICAqIFNldCBvZiBkZWxpbWl0ZXJzIGZvciBleHByZXNzaW9ucyB0byBmaWx0ZXIgd2l0aGluIHRoZSByZXNvdXJjZXMuIFRoZXNlIGRlbGltaXRlcnMgYXJlIHNwZWNpZmllZCBpbiB0aGUgZm9ybQotICAgICAqICdiZWdpblRva2VuKmVuZFRva2VuJy4gSWYgbm8gJyonIGlzIGdpdmVuLCB0aGUgZGVsaW1pdGVyIGlzIGFzc3VtZWQgdG8gYmUgdGhlIHNhbWUgZm9yIHN0YXJ0IGFuZCBlbmQuCi0gICAgICogPC9wPgotICAgICAqIDxwPgotICAgICAqIFNvLCB0aGUgZGVmYXVsdCBmaWx0ZXJpbmcgZGVsaW1pdGVycyBtaWdodCBiZSBzcGVjaWZpZWQgYXM6Ci0gICAgICogPC9wPgotICAgICAqIDxwLz4KLSAgICAgKiA8cHJlPgotICAgICAqICZsdDtkZWxpbWl0ZXJzJmd0OwotICAgICAqICAgJmx0O2RlbGltaXRlciZndDskeyp9Jmx0Oy9kZWxpbWl0ZXImZ3Q7Ci0gICAgICogICAmbHQ7ZGVsaW1pdGVyJmd0O0AmbHQ7L2RlbGltaXRlciZndDsKLSAgICAgKiAmbHQ7L2RlbGltaXRlcnMmZ3Q7Ci0gICAgICogPC9wcmU+Ci0gICAgICogPHA+Ci0gICAgICogU2luY2UgdGhlICdAJyBkZWxpbWl0ZXIgaXMgdGhlIHNhbWUgb24gYm90aCBlbmRzLCB3ZSBkb24ndCBuZWVkIHRvIHNwZWNpZnkgJ0AqQCcgKHRob3VnaCB3ZSBjYW4pLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzaW5jZSAyLjQKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyCi0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZGVsaW1pdGVyczsKLQotICAgIHByb3RlY3RlZCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBjb21tYW5uZExpbmVQcm9wZXJ0aWVzSW50ZXJwb2xhdG9yOwotCi0gICAgcHJvdGVjdGVkIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGVudkludGVycG9sYXRvcjsKLQotICAgIHByb3RlY3RlZCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBtYWluUHJvamVjdEludGVycG9sYXRvcjsKLQotICAgIHByb3RlY3RlZCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciByb290SW50ZXJwb2xhdG9yOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSBiaW5hcnkgZGlzdHJpYnV0aW9uLgotICAgICAqCi0gICAgICogQHRocm93cyBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBpZiAoIHNraXBBc3NlbWJseSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldExvZygpLmluZm8oICJBc3NlbWJsaWVzIGhhdmUgYmVlbiBza2lwcGVkIHBlciBjb25maWd1cmF0aW9uIG9mIHRoZSBza2lwQXNzZW1ibHkgcGFyYW1ldGVyLiIgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJ1biBvbmx5IGF0IHRoZSBleGVjdXRpb24gcm9vdC4KLSAgICAgICAgaWYgKCBydW5Pbmx5QXRFeGVjdXRpb25Sb290ICYmICFpc1RoaXNUaGVFeGVjdXRpb25Sb290KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRMb2coKS5pbmZvKCAiU2tpcHBpbmcgdGhlIGFzc2VtYmx5IGluIHRoaXMgcHJvamVjdCBiZWNhdXNlIGl0J3Mgbm90IHRoZSBFeGVjdXRpb24gUm9vdCIgKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8QXNzZW1ibHk+IGFzc2VtYmxpZXM7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlbWJsaWVzID0gYXNzZW1ibHlSZWFkZXIucmVhZEFzc2VtYmxpZXMoIHRoaXMgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciByZWFkaW5nIGFzc2VtYmxpZXM6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbiggYXNzZW1ibHlSZWFkZXIsIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9qbyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogaW5jbHVkZSBkZXBlbmRlbmNpZXMgbWFya2VkIGZvciBkaXN0cmlidXRpb24gdW5kZXIgY2VydGFpbiBmb3JtYXRzCi0gICAgICAgIC8vIFRPRE86IGhvdywgbWlnaHQgd2UgcGx1ZyB0aGlzIGludG8gYW4gaW5zdGFsbGVyLCBzdWNoIGFzIE5TSVM/Ci0KLSAgICAgICAgYm9vbGVhbiB3YXJuZWRBYm91dE1haW5Qcm9qZWN0QXJ0aWZhY3QgPSBmYWxzZTsKLSAgICAgICAgZm9yICggZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgOiBhc3NlbWJsaWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gQXNzZW1ibHlGb3JtYXRVdGlscy5nZXREaXN0cmlidXRpb25OYW1lKCBhc3NlbWJseSwgdGhpcyApOwotCi0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IGVmZmVjdGl2ZUZvcm1hdHMgPSBmb3JtYXRzOwotICAgICAgICAgICAgICAgIGlmICggZWZmZWN0aXZlRm9ybWF0cyA9PSBudWxsIHx8IGVmZmVjdGl2ZUZvcm1hdHMuc2l6ZSgpID09IDAgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlRm9ybWF0cyA9IGFzc2VtYmx5LmdldEZvcm1hdHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCBlZmZlY3RpdmVGb3JtYXRzID09IG51bGwgfHwgZWZmZWN0aXZlRm9ybWF0cy5zaXplKCkgPT0gMCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiTm8gZm9ybWF0cyBzcGVjaWZpZWQgaW4gdGhlIGV4ZWN1dGlvbiBwYXJhbWV0ZXJzIG9yIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yLiIgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBmaW5hbCBTdHJpbmcgZm9ybWF0IDogZWZmZWN0aXZlRm9ybWF0cyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGRlc3RGaWxlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VtYmx5QXJjaGl2ZXIuY3JlYXRlQXJjaGl2ZSggYXNzZW1ibHksIGZ1bGxOYW1lLCBmb3JtYXQsIHRoaXMsIGlzUmVjb21wcmVzc1ppcHBlZEZpbGVzKCkgKTsKLQotICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGdldFByb2plY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzaWZpZXIgPSBnZXRDbGFzc2lmaWVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlID0gcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldFR5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIGF0dGFjaCAmJiBkZXN0RmlsZS5pc0ZpbGUoKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaXNBc3NlbWJseUlkQXBwZW5kZWQoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEhlbHBlci5hdHRhY2hBcnRpZmFjdCggcHJvamVjdCwgZm9ybWF0LCBhc3NlbWJseS5nZXRJZCgpLCBkZXN0RmlsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIGNsYXNzaWZpZXIgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEhlbHBlci5hdHRhY2hBcnRpZmFjdCggcHJvamVjdCwgZm9ybWF0LCBjbGFzc2lmaWVyLCBkZXN0RmlsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoICEicG9tIi5lcXVhbHMoIHR5cGUgKSAmJiBmb3JtYXQuZXF1YWxzKCB0eXBlICkgKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggIXdhcm5lZEFib3V0TWFpblByb2plY3RBcnRpZmFjdCApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1lc3NhZ2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCAiQ29uZmlndXJhdGlvbiBvcHRpb25zOiAnYXBwZW5kQXNzZW1ibHlJZCcgaXMgc2V0IHRvIGZhbHNlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhbmQgJ2NsYXNzaWZpZXInIGlzIG1pc3NpbmcuIiApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmFwcGVuZCggIlxuSW5zdGVhZCBvZiBhdHRhY2hpbmcgdGhlIGFzc2VtYmx5IGZpbGU6ICIgKS5hcHBlbmQoIGRlc3RGaWxlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXBwZW5kKCAiLCBpdCB3aWxsIGJlY29tZSB0aGUgZmlsZSBmb3IgbWFpbiBwcm9qZWN0IGFydGlmYWN0LiIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5hcHBlbmQoICJcbk5PVEU6IElmIG11bHRpcGxlIGRlc2NyaXB0b3JzIG9yIGRlc2NyaXB0b3ItZm9ybWF0cyBhcmUgcHJvdmlkZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZm9yIHRoaXMgcHJvamVjdCwgdGhlIHZhbHVlIG9mIHRoaXMgZmlsZSB3aWxsIGJlIG5vbi1kZXRlcm1pbmlzdGljISIgKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCBtZXNzYWdlICk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5lZEFib3V0TWFpblByb2plY3RBcnRpZmFjdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBleGlzdGluZ0ZpbGUgPSBwcm9qZWN0LmdldEFydGlmYWN0KCkuZ2V0RmlsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBleGlzdGluZ0ZpbGUgIT0gbnVsbCApICYmIGV4aXN0aW5nRmlsZS5leGlzdHMoKSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCAiUmVwbGFjaW5nIHByZS1leGlzdGluZyBwcm9qZWN0IG1haW4tYXJ0aWZhY3QgZmlsZTogIiArIGV4aXN0aW5nRmlsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG53aXRoIGFzc2VtYmx5IGZpbGU6ICIgKyBkZXN0RmlsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0QXJ0aWZhY3QoKS5zZXRGaWxlKCBkZXN0RmlsZSApOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3RIZWxwZXIuYXR0YWNoQXJ0aWZhY3QoIHByb2plY3QsIGZvcm1hdCwgbnVsbCwgZGVzdEZpbGUgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggYXR0YWNoICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TG9nKCkud2FybiggIkFzc2VtYmx5IGZpbGU6ICIgKyBkZXN0RmlsZSArICIgaXMgbm90IGEgcmVndWxhciBmaWxlIChpdCBtYXkgYmUgYSBkaXJlY3RvcnkpLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJJdCBjYW5ub3QgYmUgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QgYnVpbGQgZm9yIGluc3RhbGxhdGlvbiBvciBkZXBsb3ltZW50LiIgKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRmFpbGVkIHRvIGNyZWF0ZSBhc3NlbWJseTogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIGZpbmFsIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkZhaWxlZCB0byBjcmVhdGUgYXNzZW1ibHk6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oIGFzc2VtYmx5LCAiQXNzZW1ibHkgaXMgaW5jb3JyZWN0bHkgY29uZmlndXJlZDogIiArIGFzc2VtYmx5LmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXNzZW1ibHk6ICIgKyBhc3NlbWJseS5nZXRJZCgpICsgIiBpcyBub3QgY29uZmlndXJlZCBjb3JyZWN0bHk6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGUuZ2V0TWVzc2FnZSgpICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGNyZWF0ZVJlcG9zaXRvcnlJbnRlcnBvbGF0b3IoKQotICAgIHsKLSAgICAgICAgZmluYWwgUHJvcGVydGllcyBzZXR0aW5nc1Byb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBmaW5hbCBNYXZlblNlc3Npb24gc2Vzc2lvbiA9IGdldE1hdmVuU2Vzc2lvbigpOwotCi0gICAgICAgIGlmICggZ2V0TG9jYWxSZXBvc2l0b3J5KCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldHRpbmdzUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggImxvY2FsUmVwb3NpdG9yeSIsIGdldExvY2FsUmVwb3NpdG9yeSgpLmdldEJhc2VkaXIoKSApOwotICAgICAgICAgICAgc2V0dGluZ3NQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCAic2V0dGluZ3MubG9jYWxSZXBvc2l0b3J5IiwgZ2V0TG9jYWxSZXBvc2l0b3J5KCkuZ2V0QmFzZWRpcigpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIHNlc3Npb24gIT0gbnVsbCAmJiBzZXNzaW9uLmdldFNldHRpbmdzKCkgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldHRpbmdzUHJvcGVydGllcy5zZXRQcm9wZXJ0eSggImxvY2FsUmVwb3NpdG9yeSIsIHNlc3Npb24uZ2V0U2V0dGluZ3MoKS5nZXRMb2NhbFJlcG9zaXRvcnkoKSApOwotICAgICAgICAgICAgc2V0dGluZ3NQcm9wZXJ0aWVzLnNldFByb3BlcnR5KCAic2V0dGluZ3MubG9jYWxSZXBvc2l0b3J5IiwgZ2V0TG9jYWxSZXBvc2l0b3J5KCkuZ2V0QmFzZWRpcigpICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCBuZXcgUHJvcGVydGllc0Jhc2VkVmFsdWVTb3VyY2UoIHNldHRpbmdzUHJvcGVydGllcyApICk7Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGNyZWF0ZUNvbW1hbmRMaW5lUHJvcGVydGllc0ludGVycG9sYXRvcigpCi0gICAgewotICAgICAgICBQcm9wZXJ0aWVzIGNvbW1hbmRMaW5lUHJvcGVydGllcyA9IFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIGZpbmFsIE1hdmVuU2Vzc2lvbiBzZXNzaW9uID0gZ2V0TWF2ZW5TZXNzaW9uKCk7Ci0KLSAgICAgICAgaWYgKCBzZXNzaW9uICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb21tYW5kTGluZVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICAgICAgaWYgKCBzZXNzaW9uLmdldEV4ZWN1dGlvblByb3BlcnRpZXMoKSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kTGluZVByb3BlcnRpZXMucHV0QWxsKCBzZXNzaW9uLmdldEV4ZWN1dGlvblByb3BlcnRpZXMoKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHNlc3Npb24uZ2V0VXNlclByb3BlcnRpZXMoKSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjb21tYW5kTGluZVByb3BlcnRpZXMucHV0QWxsKCBzZXNzaW9uLmdldFVzZXJQcm9wZXJ0aWVzKCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFByb3BlcnRpZXNCYXNlZFZhbHVlU291cmNlIGNsaVByb3BzID0gbmV3IFByb3BlcnRpZXNCYXNlZFZhbHVlU291cmNlKCBjb21tYW5kTGluZVByb3BlcnRpZXMgKTsKLSAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSggY2xpUHJvcHMgKTsKLQotICAgIH0KLQotICAgIHByaXZhdGUgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgY3JlYXRlRW52SW50ZXJwb2xhdG9yKCkKLSAgICB7Ci0gICAgICAgIFByZWZpeGVkUHJvcGVydGllc1ZhbHVlU291cmNlIGVudlByb3BzID0gbmV3IFByZWZpeGVkUHJvcGVydGllc1ZhbHVlU291cmNlKCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCAiZW52LiIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lVXRpbHMuZ2V0U3lzdGVtRW52VmFycygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSApLCB0cnVlICk7Ci0gICAgICAgIHJldHVybiBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoIGVudlByb3BzICk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHByb2plY3QgaXMgbG9jYXRlZCBhdCB0aGUgRXhlY3V0aW9uIFJvb3QgRGlyZWN0b3J5ICh3aGVyZSBtdm4gd2FzIGxhdW5jaGVkKQotICAgICAqCi0gICAgICogQHJldHVybiBpZiB0aGlzIGlzIHRoZSBleGVjdXRpb24gcm9vdAotICAgICAqLwotICAgIGJvb2xlYW4gaXNUaGlzVGhlRXhlY3V0aW9uUm9vdCgpCi0gICAgewotICAgICAgICBmaW5hbCBMb2cgbG9nID0gZ2V0TG9nKCk7Ci0gICAgICAgIGxvZy5kZWJ1ZyggIlJvb3QgRm9sZGVyOiIgKyBtYXZlblNlc3Npb24uZ2V0RXhlY3V0aW9uUm9vdERpcmVjdG9yeSgpICk7Ci0gICAgICAgIGxvZy5kZWJ1ZyggIkN1cnJlbnQgRm9sZGVyOiIgKyBiYXNlZGlyICk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gbWF2ZW5TZXNzaW9uLmdldEV4ZWN1dGlvblJvb3REaXJlY3RvcnkoKS5lcXVhbHNJZ25vcmVDYXNlKCBiYXNlZGlyLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgaWYgKCByZXN1bHQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoICJUaGlzIGlzIHRoZSBleGVjdXRpb24gcm9vdC4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuZGVidWcoICJUaGlzIGlzIE5PVCB0aGUgZXhlY3V0aW9uIHJvb3QuIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBBc3NlbWJseUFyY2hpdmVyIGdldEFzc2VtYmx5QXJjaGl2ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFzc2VtYmx5QXJjaGl2ZXI7Ci0gICAgfQotCi0gICAgQXNzZW1ibHlSZWFkZXIgZ2V0QXNzZW1ibHlSZWFkZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFzc2VtYmx5UmVhZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEJhc2VkaXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGJhc2VkaXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBoYXMgYmVlbiByZXBsYWNlZCBieSB7QGxpbmsgI2dldERlc2NyaXB0b3JzKCl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoge0Bpbmhlcml0RG9jfQotICAgICAqCi0gICAgICogQGRlcHJlY2F0ZWQgVGhpcyBoYXMgYmVlbiByZXBsYWNlZCBieSB7QGxpbmsgI2dldERlc2NyaXB0b3JSZWZlcmVuY2VzKCl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0b3JJZCgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvcklkOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZXNjcmlwdG9yUmVmZXJlbmNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvclJlZnM7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0RGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVzY3JpcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBNYXZlblByb2plY3QgZ2V0UHJvamVjdCgpOwotCi0gICAgcHVibGljIEZpbGUgZ2V0U2l0ZURpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gc2l0ZURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1NpdGVJbmNsdWRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gaW5jbHVkZVNpdGU7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaW5hbE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbmFsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2VtYmx5SWRBcHBlbmRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gYXBwZW5kQXNzZW1ibHlJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFRhckxvbmdGaWxlTW9kZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGFyTG9uZ0ZpbGVNb2RlOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldE91dHB1dERpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uIGdldEphckFyY2hpdmVDb25maWd1cmF0aW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhcmNoaXZlOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldFdvcmtpbmdEaXJlY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHdvcmtEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIEFydGlmYWN0UmVwb3NpdG9yeSBnZXRMb2NhbFJlcG9zaXRvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsUmVwb3NpdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZW1wb3JhcnlSb290RGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0ZW1wUm9vdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRBcmNoaXZlQmFzZURpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gYXJjaGl2ZUJhc2VEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRGaWx0ZXJzKCkKLSAgICB7Ci0gICAgICAgIGlmICggZmlsdGVycyA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmlsdGVycyA9IGdldFByb2plY3QoKS5nZXRCdWlsZCgpLmdldEZpbHRlcnMoKTsKLSAgICAgICAgICAgIGlmICggZmlsdGVycyA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWx0ZXJzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbHRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlUHJvamVjdEJ1aWxkRmlsdGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gaW5jbHVkZVByb2plY3RCdWlsZEZpbHRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8TWF2ZW5Qcm9qZWN0PiBnZXRSZWFjdG9yUHJvamVjdHMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWN0b3JQcm9qZWN0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzaWZpZXIoKQotICAgIHsKLSAgICAgICAgLy8gVE9ETyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1YgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWF2ZW5Qcm9qZWN0SGVscGVyIGdldFByb2plY3RIZWxwZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3RIZWxwZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXBwZW5kQXNzZW1ibHlJZCggZmluYWwgYm9vbGVhbiBhcHBlbmRBc3NlbWJseUlkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYXBwZW5kQXNzZW1ibHlJZCA9IGFwcGVuZEFzc2VtYmx5SWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXJjaGl2ZSggZmluYWwgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBhcmNoaXZlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYXJjaGl2ZSA9IGFyY2hpdmU7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlZGlyKCBmaW5hbCBGaWxlIGJhc2VkaXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5iYXNlZGlyID0gYmFzZWRpcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc2lmaWVyKCBmaW5hbCBTdHJpbmcgY2xhc3NpZmllciApCi0gICAgewotICAgICAgICB0aGlzLmNsYXNzaWZpZXIgPSBjbGFzc2lmaWVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgaGFzIGJlZW4gcmVwbGFjZWQgYnkge0BsaW5rICNzZXREZXNjcmlwdG9ycyhTdHJpbmdbXSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yKCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRvciApCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKgotICAgICAqIEBkZXByZWNhdGVkIFRoaXMgaGFzIGJlZW4gcmVwbGFjZWQgYnkge0BsaW5rICNzZXREZXNjcmlwdG9yUmVmcyhTdHJpbmdbXSl9Ci0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9ySWQoIGZpbmFsIFN0cmluZyBkZXNjcmlwdG9ySWQgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdG9ySWQgPSBkZXNjcmlwdG9ySWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvclJlZnMoIGZpbmFsIFN0cmluZ1tdIGRlc2NyaXB0b3JSZWZzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRvclJlZnMgPSBkZXNjcmlwdG9yUmVmczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9ycyggZmluYWwgU3RyaW5nW10gZGVzY3JpcHRvcnMgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdG9ycyA9IGRlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0b3JTb3VyY2VEaXJlY3RvcnkoIGZpbmFsIEZpbGUgZGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeSApCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0b3JTb3VyY2VEaXJlY3RvcnkgPSBkZXNjcmlwdG9yU291cmNlRGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoIGZpbmFsIExpc3Q8U3RyaW5nPiBmaWx0ZXJzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxOYW1lKCBmaW5hbCBTdHJpbmcgZmluYWxOYW1lICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmluYWxOYW1lID0gZmluYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVTaXRlKCBmaW5hbCBib29sZWFuIGluY2x1ZGVTaXRlICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaW5jbHVkZVNpdGUgPSBpbmNsdWRlU2l0ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFJlcG9zaXRvcnkoIGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5sb2NhbFJlcG9zaXRvcnkgPSBsb2NhbFJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T3V0cHV0RGlyZWN0b3J5KCBmaW5hbCBGaWxlIG91dHB1dERpcmVjdG9yeSApCi0gICAgewotICAgICAgICB0aGlzLm91dHB1dERpcmVjdG9yeSA9IG91dHB1dERpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0SGVscGVyKCBmaW5hbCBNYXZlblByb2plY3RIZWxwZXIgcHJvamVjdEhlbHBlciApCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3RIZWxwZXIgPSBwcm9qZWN0SGVscGVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlYWN0b3JQcm9qZWN0cyggZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IHJlYWN0b3JQcm9qZWN0cyApCi0gICAgewotICAgICAgICB0aGlzLnJlYWN0b3JQcm9qZWN0cyA9IHJlYWN0b3JQcm9qZWN0czsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXRlRGlyZWN0b3J5KCBmaW5hbCBGaWxlIHNpdGVEaXJlY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5zaXRlRGlyZWN0b3J5ID0gc2l0ZURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRUYXJMb25nRmlsZU1vZGUoIGZpbmFsIFN0cmluZyB0YXJMb25nRmlsZU1vZGUgKQotICAgIHsKLSAgICAgICAgdGhpcy50YXJMb25nRmlsZU1vZGUgPSB0YXJMb25nRmlsZU1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVtcFJvb3QoIGZpbmFsIEZpbGUgdGVtcFJvb3QgKQotICAgIHsKLSAgICAgICAgdGhpcy50ZW1wUm9vdCA9IHRlbXBSb290OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFdvcmtEaXJlY3RvcnkoIGZpbmFsIEZpbGUgd29ya0RpcmVjdG9yeSApCi0gICAgewotICAgICAgICB0aGlzLndvcmtEaXJlY3RvcnkgPSB3b3JrRGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PEFydGlmYWN0UmVwb3NpdG9yeT4gZ2V0UmVtb3RlUmVwb3NpdG9yaWVzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZW1vdGVSZXBvc2l0b3JpZXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEcnlSdW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRyeVJ1bjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlnbm9yZURpckZvcm1hdEV4dGVuc2lvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVNaXNzaW5nRGVzY3JpcHRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gaWdub3JlTWlzc2luZ0Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SWdub3JlTWlzc2luZ0Rlc2NyaXB0b3IoIGZpbmFsIGJvb2xlYW4gaWdub3JlTWlzc2luZ0Rlc2NyaXB0b3IgKQotICAgIHsKLSAgICAgICAgdGhpcy5pZ25vcmVNaXNzaW5nRGVzY3JpcHRvciA9IGlnbm9yZU1pc3NpbmdEZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXZlblNlc3Npb24gZ2V0TWF2ZW5TZXNzaW9uKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYXZlblNlc3Npb247Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRBcmNoaXZlckNvbmZpZygpCi0gICAgewotICAgICAgICByZXR1cm4gYXJjaGl2ZXJDb25maWcgPT0gbnVsbCA/IG51bGwgOiBhcmNoaXZlckNvbmZpZy50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXZlblJlYWRlckZpbHRlciBnZXRNYXZlblJlYWRlckZpbHRlcigpCi0gICAgewotICAgICAgICByZXR1cm4gbWF2ZW5SZWFkZXJGaWx0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNVcGRhdGVPbmx5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB1cGRhdGVPbmx5OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlSnZtQ2htb2QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHVzZUp2bUNobW9kOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JlUGVybWlzc2lvbnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlnbm9yZVBlcm1pc3Npb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVuY29kaW5nOwotICAgIH0KLQotICAgIGJvb2xlYW4gaXNSZWNvbXByZXNzWmlwcGVkRmlsZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlY29tcHJlc3NaaXBwZWRGaWxlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVzY2FwZVN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gZXNjYXBlU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RGVsaW1pdGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsaW1pdGVyczsKLSAgICB9Ci0KLSAgICBATm9ubnVsbCBwdWJsaWMgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgZ2V0Q29tbWFuZExpbmVQcm9wc0ludGVycG9sYXRvcigpCi0gICAgewotICAgICAgICBpZiAoIGNvbW1hbm5kTGluZVByb3BlcnRpZXNJbnRlcnBvbGF0b3IgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuY29tbWFubmRMaW5lUHJvcGVydGllc0ludGVycG9sYXRvciA9IGNyZWF0ZUNvbW1hbmRMaW5lUHJvcGVydGllc0ludGVycG9sYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb21tYW5uZExpbmVQcm9wZXJ0aWVzSW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGdldEVudkludGVycG9sYXRvcigpCi0gICAgewotICAgICAgICBpZiAoIGVudkludGVycG9sYXRvciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5lbnZJbnRlcnBvbGF0b3IgPSBjcmVhdGVFbnZJbnRlcnBvbGF0b3IoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZW52SW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIEBOb25udWxsIHB1YmxpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBnZXRSZXBvc2l0b3J5SW50ZXJwb2xhdG9yKCkKLSAgICB7Ci0gICAgICAgIGlmICggcm9vdEludGVycG9sYXRvciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5yb290SW50ZXJwb2xhdG9yID0gY3JlYXRlUmVwb3NpdG9yeUludGVycG9sYXRvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb290SW50ZXJwb2xhdG9yOwotICAgIH0KLQotCi0gICAgQE5vbm51bGwKLSAgICBwdWJsaWMgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgZ2V0TWFpblByb2plY3RJbnRlcnBvbGF0b3IoKQotICAgIHsKLSAgICAgICAgaWYgKCBtYWluUHJvamVjdEludGVycG9sYXRvciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5tYWluUHJvamVjdEludGVycG9sYXRvciA9IG1haW5Qcm9qZWN0SW50ZXJwb2xhdG9yKCBnZXRQcm9qZWN0KCkgKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbWFpblByb2plY3RJbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBtYWluUHJvamVjdEludGVycG9sYXRvciggTWF2ZW5Qcm9qZWN0IG1haW5Qcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIGlmICggbWFpblByb2plY3QgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIDUKLSAgICAgICAgICAgIHJldHVybiBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoCi0gICAgICAgICAgICAgICAgbmV3IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5QcmVmaXhlZE9iamVjdFZhbHVlU291cmNlKAotICAgICAgICAgICAgICAgICAgICBJbnRlcnBvbGF0aW9uQ29uc3RhbnRzLlBST0pFQ1RfUFJFRklYRVMsIG1haW5Qcm9qZWN0LCB0cnVlICksCi0KLSAgICAgICAgICAgICAgICAvLyA2Ci0gICAgICAgICAgICAgICAgbmV3IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5QcmVmaXhlZFByb3BlcnRpZXNWYWx1ZVNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgSW50ZXJwb2xhdGlvbkNvbnN0YW50cy5QUk9KRUNUX1BST1BFUlRJRVNfUFJFRklYRVMsIG1haW5Qcm9qZWN0LmdldFByb3BlcnRpZXMoKSwgdHJ1ZSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuZW1wdHkoKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVsaW1pdGVycyggTGlzdDxTdHJpbmc+IGRlbGltaXRlcnMgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZWxpbWl0ZXJzID0gZGVsaW1pdGVyczsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9tb2pvcy9BYnN0cmFjdERpcmVjdG9yeU1vam8uamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9tb2pvcy9BYnN0cmFjdERpcmVjdG9yeU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlZGYxOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvQWJzdHJhY3REaXJlY3RvcnlNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2pvczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5Bc3NlbWJseUFyY2hpdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuaW8uQXNzZW1ibHlSZWFkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmlvLkFzc2VtYmx5UmVhZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1ARGVwcmVjYXRlZAotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlyZWN0b3J5TW9qbwotICAgIGV4dGVuZHMgQWJzdHJhY3RBc3NlbWJseU1vam8KLXsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJseVJlYWRlciByZWFkZXIgPSBnZXRBc3NlbWJseVJlYWRlcigpOwotCi0gICAgICAgIExpc3Q8QXNzZW1ibHk+IGFzc2VtYmxpZXM7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhc3NlbWJsaWVzID0gcmVhZGVyLnJlYWRBc3NlbWJsaWVzKCB0aGlzICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBc3NlbWJseVJlYWRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgcmVhZGluZyBhc3NlbWJseSBkZXNjcmlwdG9yczogIiArIGUuZ2V0TWVzc2FnZSgpLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKCByZWFkZXIsIGUuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTW9qbyBjb25maWd1cmF0aW9uIGlzIGludmFsaWQ6ICIgKyBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yICggQXNzZW1ibHkgYXNzZW1ibHkgOiBhc3NlbWJsaWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgY3JlYXRlRGlyZWN0b3J5KCBhc3NlbWJseSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZURpcmVjdG9yeSggZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgKQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5QXJjaGl2ZXIgYXJjaGl2ZXIgPSBnZXRBc3NlbWJseUFyY2hpdmVyKCk7Ci0KLSAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gZ2V0RmluYWxOYW1lKCk7Ci0KLSAgICAgICAgaWYgKCBhcHBlbmRBc3NlbWJseUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgZnVsbE5hbWUgPSBmdWxsTmFtZSArICItIiArIGFzc2VtYmx5LmdldElkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGdldENsYXNzaWZpZXIoKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZnVsbE5hbWUgPSBmdWxsTmFtZSArICItIiArIGdldENsYXNzaWZpZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlci5jcmVhdGVBcmNoaXZlKCBhc3NlbWJseSwgZnVsbE5hbWUsICJkaXIiLCB0aGlzLCBpc1JlY29tcHJlc3NaaXBwZWRGaWxlcygpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgY3JlYXRpbmcgYXNzZW1ibHk6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIGNyZWF0aW5nIGFzc2VtYmx5OiAiICsgZS5nZXRNZXNzYWdlKCksIGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oIGFzc2VtYmx5LCAiQXNzZW1ibHkgaXMgaW5jb3JyZWN0bHkgY29uZmlndXJlZDogIiArIGFzc2VtYmx5LmdldElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3NlbWJseTogIiArIGFzc2VtYmx5LmdldElkKCkgKyAiIGlzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseTogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBlLmdldE1lc3NhZ2UoKSApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvQXNzZW1ibHlNb2pvLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvQXNzZW1ibHlNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlZTNlNjIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL0Fzc2VtYmx5TW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2pvczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5FeGVjdXRlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5MaWZlY3ljbGVQaGFzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8qKgotICogQXNzZW1ibGUgYW4gYXBwbGljYXRpb24gYnVuZGxlIG9yIGRpc3RyaWJ1dGlvbiB1c2luZyBhbiBhc3NlbWJseSBkZXNjcmlwdG9yIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBnb2FsIHdpbGwKLSAqIGZvcmNlIE1hdmVuIHRvIGJ1aWxkIGFsbCBpbmNsdWRlZCBQT01zIHVwIHRvIHRoZSA8Y29kZT5wYWNrYWdlPC9jb2RlPiBwaGFzZSBCRUZPUkUgdGhlIGFzc2VtYmx5IGlzIHByb2Nlc3NlZC4gPGJyLz4KLSAqIDxwLz4KLSAqIDxiPk5PVEU6PC9iPiBUaGlzIGdvYWwgc2hvdWxkIE9OTFkgYmUgcnVuIGZyb20gdGhlIGNvbW1hbmQgbGluZSwgYW5kIGlmIGJ1aWxkaW5nIGEgbXVsdGltb2R1bGUgcHJvamVjdCBpdCBzaG91bGQgYmUKLSAqIHVzZWQgZnJvbSB0aGUgcm9vdCBQT00uIFVzZSB0aGUgPGNvZGU+YXNzZW1ibHk6c2luZ2xlPC9jb2RlPiBnb2FsIGZvciBiaW5kaW5nIHlvdXIgYXNzZW1ibHkgdG8gdGhlIGxpZmVjeWNsZS4gPGJyLz4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZGNhc2V5QGFwYWNoZS5vcmciPkpvaG4gQ2FzZXk8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpicmV0dEBhcGFjaGUub3JnIj5CcmV0dCBQb3J0ZXI8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzp2aW5jZW50LnNpdmV0b25AZ21haWwuY29tIj5WaW5jZW50IFNpdmV0b248L2E+Ci0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZGVwcmVjYXRlZCBVc2UgYXNzZW1ibHk6c2luZ2xlIGluc3RlYWQhIFRoZSBhc3NlbWJseTphc3NlbWJseSBtb2pvIGxlYWRzIHRvIG5vbi1zdGFuZGFyZCBidWlsZHMuCi0gKi8KLUBEZXByZWNhdGVkCi1ATW9qbyggbmFtZSA9ICJhc3NlbWJseSIsIGFnZ3JlZ2F0b3IgPSB0cnVlLCBpbmhlcml0QnlEZWZhdWx0ID0gZmFsc2UgKQotQEV4ZWN1dGUoIHBoYXNlID0gTGlmZWN5Y2xlUGhhc2UuUEFDS0FHRSApCi1wdWJsaWMgY2xhc3MgQXNzZW1ibHlNb2pvCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEFzc2VtYmx5TW9qbwotewotICAgIC8qKgotICAgICAqIEdldCB0aGUgZXhlY3V0ZWQgcHJvamVjdCBmcm9tIHRoZSBmb3JrZWQgbGlmZWN5Y2xlLgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIHByb3BlcnR5ID0gImV4ZWN1dGVkUHJvamVjdCIgKQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IGV4ZWN1dGVkUHJvamVjdDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXZlblByb2plY3QgZ2V0UHJvamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gZXhlY3V0ZWRQcm9qZWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL0F0dGFjaGVkQXNzZW1ibHlNb2pvLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvQXR0YWNoZWRBc3NlbWJseU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGFkM2Q1Yi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvQXR0YWNoZWRBc3NlbWJseU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9qb3M7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8qKgotICogQXNzZW1ibGUgYW4gYXBwbGljYXRpb24gYnVuZGxlIG9yIGRpc3RyaWJ1dGlvbiBmcm9tIGFuIGFzc2VtYmx5IGRlc2NyaXB0b3IsIFdJVEhPVVQgZmlyc3QgZm9yY2luZyBNYXZlbiB0byBidWlsZCBhbGwKLSAqIFBPTXMgdG8gdGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IHBoYXNlIChhcyBpcyByZXF1aXJlZCBieSB0aGUgPGNvZGU+YXNzZW1ibHk6YXNzZW1ibHk8L2NvZGU+IGdvYWwpLiA8YnIvPgotICogPHAvPgotICogPGI+Tk9URTo8L2I+IFRoaXMgZ29hbCBzaG91bGQgT05MWSBiZSBydW4gZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhbmQgaWYgYnVpbGRpbmcgYSBtdWx0aW1vZHVsZSBwcm9qZWN0IGl0IHNob3VsZCBiZQotICogdXNlZCBmcm9tIHRoZSByb290IFBPTS4gVXNlIHRoZSA8Y29kZT5hc3NlbWJseTpzaW5nbGU8L2NvZGU+IGdvYWwgZm9yIGJpbmRpbmcgeW91ciBhc3NlbWJseSB0byB0aGUgbGlmZWN5Y2xlLgotICoKLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmpkY2FzZXlAYXBhY2hlLm9yZyI+Sm9obiBDYXNleTwvYT4KLSAqIEBhdXRob3IgPGEgaHJlZj0ibWFpbHRvOmplcm9tZUBjb2ZmZWVicmVha3Mub3JnIj5KZXJvbWUgTGFjb3N0ZTwvYT4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBkZXByZWNhdGVkIFVzZSBhc3NlbWJseTpzaW5nbGUgaW5zdGVhZCEgVGhlIGFzc2VtYmx5OmF0dGFjaGVkIG1vam8gbGVhZHMgdG8gbm9uLXN0YW5kYXJkIGJ1aWxkcy4KLSAqLwotQE1vam8oIG5hbWUgPSAiYXR0YWNoZWQiLCBhZ2dyZWdhdG9yID0gdHJ1ZSwgaW5oZXJpdEJ5RGVmYXVsdCA9IGZhbHNlICkKLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgQXR0YWNoZWRBc3NlbWJseU1vam8KLSAgICBleHRlbmRzIEFic3RyYWN0QXNzZW1ibHlNb2pvCi17Ci0gICAgLyoqCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7cHJvamVjdH0iLCByZWFkb25seSA9IHRydWUsIHJlcXVpcmVkID0gdHJ1ZSApCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXZlblByb2plY3QgZ2V0UHJvamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gcHJvamVjdDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvRGlyZWN0b3J5SW5saW5lTW9qby5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL0RpcmVjdG9yeUlubGluZU1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQ2N2Y5Ni4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvbW9qb3MvRGlyZWN0b3J5SW5saW5lTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2pvczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBMaWtlIHRoZSA8Y29kZT5hc3NlbWJseTphdHRhY2hlZDwvY29kZT4gZ29hbCwgYXNzZW1ibGUgYW4gYXBwbGljYXRpb24gYnVuZGxlIG9yIGRpc3RyaWJ1dGlvbiBmcm9tIGFuIGFzc2VtYmx5Ci0gKiBkZXNjcmlwdG9yLCBXSVRIT1VUIGZpcnN0IGZvcmNpbmcgTWF2ZW4gdG8gYnVpbGQgYWxsIFBPTXMgdG8gdGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IHBoYXNlIChhcyBpcyByZXF1aXJlZCBieSB0aGUKLSAqIDxjb2RlPmFzc2VtYmx5OmFzc2VtYmx5PC9jb2RlPiBnb2FsKS4gVGhpcyBnb2FsIGRpZmZlcnMgZnJvbSA8Y29kZT5hc3NlbWJseTphdHRhY2hlZDwvY29kZT4gaW4gdGhhdCBpdCBpZ25vcmVzIHRoZQotICogJmx0O2Zvcm1hdHMvJmd0OyBzZWN0aW9uIG9mIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yLCBhbmQgZm9yY2VzIHRoZSBhc3NlbWJseSB0byBiZSBjcmVhdGVkIGFzIGEgZGlyZWN0b3J5IGluIHRoZQotICogcHJvamVjdCdzIGJ1aWxkLW91dHB1dCBkaXJlY3RvcnkgKHVzdWFsbHkgPGNvZGU+Li90YXJnZXQ8L2NvZGU+KS4gPGJyLz4KLSAqIDxwLz4KLSAqIFRoaXMgZ29hbCBpcyBhbHNvIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSA8Y29kZT5hc3NlbWJseTphdHRhY2hlZDwvY29kZT4gZ29hbCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotICogPGNvZGU+ZGlyPC9jb2RlPiBhc3NlbWJseSBmb3JtYXQuIDxici8+Ci0gKiA8cC8+Ci0gKiA8Yj5OT1RFOjwvYj4gVGhpcyBnb2FsIHNob3VsZCBPTkxZIGJlIHJ1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBpZiBidWlsZGluZyBhIG11bHRpbW9kdWxlIHByb2plY3QgaXQgc2hvdWxkIGJlCi0gKiB1c2VkIGZyb20gdGhlIHJvb3QgUE9NLiBVc2UgdGhlIDxjb2RlPmFzc2VtYmx5OmRpcmVjdG9yeS1zaW5nbGU8L2NvZGU+IGdvYWwgZm9yIGJpbmRpbmcgeW91ciBhc3NlbWJseSB0byB0aGUKLSAqIGxpZmVjeWNsZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZGNhc2V5QGFwYWNoZS5vcmciPkpvaG4gQ2FzZXk8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpnc2Nva2FydEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPkdpbGxlcyBTY29rYXJ0PC9hPgotICogQHZlcnNpb24gJElkJAotICogQGRlcHJlY2F0ZWQgVXNlIGFzc2VtYmx5OnNpbmdsZSBhbmQgYW4gYXNzZW1ibHkgd2l0aCBmb3JtYXQgPT0gZGlyIGluc3RlYWQhIFRoaXMgbW9qbyBpcyByZWR1bmRhbnQsIGFuZCBsZWFkcyB0bwotICogbm9uLXN0YW5kYXJkIGJ1aWxkcy4KLSAqLwotQE1vam8oIG5hbWUgPSAiZGlyZWN0b3J5LWlubGluZSIsIGFnZ3JlZ2F0b3IgPSB0cnVlLCBpbmhlcml0QnlEZWZhdWx0ID0gZmFsc2UgKQotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlJbmxpbmVNb2pvCi0gICAgZXh0ZW5kcyBBYnN0cmFjdERpcmVjdG9yeU1vam8KLXsKLSAgICAvKioKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0fSIsIHJlYWRvbmx5ID0gdHJ1ZSwgcmVxdWlyZWQgPSB0cnVlICkKLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL0RpcmVjdG9yeU1vam8uamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9tb2pvcy9EaXJlY3RvcnlNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzYjQ1OWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL0RpcmVjdG9yeU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9qb3M7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuRXhlY3V0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTGlmZWN5Y2xlUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLk1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLlBhcmFtZXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi0vKioKLSAqIExpa2UgdGhlIDxjb2RlPmFzc2VtYmx5OmF0dGFjaGVkPC9jb2RlPiBnb2FsLCBhc3NlbWJsZSBhbiBhcHBsaWNhdGlvbiBidW5kbGUgb3IgZGlzdHJpYnV0aW9uIHVzaW5nIGFuIGFzc2VtYmx5Ci0gKiBkZXNjcmlwdG9yIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBnb2FsIHdpbGwgZm9yY2UgTWF2ZW4gdG8gYnVpbGQgYWxsIGluY2x1ZGVkIFBPTXMgdXAgdG8gdGhlCi0gKiA8Y29kZT5wYWNrYWdlPC9jb2RlPiBwaGFzZSBCRUZPUkUgdGhlIGFzc2VtYmx5IGlzIHByb2Nlc3NlZC4gVGhpcyBnb2FsIGRpZmZlcnMgZnJvbSA8Y29kZT5hc3NlbWJseTphc3NlbWJseTwvY29kZT4gaW4KLSAqIHRoYXQgaXQgaWdub3JlcyB0aGUgJmx0O2Zvcm1hdHMvJmd0OyBzZWN0aW9uIG9mIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yLCBhbmQgZm9yY2VzIHRoZSBhc3NlbWJseSB0byBiZSBjcmVhdGVkIGFzIGEKLSAqIGRpcmVjdG9yeSBpbiB0aGUgcHJvamVjdCdzIGJ1aWxkLW91dHB1dCBkaXJlY3RvcnkgKHVzdWFsbHkgPGNvZGU+Li90YXJnZXQ8L2NvZGU+KS4gPGJyLz4KLSAqIDxwLz4KLSAqIFRoaXMgZ29hbCBpcyBhbHNvIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIHVzaW5nIHRoZSA8Y29kZT5hc3NlbWJseTphc3NlbWJseTwvY29kZT4gZ29hbCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZQotICogPGNvZGU+ZGlyPC9jb2RlPiBhc3NlbWJseSBmb3JtYXQuIDxici8+Ci0gKiA8cC8+Ci0gKiA8Yj5OT1RFOjwvYj4gVGhpcyBnb2FsIHNob3VsZCBPTkxZIGJlIHJ1biBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGFuZCBpZiBidWlsZGluZyBhIG11bHRpbW9kdWxlIHByb2plY3QgaXQgc2hvdWxkIGJlCi0gKiB1c2VkIGZyb20gdGhlIHJvb3QgUE9NLiBVc2UgdGhlIDxjb2RlPmFzc2VtYmx5OmRpcmVjdG9yeS1zaW5nbGU8L2NvZGU+IGdvYWwgZm9yIGJpbmRpbmcgeW91ciBhc3NlbWJseSB0byB0aGUKLSAqIGxpZmVjeWNsZS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZGNhc2V5QGFwYWNoZS5vcmciPkpvaG4gQ2FzZXk8L2E+Ci0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZGVwcmVjYXRlZCBVc2UgYXNzZW1ibHk6c2luZ2xlIGFuZCBhbiBhc3NlbWJseSB3aXRoIGZvcm1hdCA9PSBkaXIgaW5zdGVhZCEgVGhpcyBtb2pvIGlzIHJlZHVuZGFudC4KLSAqLwotQE1vam8oIG5hbWUgPSAiZGlyZWN0b3J5IiwgYWdncmVnYXRvciA9IHRydWUsIGluaGVyaXRCeURlZmF1bHQgPSBmYWxzZSApCi1ARXhlY3V0ZSggcGhhc2UgPSBMaWZlY3ljbGVQaGFzZS5QQUNLQUdFICkKLUBEZXByZWNhdGVkCi1wdWJsaWMgY2xhc3MgRGlyZWN0b3J5TW9qbwotICAgIGV4dGVuZHMgQWJzdHJhY3REaXJlY3RvcnlNb2pvCi17Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBleGVjdXRlZCBwcm9qZWN0IGZyb20gdGhlIGZvcmtlZCBsaWZlY3ljbGUuCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggcHJvcGVydHkgPSAiZXhlY3V0ZWRQcm9qZWN0IiApCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgZXhlY3V0ZWRQcm9qZWN0OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBleGVjdXRlZFByb2plY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL0RpcmVjdG9yeVNpbmdsZU1vam8uamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9tb2pvcy9EaXJlY3RvcnlTaW5nbGVNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3OTY0NWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL0RpcmVjdG9yeVNpbmdsZU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9qb3M7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8qKgotICogTGlrZSB0aGUgPGNvZGU+YXNzZW1ibHk6YXR0YWNoZWQ8L2NvZGU+IGdvYWwsIGFzc2VtYmxlIGFuIGFwcGxpY2F0aW9uIGJ1bmRsZSBvciBkaXN0cmlidXRpb24gZnJvbSBhbiBhc3NlbWJseQotICogZGVzY3JpcHRvci4gVGhpcyBnb2FsIGlzIHN1aXRhYmxlIGVpdGhlciBmb3IgYmluZGluZyB0byB0aGUgbGlmZWN5Y2xlIG9yIGNhbGxpbmcgZGlyZWN0bHkgZnJvbSB0aGUgY29tbWFuZCBsaW5lCi0gKiAocHJvdmlkZWQgYWxsIHJlcXVpcmVkIGZpbGVzIGFyZSBhdmFpbGFibGUgYmVmb3JlIHRoZSBidWlsZCBzdGFydHMsIG9yIGFyZSBwcm9kdWNlZCBieSBhbm90aGVyIGdvYWwgc3BlY2lmaWVkIGJlZm9yZQotICogdGhpcyBvbmUgb24gdGhlIGNvbW1hbmQgbGluZSkuIDxici8+Ci0gKiA8cC8+Ci0gKiBUaGlzIGdvYWwgZGlmZmVycyBmcm9tIDxjb2RlPmFzc2VtYmx5OnNpbmdsZTwvY29kZT4gaW4gdGhhdCBpdCBpZ25vcmVzIHRoZSAmbHQ7Zm9ybWF0cy8mZ3Q7IHNlY3Rpb24gb2YgdGhlIGFzc2VtYmx5Ci0gKiBkZXNjcmlwdG9yLCBhbmQgZm9yY2VzIHRoZSBhc3NlbWJseSB0byBiZSBjcmVhdGVkIGFzIGEgZGlyZWN0b3J5IGluIHRoZSBwcm9qZWN0J3MgYnVpbGQtb3V0cHV0IGRpcmVjdG9yeSAodXN1YWxseQotICogPGNvZGU+Li90YXJnZXQ8L2NvZGU+KS4KLSAqCi0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpqZGNhc2V5QGFwYWNoZS5vcmciPkpvaG4gQ2FzZXk8L2E+Ci0gKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzpnc2Nva2FydEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQiPkdpbGxlcyBTY29rYXJ0PC9hPgotICogQHZlcnNpb24gJElkJAotICogQGRlcHJlY2F0ZWQgVXNlIGFzc2VtYmx5OnNpbmdsZSBhbmQgYW4gYXNzZW1ibHkgd2l0aCBmb3JtYXQgPT0gZGlyIGluc3RlYWQhIFRoaXMgbW9qbyBpcyByZWR1bmRhbnQuCi0gKi8KLUBNb2pvKCBuYW1lID0gImRpcmVjdG9yeS1zaW5nbGUiLCBpbmhlcml0QnlEZWZhdWx0ID0gZmFsc2UgKQotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBEaXJlY3RvcnlTaW5nbGVNb2pvCi0gICAgZXh0ZW5kcyBBYnN0cmFjdERpcmVjdG9yeU1vam8KLXsKLSAgICAvKioKLSAgICAgKi8KLSAgICBAUGFyYW1ldGVyKCBkZWZhdWx0VmFsdWUgPSAiJHtwcm9qZWN0fSIsIHJlYWRvbmx5ID0gdHJ1ZSwgcmVxdWlyZWQgPSB0cnVlICkKLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL1NpbmdsZUFzc2VtYmx5TW9qby5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL1NpbmdsZUFzc2VtYmx5TW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNkOTFjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9tb2pvcy9TaW5nbGVBc3NlbWJseU1vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9qb3M7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5SZXNvbHV0aW9uU2NvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBBc3NlbWJsZSBhbiBhcHBsaWNhdGlvbiBidW5kbGUgb3IgZGlzdHJpYnV0aW9uIGZyb20gYW4gYXNzZW1ibHkgZGVzY3JpcHRvci4gVGhpcyBnb2FsIGlzIHN1aXRhYmxlIGVpdGhlciBmb3IgYmluZGluZwotICogdG8gdGhlIGxpZmVjeWNsZSBvciBjYWxsaW5nIGRpcmVjdGx5IGZyb20gdGhlIGNvbW1hbmQgbGluZSAocHJvdmlkZWQgYWxsIHJlcXVpcmVkIGZpbGVzIGFyZSBhdmFpbGFibGUgYmVmb3JlIHRoZQotICogYnVpbGQgc3RhcnRzLCBvciBhcmUgcHJvZHVjZWQgYnkgYW5vdGhlciBnb2FsIHNwZWNpZmllZCBiZWZvcmUgdGhpcyBvbmUgb24gdGhlIGNvbW1hbmQgbGluZSkuCi0gKgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86amRjYXNleUBhcGFjaGUub3JnIj5Kb2huIENhc2V5PC9hPgotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86YnJldHRAYXBhY2hlLm9yZyI+QnJldHQgUG9ydGVyPC9hPgotICogQHZlcnNpb24gJElkJAotICovCi1ATW9qbyggbmFtZSA9ICJzaW5nbGUiLCBpbmhlcml0QnlEZWZhdWx0ID0gZmFsc2UsIHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gPSBSZXNvbHV0aW9uU2NvcGUuQ09NUElMRSwKLSAgICAgICB0aHJlYWRTYWZlID0gdHJ1ZSApCi1wdWJsaWMgY2xhc3MgU2luZ2xlQXNzZW1ibHlNb2pvCi0gICAgZXh0ZW5kcyBBYnN0cmFjdEFzc2VtYmx5TW9qbwotewotICAgIC8qKgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICIke3Byb2plY3R9IiwgcmVhZG9ubHkgPSB0cnVlLCByZXF1aXJlZCA9IHRydWUgKQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWF2ZW5Qcm9qZWN0IGdldFByb2plY3QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL1VucGFja01vam8uamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9tb2pvcy9VbnBhY2tNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YjhkNGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L21vam9zL1VucGFja01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vam9zOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVFeHBhbnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuQXNzZW1ibHlGaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5SZXNvbHV0aW9uU2NvcGU7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuQXJjaGl2ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIubWFuYWdlci5Ob1N1Y2hBcmNoaXZlckV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIFVucGFjayBwcm9qZWN0IGRlcGVuZGVuY2llcy4gQ3VycmVudGx5IHN1cHBvcnRzIGRlcGVuZGVuY2llcyBvZiB0eXBlIGphciBhbmQgemlwLgotICoKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBkZXByZWNhdGVkIFVzZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM6bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW4gZ29hbDogdW5wYWNrIG9yIHVucGFjay1kZXBlbmRlbmNpZXMgaW5zdGVhZC4KLSAqLwotQE1vam8oIG5hbWUgPSAidW5wYWNrIiwgcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiA9IFJlc29sdXRpb25TY29wZS5URVNULCBpbmhlcml0QnlEZWZhdWx0ID0gZmFsc2UgKQotQERlcHJlY2F0ZWQKLXB1YmxpYyBjbGFzcyBVbnBhY2tNb2pvCi0gICAgZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLQotICAgIC8qKgotICAgICAqLwotICAgIEBQYXJhbWV0ZXIoIGRlZmF1bHRWYWx1ZSA9ICIke3Byb2plY3R9IiwgcmVhZG9ubHkgPSB0cnVlLCByZXF1aXJlZCA9IHRydWUgKQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgICAvKioKLSAgICAgKi8KLSAgICBAQ29tcG9uZW50Ci0gICAgcHJpdmF0ZSBBcmNoaXZlck1hbmFnZXIgYXJjaGl2ZXJNYW5hZ2VyOwotCi0gICAgLyoqCi0gICAgICogRGlyZWN0b3J5IHRvIHVucGFjayBKQVJzIGludG8gaWYgbmVlZGVkCi0gICAgICovCi0gICAgQFBhcmFtZXRlciggZGVmYXVsdFZhbHVlID0gIiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2Fzc2VtYmx5L3dvcmsiLCByZXF1aXJlZCA9IHRydWUgKQotICAgIHByb3RlY3RlZCBGaWxlIHdvcmtEaXJlY3Rvcnk7Ci0KLSAgICAvKioKLSAgICAgKiBVbnBhY2tzIHRoZSBhcmNoaXZlIGZpbGUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgICAgKi8KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggIlJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQiICkKLSAgICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICAgICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IGRlcGVuZGVuY2llcyA9IG5ldyBMaW5rZWRIYXNoU2V0PEFydGlmYWN0PigpOwotCi0gICAgICAgIGlmICggcHJvamVjdC5nZXRBcnRpZmFjdCgpICE9IG51bGwgJiYgcHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldEZpbGUoKSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmFkZCggcHJvamVjdC5nZXRBcnRpZmFjdCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyggInVuY2hlY2tlZCIgKSBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IHByb2plY3RBcnRpZmFjdHMgPSBwcm9qZWN0LmdldEFydGlmYWN0cygpOwotICAgICAgICBpZiAoIHByb2plY3RBcnRpZmFjdHMgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlcGVuZGVuY2llcy5hZGRBbGwoIHByb2plY3RBcnRpZmFjdHMgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0IDogZGVwZW5kZW5jaWVzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBhcnRpZmFjdC5nZXRGaWxlKCkuZ2V0TmFtZSgpOwotCi0gICAgICAgICAgICBmaW5hbCBGaWxlIHRlbXBMb2NhdGlvbiA9IG5ldyBGaWxlKCB3b3JrRGlyZWN0b3J5LCBuYW1lLnN1YnN0cmluZyggMCwgbmFtZS5sYXN0SW5kZXhPZiggJy4nICkgKSApOwotICAgICAgICAgICAgYm9vbGVhbiBwcm9jZXNzID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoICF0ZW1wTG9jYXRpb24uZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRlbXBMb2NhdGlvbi5ta2RpcnMoKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKCBhcnRpZmFjdC5nZXRGaWxlKCkubGFzdE1vZGlmaWVkKCkgPiB0ZW1wTG9jYXRpb24ubGFzdE1vZGlmaWVkKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHByb2Nlc3MgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IGFydGlmYWN0LmdldEZpbGUoKTsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VtYmx5RmlsZVV0aWxzLnVucGFjayggZmlsZSwgdGVtcExvY2F0aW9uLCBhcmNoaXZlck1hbmFnZXIgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oICJTa2lwIHVucGFja2luZyBkZXBlbmRlbmN5IGZpbGUgd2l0aCB1bmtub3duIGV4dGVuc2lvbjogIiArIGZpbGUuZ2V0UGF0aCgpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZUV4cGFuc2lvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgdW5wYWNraW5nIGRlcGVuZGVuY3kgZmlsZTogIiArIGZpbGUsIGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvcmVzb2x2ZWQvQXNzZW1ibHlJZC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Jlc29sdmVkL0Fzc2VtYmx5SWQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwNTYzNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvcmVzb2x2ZWQvQXNzZW1ibHlJZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5yZXNvbHZlZDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgY2xhc3MgQXNzZW1ibHlJZAotewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkOwotCi0gICAgcHJpdmF0ZSBBc3NlbWJseUlkKCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgdGhpcy5pZCA9IGlkOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXNzZW1ibHlJZCBjcmVhdGVBc3NlbWJseUlkKCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBc3NlbWJseUlkKCBpZCApOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgQXNzZW1ibHlJZCBjcmVhdGVBc3NlbWJseUlkKCBBc3NlbWJseSBpZCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEFzc2VtYmx5SWQoIGlkLmdldElkKCkgKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpZDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvQXNzZW1ibHlGaWxlVXRpbHMuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9Bc3NlbWJseUZpbGVVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjRjYzlhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9Bc3NlbWJseUZpbGVVdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHM7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVFeHBhbnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLlVuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLkFyY2hpdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLmZpbGVzZWxlY3RvcnMuRmlsZUluZm87Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQXNzZW1ibHlGaWxlVXRpbHMKLXsKLQotICAgIHByaXZhdGUgQXNzZW1ibHlGaWxlVXRpbHMoKQotICAgIHsKLSAgICAgICAgLy8gbm8gb3AKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBtYWtlUGF0aFJlbGF0aXZlVG8oIFN0cmluZyBwYXRoLCBmaW5hbCBGaWxlIGJhc2VkaXIgKQotICAgIHsKLSAgICAgICAgaWYgKCBiYXNlZGlyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gcGF0aDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggcGF0aCA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXRoID0gcGF0aC50cmltKCk7Ci0KLSAgICAgICAgU3RyaW5nIGJhc2UgPSBiYXNlZGlyLmdldEFic29sdXRlUGF0aCgpOwotICAgICAgICBpZiAoIHBhdGguc3RhcnRzV2l0aCggYmFzZSApICkKLSAgICAgICAgewotICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKCBiYXNlLmxlbmd0aCgpICk7Ci0gICAgICAgICAgICBpZiAoIHBhdGgubGVuZ3RoKCkgPiAwICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIHBhdGguc3RhcnRzV2l0aCggIi8iICkgfHwgcGF0aC5zdGFydHNXaXRoKCAiXFwiICkgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKCAxICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHBhdGgubGVuZ3RoKCkgPT0gMCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcGF0aCA9ICIuIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIW5ldyBGaWxlKCBwYXRoICkuaXNBYnNvbHV0ZSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgcGF0aCA9IHBhdGgucmVwbGFjZSggJ1xcJywgJy8nICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcGF0aDsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyggIlJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQiICkKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmVyaWZ5VGVtcERpcmVjdG9yeUF2YWlsYWJpbGl0eSggQE5vbm51bGwgZmluYWwgRmlsZSB0ZW1wRGlyICkKLSAgICB7Ci0gICAgICAgIGlmICggIXRlbXBEaXIuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wRGlyLm1rZGlycygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVW5wYWNrcyB0aGUgYXJjaGl2ZSBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtIHNvdXJjZSAgRmlsZSB0byBiZSB1bnBhY2tlZC4KLSAgICAgKiBAcGFyYW0gZGVzdERpciBMb2NhdGlvbiB3aGVyZSB0byBwdXQgdGhlIHVucGFja2VkIGZpbGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1bnBhY2soIEZpbGUgc291cmNlLCBGaWxlIGRlc3REaXIsIEFyY2hpdmVyTWFuYWdlciBhcmNoaXZlck1hbmFnZXIgKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUV4cGFuc2lvbkV4Y2VwdGlvbiwgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBVbkFyY2hpdmVyIHVuQXJjaGl2ZXIgPSBhcmNoaXZlck1hbmFnZXIuZ2V0VW5BcmNoaXZlciggc291cmNlICk7Ci0KLSAgICAgICAgICAgIHVuQXJjaGl2ZXIuc2V0U291cmNlRmlsZSggc291cmNlICk7Ci0KLSAgICAgICAgICAgIHVuQXJjaGl2ZXIuc2V0RGVzdERpcmVjdG9yeSggZGVzdERpciApOwotCi0gICAgICAgICAgICB1bkFyY2hpdmVyLmV4dHJhY3QoKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgQXJjaGl2ZUV4cGFuc2lvbkV4Y2VwdGlvbiggIkVycm9yIHVucGFja2luZyBmaWxlOiAiICsgc291cmNlICsgInRvOiAiICsgZGVzdERpciwgZSApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE5vbm51bGwKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplUGF0aCggQE5vbm51bGwgU3RyaW5nIHBhdGggKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSggJ1xcJywgJy8nICk7Ci0gICAgfQotCi0gICAgQE5vbm51bGwKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3JtYWxpemVGaWxlSW5mbyggQE5vbm51bGwgRmlsZUluZm8gZmlsZUluZm8gKQotICAgIHsKLSAgICAgICAgU3RyaW5nIG5hbWUgPSBmaWxlSW5mby5nZXROYW1lKCk7Ci0gICAgICAgIG5hbWUgPSBub3JtYWxpemVQYXRoKCBuYW1lICk7Ci0gICAgICAgIHJldHVybiBuYW1lLnJlcGxhY2UoIEZpbGUuc2VwYXJhdG9yQ2hhciwgJy8nICk7IC8vIEhvdyBjYW4gdGhpcyBiZSBhbnl0aGluZyBidXQgYSBuby1vcAotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3BlcnR5RmlsZSggU3RyaW5nIHNvdXJjZU5hbWUgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZU5hbWUudG9Mb3dlckNhc2UoIExvY2FsZS5FTkdMSVNIICkuZW5kc1dpdGgoICIucHJvcGVydGllcyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcm9wZXJ0eUZpbGUoIEZpbGUgZmlsZSApCi0gICAgewotICAgICAgICByZXR1cm4gaXNQcm9wZXJ0eUZpbGUoIGZpbGUuZ2V0TmFtZSgpICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0Fzc2VtYmx5Rm9ybWF0VXRpbHMuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9Bc3NlbWJseUZvcm1hdFV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhMWE0OTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0Fzc2VtYmx5Rm9ybWF0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyOCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmV4ZWN1dGlvbi5NYXZlblNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQudXRpbHMuT3M7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5QcmVmaXhlZE9iamVjdFZhbHVlU291cmNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5QcmVmaXhlZFByb3BlcnRpZXNWYWx1ZVNvdXJjZTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmludGVycG9sYXRpb24uZml4ZWQuUHJvcGVydGllc0Jhc2VkVmFsdWVTb3VyY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuU3RyaW5nVXRpbHM7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7Ci1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBBc3NlbWJseUZvcm1hdFV0aWxzCi17Ci0KLSAgICBwcml2YXRlIEFzc2VtYmx5Rm9ybWF0VXRpbHMoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgZGlzdHJpYnV0aW9uIGFydGlmYWN0Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gYXNzZW1ibHkgdGhlIGFzc2VtYmx5Ci0gICAgICogQHJldHVybiB0aGUgZGlzdHJpYnV0aW9uIG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREaXN0cmlidXRpb25OYW1lKCBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSwgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGZpbmFsTmFtZSA9IGNvbmZpZ1NvdXJjZS5nZXRGaW5hbE5hbWUoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBhcHBlbmRBc3NlbWJseUlkID0gY29uZmlnU291cmNlLmlzQXNzZW1ibHlJZEFwcGVuZGVkKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjbGFzc2lmaWVyID0gY29uZmlnU291cmNlLmdldENsYXNzaWZpZXIoKTsKLQotICAgICAgICBTdHJpbmcgZGlzdHJpYnV0aW9uTmFtZSA9IGZpbmFsTmFtZTsKLSAgICAgICAgaWYgKCBhcHBlbmRBc3NlbWJseUlkICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCAhU3RyaW5nVXRpbHMuaXNFbXB0eSggYXNzZW1ibHkuZ2V0SWQoKSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkaXN0cmlidXRpb25OYW1lID0gZmluYWxOYW1lICsgIi0iICsgYXNzZW1ibHkuZ2V0SWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICggY2xhc3NpZmllciAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZGlzdHJpYnV0aW9uTmFtZSA9IGZpbmFsTmFtZSArICItIiArIGNsYXNzaWZpZXI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZGlzdHJpYnV0aW9uTmFtZTsKLSAgICB9Ci0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIHN0YXRpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBmaW5hbE5hbWVJbnRlcnBvbGF0b3IoIFN0cmluZyBmaW5hbE5hbWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgUHJvcGVydGllcyBzcGVjaWFsRXhwcmVzc2lvbk92ZXJyaWRlcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0KLSAgICAgICAgaWYgKCBmaW5hbE5hbWUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNwZWNpYWxFeHByZXNzaW9uT3ZlcnJpZGVzLnNldFByb3BlcnR5KCAiZmluYWxOYW1lIiwgZmluYWxOYW1lICk7Ci0gICAgICAgICAgICBzcGVjaWFsRXhwcmVzc2lvbk92ZXJyaWRlcy5zZXRQcm9wZXJ0eSggImJ1aWxkLmZpbmFsTmFtZSIsIGZpbmFsTmFtZSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmVtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCBuZXcgUHJvcGVydGllc0Jhc2VkVmFsdWVTb3VyY2UoIHNwZWNpYWxFeHByZXNzaW9uT3ZlcnJpZGVzICkgKTsKLSAgICB9Ci0KLSAgICBATm9ubnVsbAotICAgIHB1YmxpYyBzdGF0aWMgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciggZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZVByb2plY3QgKQotICAgIHsKLSAgICAgICAgaWYgKCBtb2R1bGVQcm9qZWN0ICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlV2l0aFBlcm1pdHRlZE51bGxzKAotICAgICAgICAgICAgICAgIG5ldyBQcmVmaXhlZE9iamVjdFZhbHVlU291cmNlKCAibW9kdWxlLiIsIG1vZHVsZVByb2plY3QgKSwKLSAgICAgICAgICAgICAgICBuZXcgUHJlZml4ZWRQcm9wZXJ0aWVzVmFsdWVTb3VyY2UoICJtb2R1bGUucHJvcGVydGllcy4iLCBtb2R1bGVQcm9qZWN0LmdldFByb3BlcnRpZXMoKSApLAotICAgICAgICAgICAgICAgIG1vZHVsZVByb2plY3QuZ2V0QXJ0aWZhY3QoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgID8gbmV3IFByZWZpeGVkT2JqZWN0VmFsdWVTb3VyY2UoICJtb2R1bGUuIiwgbW9kdWxlUHJvamVjdC5nZXRBcnRpZmFjdCgpICkKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuZW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBtb2R1bGVBcnRpZmFjdEludGVycG9sYXRvciggQXJ0aWZhY3QgbW9kdWxlQXJ0aWZhY3QgKQotICAgIHsKLSAgICAgICAgaWYgKCBtb2R1bGVBcnRpZmFjdCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQ0hFQ0tTVFlMRV9PRkY6IExpbmVMZW5ndGgKLSAgICAgICAgICAgIHJldHVybiBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoIG5ldyBQcmVmaXhlZE9iamVjdFZhbHVlU291cmNlKCAibW9kdWxlLiIsIG1vZHVsZUFydGlmYWN0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJlZml4ZWRPYmplY3RWYWx1ZVNvdXJjZSggIm1vZHVsZS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZUFydGlmYWN0LmdldEFydGlmYWN0SGFuZGxlcigpICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJlZml4ZWRPYmplY3RWYWx1ZVNvdXJjZSggIm1vZHVsZS5oYW5kbGVyLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlQXJ0aWZhY3QuZ2V0QXJ0aWZhY3RIYW5kbGVyKCkgKSApOwotICAgICAgICAgICAgLy8gQ0hFQ0tTVFlMRV9PTjogTGluZUxlbmd0aAotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmVtcHR5KCk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIHN0YXRpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBhcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3IoIGZpbmFsIE1hdmVuUHJvamVjdCBhcnRpZmFjdFByb2plY3QgKQotICAgIHsKLSAgICAgICAgaWYgKCBhcnRpZmFjdFByb2plY3QgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByZWZpeGVkT2JqZWN0VmFsdWVTb3VyY2UgdnMgPSBudWxsOwotICAgICAgICAgICAgaWYgKCBhcnRpZmFjdFByb2plY3QuZ2V0QXJ0aWZhY3QoKSAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2cyA9IG5ldyBQcmVmaXhlZE9iamVjdFZhbHVlU291cmNlKCAiYXJ0aWZhY3QuIiwgYXJ0aWZhY3RQcm9qZWN0LmdldEFydGlmYWN0KCkgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZVdpdGhQZXJtaXR0ZWROdWxscygKLSAgICAgICAgICAgICAgICBuZXcgUHJlZml4ZWRPYmplY3RWYWx1ZVNvdXJjZSggImFydGlmYWN0LiIsIGFydGlmYWN0UHJvamVjdCApLAotICAgICAgICAgICAgICAgIG5ldyBQcmVmaXhlZFByb3BlcnRpZXNWYWx1ZVNvdXJjZSggImFydGlmYWN0LnByb3BlcnRpZXMuIiwgYXJ0aWZhY3RQcm9qZWN0LmdldFByb3BlcnRpZXMoKSApLCB2cyApOwotCi0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5lbXB0eSgpOwotICAgICAgICB9Ci0KLQotICAgIH0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIHN0YXRpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBhcnRpZmFjdEludGVycG9sYXRvciggQE5vbm51bGwgZmluYWwgQXJ0aWZhY3QgYXJ0aWZhY3QgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSggbmV3IFByZWZpeGVkT2JqZWN0VmFsdWVTb3VyY2UoICJhcnRpZmFjdC4iLCBhcnRpZmFjdCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJlZml4ZWRPYmplY3RWYWx1ZVNvdXJjZSggImFydGlmYWN0LiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdC5nZXRBcnRpZmFjdEhhbmRsZXIoKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJlZml4ZWRPYmplY3RWYWx1ZVNvdXJjZSggImFydGlmYWN0LmhhbmRsZXIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0LmdldEFydGlmYWN0SGFuZGxlcigpICkgKTsKLSAgICB9Ci0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIHN0YXRpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBjbGFzc2lmaWVyUnVsZXMoIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0ICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIFByb3BlcnRpZXMgc3BlY2lhbFJ1bGVzID0gbmV3IFByb3BlcnRpZXMoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NpZmllciA9IFByb2plY3RVdGlscy5nZXRDbGFzc2lmaWVyKCBhcnRpZmFjdCApOwotICAgICAgICBpZiAoIGNsYXNzaWZpZXIgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNwZWNpYWxSdWxlcy5zZXRQcm9wZXJ0eSggImRhc2hDbGFzc2lmaWVyPyIsICItIiArIGNsYXNzaWZpZXIgKTsKLSAgICAgICAgICAgIHNwZWNpYWxSdWxlcy5zZXRQcm9wZXJ0eSggImRhc2hDbGFzc2lmaWVyIiwgIi0iICsgY2xhc3NpZmllciApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgc3BlY2lhbFJ1bGVzLnNldFByb3BlcnR5KCAiZGFzaENsYXNzaWZpZXI/IiwgIiIgKTsKLSAgICAgICAgICAgIHNwZWNpYWxSdWxlcy5zZXRQcm9wZXJ0eSggImRhc2hDbGFzc2lmaWVyIiwgIiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoIG5ldyBQcm9wZXJ0aWVzQmFzZWRWYWx1ZVNvdXJjZSggc3BlY2lhbFJ1bGVzICkgKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE9SREVSIE9GIElOVEVSUE9MQVRJT04gUFJFQ0VERU5DRToKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPlN1cHBvcnQgZm9yIHNwZWNpYWwgZXhwcmVzc2lvbnMsIGxpa2UgJHtmaW5hbE5hbWV9ICh1c2UgdGhlIGFzc2VtYmx5IHBsdWdpbiBjb25maWd1cmF0aW9uIG5vdCB0aGUgYnVpbGQKLSAgICAgKiBjb25maWcpPC9saT4KLSAgICAgKiA8bGk+cHJlZml4ZWQgd2l0aCAibW9kdWxlLiIgaWYgbW9kdWxlUHJvamVjdCBpcyBub24tbnVsbAotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+TWF2ZW5Qcm9qZWN0IGluc3RhbmNlIGZvciBtb2R1bGUgYmVpbmcgYXNzZW1ibGVkPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPnByZWZpeGVkIHdpdGggImFydGlmYWN0LiIgaWYgYXJ0aWZhY3RQcm9qZWN0IGlzIG5vbi1udWxsCi0gICAgICogPG9sPgotICAgICAqIDxsaT5NYXZlblByb2plY3QgaW5zdGFuY2UgZm9yIGFydGlmYWN0PC9saT4KLSAgICAgKiA8L29sPgotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPnVzZXItZGVmaW5lZCBwcm9wZXJ0aWVzIGZyb20gdGhlIGNvbW1hbmQgbGluZTwvbGk+Ci0gICAgICogPGxpPnByZWZpeGVkIHdpdGggInBvbS4iIG9yICJwcm9qZWN0LiIsIG9yIG5vIHByZWZpeCBhdCBhbGwKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPk1hdmVuUHJvamVjdCBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgYnVpbGQ8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPC9saT4KLSAgICAgKiA8bGk+cHJvcGVydGllcyBmcm9tIG1haW4gcHJvamVjdDwvbGk+Ci0gICAgICogPGxpPnN5c3RlbSBwcm9wZXJ0aWVzLCBmcm9tIHRoZSBNYXZlblNlc3Npb24gaW5zdGFuY2UgKHRvIHN1cHBvcnQgSURFcyk8L2xpPgotICAgICAqIDxsaT5lbnZpcm9ubWVudCB2YXJpYWJsZXMuPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSggZmluYWwgU3RyaW5nIG91dHB1dCwgZmluYWwgTWF2ZW5Qcm9qZWN0IGFydGlmYWN0UHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaW5hbE5hbWUsIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldE91dHB1dERpcmVjdG9yeSggb3V0cHV0LCBmaW5hbE5hbWUsIGNvbmZpZ1NvdXJjZSwgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciggbnVsbCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3IoIGFydGlmYWN0UHJvamVjdCApICk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBleGVjdXRpb25Qcm9wZXJ0aWVzSW50ZXJwb2xhdG9yKAotICAgICAgICBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgewotICAgICAgICBNYXZlblNlc3Npb24gc2Vzc2lvbjsKLQotICAgICAgICBpZiAoIGNvbmZpZ1NvdXJjZSAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgc2Vzc2lvbiA9IGNvbmZpZ1NvdXJjZS5nZXRNYXZlblNlc3Npb24oKTsKLQotICAgICAgICAgICAgaWYgKCBzZXNzaW9uICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgdXNlclByb3BlcnRpZXMgPSBzZXNzaW9uLmdldEV4ZWN1dGlvblByb3BlcnRpZXMoKTsgLy8gdGhpcyBpcyBhZGRlZCB0d2ljZS4uLi4KLQotICAgICAgICAgICAgICAgIGlmICggdXNlclByb3BlcnRpZXMgIT0gbnVsbCApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCBuZXcgUHJvcGVydGllc0Jhc2VkVmFsdWVTb3VyY2UoIHVzZXJQcm9wZXJ0aWVzICkgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmVtcHR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgbWFpblByb2plY3RPbmx5SW50ZXJwb2xhdG9yKCBNYXZlblByb2plY3QgbWFpblByb2plY3QgKQotICAgIHsKLSAgICAgICAgaWYgKCBtYWluUHJvamVjdCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gNQotICAgICAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSgKLSAgICAgICAgICAgICAgICBuZXcgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLlByZWZpeGVkT2JqZWN0VmFsdWVTb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgIEludGVycG9sYXRpb25Db25zdGFudHMuUFJPSkVDVF9QUkVGSVhFUywgbWFpblByb2plY3QsIHRydWUgKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmVtcHR5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIE9SREVSIE9GIElOVEVSUE9MQVRJT04gUFJFQ0VERU5DRToKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPnByZWZpeGVkIHdpdGggIm1vZHVsZS4iLCBpZiBtb2R1bGVQcm9qZWN0ICE9IG51bGwKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPkFydGlmYWN0IGluc3RhbmNlIGZvciBtb2R1bGUsIGlmIG1vZHVsZUFydGlmYWN0ICE9IG51bGw8L2xpPgotICAgICAqIDxsaT5BcnRpZmFjdEhhbmRsZXIgaW5zdGFuY2UgZm9yIG1vZHVsZSwgaWYgbW9kdWxlQXJ0aWZhY3QgIT0gbnVsbDwvbGk+Ci0gICAgICogPGxpPk1hdmVuUHJvamVjdCBpbnN0YW5jZSBmb3IgbW9kdWxlPC9saT4KLSAgICAgKiA8L29sPgotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPnByZWZpeGVkIHdpdGggImFydGlmYWN0LiIKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPkFydGlmYWN0IGluc3RhbmNlPC9saT4KLSAgICAgKiA8bGk+QXJ0aWZhY3RIYW5kbGVyIGluc3RhbmNlIGZvciBhcnRpZmFjdDwvbGk+Ci0gICAgICogPGxpPk1hdmVuUHJvamVjdCBpbnN0YW5jZSBmb3IgYXJ0aWZhY3Q8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPC9saT4KLSAgICAgKiA8bGk+cHJlZml4ZWQgd2l0aCAicG9tLiIgb3IgInByb2plY3QuIgotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+TWF2ZW5Qcm9qZWN0IGluc3RhbmNlIGZyb20gY3VycmVudCBidWlsZDwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKiA8L2xpPgotICAgICAqIDxsaT5ubyBwcmVmaXgsIHVzaW5nIG1haW4gcHJvamVjdCBpbnN0YW5jZQotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+TWF2ZW5Qcm9qZWN0IGluc3RhbmNlIGZyb20gY3VycmVudCBidWlsZDwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKiA8L2xpPgotICAgICAqIDxsaT5TdXBwb3J0IGZvciBzcGVjaWFsIGV4cHJlc3Npb25zLCBsaWtlICR7ZGFzaENsYXNzaWZpZXI/fTwvbGk+Ci0gICAgICogPGxpPnVzZXItZGVmaW5lZCBwcm9wZXJ0aWVzIGZyb20gdGhlIGNvbW1hbmQgbGluZTwvbGk+Ci0gICAgICogPGxpPnByb3BlcnRpZXMgZnJvbSBtYWluIHByb2plY3Q8L2xpPgotICAgICAqIDxsaT5zeXN0ZW0gcHJvcGVydGllcywgZnJvbSB0aGUgTWF2ZW5TZXNzaW9uIGluc3RhbmNlICh0byBzdXBwb3J0IElERXMpPC9saT4KLSAgICAgKiA8bGk+ZW52aXJvbm1lbnQgdmFyaWFibGVzLjwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKi8KLQotCi0gICAgQE5vbm51bGwKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmaXhSZWxhdGl2ZVJlZnMoIEBOb25udWxsIFN0cmluZyBzcmMgKQotICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gc3JjOwotCi0gICAgICAgIFN0cmluZ1tdIHNlcGFyYXRvcnMgPSB7ICIvIiwgIlxcIiB9OwotCi0gICAgICAgIFN0cmluZyBmaW5hbFNlcCA9IG51bGw7Ci0gICAgICAgIGZvciAoIFN0cmluZyBzZXAgOiBzZXBhcmF0b3JzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCB2YWx1ZS5lbmRzV2l0aCggc2VwICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsU2VwID0gc2VwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHZhbHVlLmNvbnRhaW5zKCAiLiIgKyBzZXAgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHBhcnRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgcGFydHMuYWRkQWxsKCBBcnJheXMuYXNMaXN0KCB2YWx1ZS5zcGxpdCggc2VwLnJlcGxhY2UoICJcXCIsICJcXFxcIiApICkgKSApOwotCi0gICAgICAgICAgICAgICAgZm9yICggTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBwYXJ0cy5saXN0SXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFydCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCAiLiIuZXF1YWxzKCBwYXJ0ICkgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggIi4uIi5lcXVhbHMoIHBhcnQgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpdC5oYXNQcmV2aW91cygpICkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC5wcmV2aW91cygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmdVdGlscy5qb2luKCBwYXJ0cy5pdGVyYXRvcigpLCBzZXAgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZmluYWxTZXAgIT0gbnVsbCAmJiB2YWx1ZS5sZW5ndGgoKSA+IDAgJiYgIXZhbHVlLmVuZHNXaXRoKCBmaW5hbFNlcCApICkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWUgKz0gZmluYWxTZXA7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBPUkRFUiBPRiBJTlRFUlBPTEFUSU9OIFBSRUNFREVOQ0U6Ci0gICAgICogPG9sPgotICAgICAqIDxsaT5wcmVmaXhlZCB3aXRoICJtb2R1bGUuIiwgaWYgbW9kdWxlUHJvamVjdCAhPSBudWxsCi0gICAgICogPG9sPgotICAgICAqIDxsaT5BcnRpZmFjdCBpbnN0YW5jZSBmb3IgbW9kdWxlLCBpZiBtb2R1bGVBcnRpZmFjdCAhPSBudWxsPC9saT4KLSAgICAgKiA8bGk+QXJ0aWZhY3RIYW5kbGVyIGluc3RhbmNlIGZvciBtb2R1bGUsIGlmIG1vZHVsZUFydGlmYWN0ICE9IG51bGw8L2xpPgotICAgICAqIDxsaT5NYXZlblByb2plY3QgaW5zdGFuY2UgZm9yIG1vZHVsZTwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKiA8L2xpPgotICAgICAqIDxsaT5wcmVmaXhlZCB3aXRoICJhcnRpZmFjdC4iCi0gICAgICogPG9sPgotICAgICAqIDxsaT5BcnRpZmFjdCBpbnN0YW5jZTwvbGk+Ci0gICAgICogPGxpPkFydGlmYWN0SGFuZGxlciBpbnN0YW5jZSBmb3IgYXJ0aWZhY3Q8L2xpPgotICAgICAqIDxsaT5NYXZlblByb2plY3QgaW5zdGFuY2UgZm9yIGFydGlmYWN0PC9saT4KLSAgICAgKiA8L29sPgotICAgICAqIDwvbGk+Ci0gICAgICogPGxpPnByZWZpeGVkIHdpdGggInBvbS4iIG9yICJwcm9qZWN0LiIKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPk1hdmVuUHJvamVjdCBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgYnVpbGQ8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPC9saT4KLSAgICAgKiA8bGk+bm8gcHJlZml4LCB1c2luZyBtYWluIHByb2plY3QgaW5zdGFuY2UKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPk1hdmVuUHJvamVjdCBpbnN0YW5jZSBmcm9tIGN1cnJlbnQgYnVpbGQ8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPC9saT4KLSAgICAgKiA8bGk+U3VwcG9ydCBmb3Igc3BlY2lhbCBleHByZXNzaW9ucywgbGlrZSAke2Rhc2hDbGFzc2lmaWVyP308L2xpPgotICAgICAqIDxsaT51c2VyLWRlZmluZWQgcHJvcGVydGllcyBmcm9tIHRoZSBjb21tYW5kIGxpbmU8L2xpPgotICAgICAqIDxsaT5wcm9wZXJ0aWVzIGZyb20gbWFpbiBwcm9qZWN0PC9saT4KLSAgICAgKiA8bGk+c3lzdGVtIHByb3BlcnRpZXMsIGZyb20gdGhlIE1hdmVuU2Vzc2lvbiBpbnN0YW5jZSAodG8gc3VwcG9ydCBJREVzKTwvbGk+Ci0gICAgICogPGxpPmVudmlyb25tZW50IHZhcmlhYmxlcy48L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXZhbHVhdGVGaWxlTmFtZU1hcHBpbmcoIGZpbmFsIFN0cmluZyBleHByZXNzaW9uLCBATm9ubnVsbCBmaW5hbCBBcnRpZmFjdCBhcnRpZmFjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIGZpbmFsIE1hdmVuUHJvamVjdCBtYWluUHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE51bGxhYmxlIGZpbmFsIEFydGlmYWN0IG1vZHVsZUFydGlmYWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9ubnVsbCBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbHVlID0gZXhwcmVzc2lvbjsKLQotICAgICAgICBmaW5hbCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPQotICAgICAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCBtb2R1bGVBcnRpZmFjdEludGVycG9sYXRvciggbW9kdWxlQXJ0aWZhY3QgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciwgYXJ0aWZhY3RJbnRlcnBvbGF0b3IoIGFydGlmYWN0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0UHJvamVjdEludGVycG9sYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpblByb2plY3RPbmx5SW50ZXJwb2xhdG9yKCBtYWluUHJvamVjdCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc2lmaWVyUnVsZXMoIGFydGlmYWN0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvblByb3BlcnRpZXNJbnRlcnBvbGF0b3IoIGNvbmZpZ1NvdXJjZSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdTb3VyY2UuZ2V0TWFpblByb2plY3RJbnRlcnBvbGF0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnU291cmNlLmdldENvbW1hbmRMaW5lUHJvcHNJbnRlcnBvbGF0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnU291cmNlLmdldEVudkludGVycG9sYXRvcigpICk7Ci0KLSAgICAgICAgdmFsdWUgPSBpbnRlcnBvbGF0b3IuaW50ZXJwb2xhdGUoIHZhbHVlICk7Ci0KLSAgICAgICAgdmFsdWUgPSBTdHJpbmdVdGlscy5yZXBsYWNlKCB2YWx1ZSwgIi8vIiwgIi8iICk7Ci0gICAgICAgIHZhbHVlID0gU3RyaW5nVXRpbHMucmVwbGFjZSggdmFsdWUsICJcXFxcIiwgIlxcIiApOwotICAgICAgICB2YWx1ZSA9IGZpeFJlbGF0aXZlUmVmcyggdmFsdWUgKTsKLQotICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogT1JERVIgT0YgSU5URVJQT0xBVElPTiBQUkVDRURFTkNFOgotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+U3VwcG9ydCBmb3Igc3BlY2lhbCBleHByZXNzaW9ucywgbGlrZSAke2ZpbmFsTmFtZX0gKHVzZSB0aGUgYXNzZW1ibHkgcGx1Z2luIGNvbmZpZ3VyYXRpb24gbm90IHRoZSBidWlsZAotICAgICAqIGNvbmZpZyk8L2xpPgotICAgICAqIDxsaT5wcmVmaXhlZCB3aXRoICJtb2R1bGUuIiBpZiBtb2R1bGVQcm9qZWN0IGlzIG5vbi1udWxsCi0gICAgICogPG9sPgotICAgICAqIDxsaT5NYXZlblByb2plY3QgaW5zdGFuY2UgZm9yIG1vZHVsZSBiZWluZyBhc3NlbWJsZWQ8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPC9saT4KLSAgICAgKiA8bGk+cHJlZml4ZWQgd2l0aCAiYXJ0aWZhY3QuIiBpZiBhcnRpZmFjdFByb2plY3QgaXMgbm9uLW51bGwKLSAgICAgKiA8b2w+Ci0gICAgICogPGxpPk1hdmVuUHJvamVjdCBpbnN0YW5jZSBmb3IgYXJ0aWZhY3Q8L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICogPC9saT4KLSAgICAgKiA8bGk+dXNlci1kZWZpbmVkIHByb3BlcnRpZXMgZnJvbSB0aGUgY29tbWFuZCBsaW5lPC9saT4KLSAgICAgKiA8bGk+cHJlZml4ZWQgd2l0aCAicG9tLiIgb3IgInByb2plY3QuIiwgb3Igbm8gcHJlZml4IGF0IGFsbAotICAgICAqIDxvbD4KLSAgICAgKiA8bGk+TWF2ZW5Qcm9qZWN0IGluc3RhbmNlIGZyb20gY3VycmVudCBidWlsZDwvbGk+Ci0gICAgICogPC9vbD4KLSAgICAgKiA8L2xpPgotICAgICAqIDxsaT5wcm9wZXJ0aWVzIGZyb20gbWFpbiBwcm9qZWN0PC9saT4KLSAgICAgKiA8bGk+c3lzdGVtIHByb3BlcnRpZXMsIGZyb20gdGhlIE1hdmVuU2Vzc2lvbiBpbnN0YW5jZSAodG8gc3VwcG9ydCBJREVzKTwvbGk+Ci0gICAgICogPGxpPmVudmlyb25tZW50IHZhcmlhYmxlcy48L2xpPgotICAgICAqIDwvb2w+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0T3V0cHV0RGlyZWN0b3J5KCBmaW5hbCBTdHJpbmcgb3V0cHV0LCBmaW5hbCBTdHJpbmcgZmluYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBtb2R1bGVQcm9qZWN0SW50cnBvbGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBhcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3IgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdmFsdWUgPSBvdXRwdXQ7Ci0gICAgICAgIGlmICggdmFsdWUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IgPQotICAgICAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCBmaW5hbE5hbWVJbnRlcnBvbGF0b3IoIGZpbmFsTmFtZSApLCBtb2R1bGVQcm9qZWN0SW50cnBvbGF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0UHJvamVjdEludGVycG9sYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uUHJvcGVydGllc0ludGVycG9sYXRvciggY29uZmlnU291cmNlICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1NvdXJjZS5nZXRNYWluUHJvamVjdEludGVycG9sYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdTb3VyY2UuZ2V0Q29tbWFuZExpbmVQcm9wc0ludGVycG9sYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdTb3VyY2UuZ2V0RW52SW50ZXJwb2xhdG9yKCkgKTsKLQotICAgICAgICB2YWx1ZSA9IGludGVycG9sYXRvci5pbnRlcnBvbGF0ZSggdmFsdWUgKTsKLQotICAgICAgICBpZiAoICggdmFsdWUubGVuZ3RoKCkgPiAwICkgJiYgIXZhbHVlLmVuZHNXaXRoKCAiLyIgKSAmJiAhdmFsdWUuZW5kc1dpdGgoICJcXCIgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhbHVlICs9ICIvIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKCB2YWx1ZS5sZW5ndGgoKSA+IDAgKSAmJiAoIHZhbHVlLnN0YXJ0c1dpdGgoICIvIiApIHx8IHZhbHVlLnN0YXJ0c1dpdGgoICJcXCIgKSApICkKLSAgICAgICAgewotICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoIDEgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gU3RyaW5nVXRpbHMucmVwbGFjZSggdmFsdWUsICIvLyIsICIvIiApOwotICAgICAgICB2YWx1ZSA9IFN0cmluZ1V0aWxzLnJlcGxhY2UoIHZhbHVlLCAiXFxcXCIsICJcXCIgKTsKLSAgICAgICAgdmFsdWUgPSBmaXhSZWxhdGl2ZVJlZnMoIHZhbHVlICk7Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuRm9yUGxhdGZvcm1TcGVjaWZpY3MoIExvZ2dlciBsb2dnZXIsIFN0cmluZyBkZXN0RGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIGlmICggT3MuaXNGYW1pbHkoIE9zLkZBTUlMWV9XSU5ET1dTICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGlzTGludXhSb290UmVmZXJlbmNlKCBkZXN0RGlyZWN0b3J5ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvciggIk9TPVdpbmRvd3MgYW5kIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIGNvbnRhaW5zIGEgKm5peC1zcGVjaWZpYyByb290LXJlbGF0aXZlLXJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgKHN0YXJ0aW5nIHdpdGggc2xhc2gpICIgKyBkZXN0RGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggaXNXaW5kb3dzUGF0aCggZGVzdERpcmVjdG9yeSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIud2FybiggIlRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIGNvbnRhaW5zIGEgKm5peC1zcGVjaWZpYyByb290LXJlbGF0aXZlLXJlZmVyZW5jZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiAoc3RhcnRpbmcgd2l0aCBzbGFzaCkuIFRoaXMgaXMgbm9uLXBvcnRhYmxlIGFuZCB3aWxsIGZhaWwgb24gd2luZG93cyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGRlc3REaXJlY3RvcnkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggaXNXaW5kb3dzUGF0aCggZGVzdERpcmVjdG9yeSApICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoCi0gICAgICAgICAgICAgICAgICAgICJPUz1Ob24tV2luZG93cyBhbmQgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IgY29udGFpbnMgYSB3aW5kb3dzLXNwZWNpZmljIGRpcmVjdG9yeSByZWZlcmVuY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgKHdpdGggYSBkcml2ZSBsZXR0ZXIpICIgKyBkZXN0RGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICggaXNMaW51eFJvb3RSZWZlcmVuY2UoIGRlc3REaXJlY3RvcnkgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oICJUaGUgYXNzZW1ibHkgZGVzY3JpcHRvciBjb250YWlucyBhIGZpbGVzeXN0ZW0tcm9vdCByZWxhdGl2ZSByZWZlcmVuY2UsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHdoaWNoIGlzIG5vdCBjcm9zcyBwbGF0Zm9ybSBjb21wYXRpYmxlICIgKyBkZXN0RGlyZWN0b3J5ICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBpc1dpbmRvd3NQYXRoKCBTdHJpbmcgZGVzdERpcmVjdG9yeSApCi0gICAgewotICAgICAgICByZXR1cm4gKCBkZXN0RGlyZWN0b3J5ICE9IG51bGwgJiYgZGVzdERpcmVjdG9yeS5sZW5ndGgoKSA+PSAyICYmIGRlc3REaXJlY3RvcnkuY2hhckF0KCAxICkgPT0gJzonICk7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2xlYW4gaXNMaW51eFJvb3RSZWZlcmVuY2UoIFN0cmluZyBkZXN0RGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoIGRlc3REaXJlY3RvcnkgIT0gbnVsbCAmJiBkZXN0RGlyZWN0b3J5LnN0YXJ0c1dpdGgoICIvIiApICk7Ci0gICAgfQotCi0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9GaWx0ZXJVdGlscy5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0ZpbHRlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzliNTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0ZpbHRlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuQW5kQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5hcnRpZmFjdC5maWx0ZXIuUGF0dGVybkV4Y2x1ZGVzQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuYXJ0aWZhY3QuZmlsdGVyLlBhdHRlcm5JbmNsdWRlc0FydGlmYWN0RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmFydGlmYWN0LmZpbHRlci5TdGF0aXN0aWNzUmVwb3J0aW5nQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRmlsdGVyVXRpbHMKLXsKLQotICAgIHByaXZhdGUgRmlsdGVyVXRpbHMoKQotICAgIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFNldDxNYXZlblByb2plY3Q+IGZpbHRlclByb2plY3RzKCBmaW5hbCBTZXQ8TWF2ZW5Qcm9qZWN0PiBwcm9qZWN0cywgZmluYWwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBleGNsdWRlcywgZmluYWwgYm9vbGVhbiBhY3RUcmFuc2l0aXZlbHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlciApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PFBhdHRlcm5JbmNsdWRlc0FydGlmYWN0RmlsdGVyPiBhbGxGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxQYXR0ZXJuSW5jbHVkZXNBcnRpZmFjdEZpbHRlcj4oKTsKLQotICAgICAgICBmaW5hbCBBbmRBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgQW5kQXJ0aWZhY3RGaWx0ZXIoKTsKLQotICAgICAgICBpZiAoICFpbmNsdWRlcy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBQYXR0ZXJuSW5jbHVkZXNBcnRpZmFjdEZpbHRlciBpbmNsdWRlRmlsdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgUGF0dGVybkluY2x1ZGVzQXJ0aWZhY3RGaWx0ZXIoIGluY2x1ZGVzLCBhY3RUcmFuc2l0aXZlbHkgKTsKLQotICAgICAgICAgICAgZmlsdGVyLmFkZCggaW5jbHVkZUZpbHRlciApOwotICAgICAgICAgICAgYWxsRmlsdGVycy5hZGQoIGluY2x1ZGVGaWx0ZXIgKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICFleGNsdWRlcy5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBQYXR0ZXJuRXhjbHVkZXNBcnRpZmFjdEZpbHRlciBleGNsdWRlRmlsdGVyID0KLSAgICAgICAgICAgICAgICBuZXcgUGF0dGVybkV4Y2x1ZGVzQXJ0aWZhY3RGaWx0ZXIoIGV4Y2x1ZGVzLCBhY3RUcmFuc2l0aXZlbHkgKTsKLQotICAgICAgICAgICAgZmlsdGVyLmFkZCggZXhjbHVkZUZpbHRlciApOwotICAgICAgICAgICAgYWxsRmlsdGVycy5hZGQoIGV4Y2x1ZGVGaWx0ZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFNldDxNYXZlblByb2plY3Q+IHJlc3VsdCA9IG5ldyBMaW5rZWRIYXNoU2V0PE1hdmVuUHJvamVjdD4oIHByb2plY3RzLnNpemUoKSApOwotICAgICAgICBmb3IgKCBNYXZlblByb2plY3QgcHJvamVjdCA6IHByb2plY3RzICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQXJ0aWZhY3QgYXJ0aWZhY3QgPSBwcm9qZWN0LmdldEFydGlmYWN0KCk7Ci0KLSAgICAgICAgICAgIGlmICggZmlsdGVyLmluY2x1ZGUoIGFydGlmYWN0ICkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoIHByb2plY3QgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoIGZpbmFsIFBhdHRlcm5JbmNsdWRlc0FydGlmYWN0RmlsdGVyIGYgOiBhbGxGaWx0ZXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBmICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGYucmVwb3J0TWlzc2VkQ3JpdGVyaWEoIGxvZ2dlciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGZpbHRlckFydGlmYWN0cyggZmluYWwgU2V0PEFydGlmYWN0PiBhcnRpZmFjdHMsIGZpbmFsIExpc3Q8U3RyaW5nPiBpbmNsdWRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gZXhjbHVkZXMsIGZpbmFsIGJvb2xlYW4gc3RyaWN0RmlsdGVyaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYWN0VHJhbnNpdGl2ZWx5LCBmaW5hbCBMb2dnZXIgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFydGlmYWN0RmlsdGVyLi4uIGFkZGl0aW9uYWxGaWx0ZXJzICkKLSAgICAgICAgdGhyb3dzIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PEFydGlmYWN0RmlsdGVyPiBhbGxGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdEZpbHRlcj4oKTsKLQotICAgICAgICBmaW5hbCBBbmRBcnRpZmFjdEZpbHRlciBmaWx0ZXIgPSBuZXcgQW5kQXJ0aWZhY3RGaWx0ZXIoKTsKLQotICAgICAgICBpZiAoIGFkZGl0aW9uYWxGaWx0ZXJzICE9IG51bGwgJiYgYWRkaXRpb25hbEZpbHRlcnMubGVuZ3RoID4gMCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoIGZpbmFsIEFydGlmYWN0RmlsdGVyIGFkZGl0aW9uYWxGaWx0ZXIgOiBhZGRpdGlvbmFsRmlsdGVycyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBhZGRpdGlvbmFsRmlsdGVyICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmFkZCggYWRkaXRpb25hbEZpbHRlciApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIWluY2x1ZGVzLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEFydGlmYWN0RmlsdGVyIGluY2x1ZGVGaWx0ZXIgPSBuZXcgUGF0dGVybkluY2x1ZGVzQXJ0aWZhY3RGaWx0ZXIoIGluY2x1ZGVzLCBhY3RUcmFuc2l0aXZlbHkgKTsKLQotICAgICAgICAgICAgZmlsdGVyLmFkZCggaW5jbHVkZUZpbHRlciApOwotCi0gICAgICAgICAgICBhbGxGaWx0ZXJzLmFkZCggaW5jbHVkZUZpbHRlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhZXhjbHVkZXMuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgQXJ0aWZhY3RGaWx0ZXIgZXhjbHVkZUZpbHRlciA9IG5ldyBQYXR0ZXJuRXhjbHVkZXNBcnRpZmFjdEZpbHRlciggZXhjbHVkZXMsIGFjdFRyYW5zaXRpdmVseSApOwotCi0gICAgICAgICAgICBmaWx0ZXIuYWRkKCBleGNsdWRlRmlsdGVyICk7Ci0KLSAgICAgICAgICAgIGFsbEZpbHRlcnMuYWRkKCBleGNsdWRlRmlsdGVyICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGSVhNRTogV2h5IGlzIHRoaXMgYWRkZWQgdHdpY2U/PwotICAgICAgICAvLyBpZiAoIGFkZGl0aW9uYWxGaWx0ZXJzICE9IG51bGwgJiYgIWFkZGl0aW9uYWxGaWx0ZXJzLmlzRW1wdHkoKSApCi0gICAgICAgIC8vIHsKLSAgICAgICAgLy8gYWxsRmlsdGVycy5hZGRBbGwoIGFkZGl0aW9uYWxGaWx0ZXJzICk7Ci0gICAgICAgIC8vIH0KLQotICAgICAgICBmb3IgKCBmaW5hbCBJdGVyYXRvcjxBcnRpZmFjdD4gaXQgPSBhcnRpZmFjdHMuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0ID0gaXQubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoICFmaWx0ZXIuaW5jbHVkZSggYXJ0aWZhY3QgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggYXJ0aWZhY3QuZ2V0SWQoKSArICIgd2FzIHJlbW92ZWQgYnkgb25lIG9yIG1vcmUgZmlsdGVycy4iICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVwb3J0RmlsdGVyaW5nU3RhdGlzdGljcyggYWxsRmlsdGVycywgbG9nZ2VyICk7Ci0KLSAgICAgICAgZm9yICggZmluYWwgQXJ0aWZhY3RGaWx0ZXIgZiA6IGFsbEZpbHRlcnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIGYgaW5zdGFuY2VvZiBTdGF0aXN0aWNzUmVwb3J0aW5nQXJ0aWZhY3RGaWx0ZXIgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZpbmFsIFN0YXRpc3RpY3NSZXBvcnRpbmdBcnRpZmFjdEZpbHRlciBzRmlsdGVyID0gKFN0YXRpc3RpY3NSZXBvcnRpbmdBcnRpZmFjdEZpbHRlcikgZjsKLQotICAgICAgICAgICAgICAgIGlmICggc3RyaWN0RmlsdGVyaW5nICYmIHNGaWx0ZXIuaGFzTWlzc2VkQ3JpdGVyaWEoKSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiT25lIG9yIG1vcmUgZmlsdGVycyBoYWQgdW5tYXRjaGVkIGNyaXRlcmlhLiBDaGVjayBkZWJ1ZyBsb2cgZm9yIG1vcmUgaW5mb3JtYXRpb24uIiApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXBvcnRGaWx0ZXJpbmdTdGF0aXN0aWNzKCBmaW5hbCBDb2xsZWN0aW9uPEFydGlmYWN0RmlsdGVyPiBmaWx0ZXJzLCBmaW5hbCBMb2dnZXIgbG9nZ2VyICkKLSAgICB7Ci0gICAgICAgIGZvciAoIGZpbmFsIEFydGlmYWN0RmlsdGVyIGYgOiBmaWx0ZXJzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBmIGluc3RhbmNlb2YgU3RhdGlzdGljc1JlcG9ydGluZ0FydGlmYWN0RmlsdGVyICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdGF0aXN0aWNzUmVwb3J0aW5nQXJ0aWZhY3RGaWx0ZXIgc0ZpbHRlciA9IChTdGF0aXN0aWNzUmVwb3J0aW5nQXJ0aWZhY3RGaWx0ZXIpIGY7Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggIlN0YXRpc3RpY3MgZm9yICIgKyBzRmlsdGVyICsgIlxuIiApOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNGaWx0ZXIucmVwb3J0TWlzc2VkQ3JpdGVyaWEoIGxvZ2dlciApOwotICAgICAgICAgICAgICAgIHNGaWx0ZXIucmVwb3J0RmlsdGVyZWRBcnRpZmFjdHMoIGxvZ2dlciApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvSW50ZXJwb2xhdGlvbkNvbnN0YW50cy5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0ludGVycG9sYXRpb25Db25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NDdkZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvSW50ZXJwb2xhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW50ZXJwb2xhdGlvbkNvbnN0YW50cwotewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gUFJPSkVDVF9QUkVGSVhFUzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IFBST0pFQ1RfUFJPUEVSVElFU19QUkVGSVhFUzsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFVFRJTkdTX1BSRUZJWCA9ICJzZXR0aW5ncy4iOwotCi0gICAgc3RhdGljCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcHJvamVjdFByZWZpeGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIHByb2plY3RQcmVmaXhlcy5hZGQoICJwb20uIiApOwotICAgICAgICBwcm9qZWN0UHJlZml4ZXMuYWRkKCAicHJvamVjdC4iICk7Ci0KLSAgICAgICAgUFJPSkVDVF9QUkVGSVhFUyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoIHByb2plY3RQcmVmaXhlcyApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwcm9qZWN0UHJvcGVydGllc1ByZWZpeGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgcHJvamVjdFByb3BlcnRpZXNQcmVmaXhlcy5hZGQoICJwb20ucHJvcGVydGllcy4iICk7Ci0gICAgICAgIHByb2plY3RQcm9wZXJ0aWVzUHJlZml4ZXMuYWRkKCAicHJvamVjdC5wcm9wZXJ0aWVzLiIgKTsKLQotICAgICAgICBQUk9KRUNUX1BST1BFUlRJRVNfUFJFRklYRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCBwcm9qZWN0UHJvcGVydGllc1ByZWZpeGVzICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0aW9uQ29uc3RhbnRzKCkKLSAgICB7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvTGluZUVuZGluZ3MuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9MaW5lRW5kaW5ncy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODVhZmQ4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9MaW5lRW5kaW5ncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqCi0gKiBFbnVtZXJhdGlvbiB0byBrZWVwIHRoZSBkaWZmZXJlbnQgbGluZSBlbmRpbmcgdHlwZXMgd2Ugc3VwcG9ydC4KLSAqCi0gKiBAYXV0aG9yIEthcmwtSGVpbnogTWFyYmFpc2UgPGEgaHJlZj0ibWFpbHRvOmtobWFyYmFpc2VAYXBhY2hlLm9yZyI+a2htYXJiYWlzZUBhcGFjaGUub3JnPC9hPgotICovCi1wdWJsaWMgZW51bSBMaW5lRW5kaW5ncwotewotICAgIGtlZXAoIG51bGwgKSwKLSAgICBkb3MoICJcclxuIiApLAotICAgIHdpbmRvd3MoICJcclxuIiApLAotICAgIHVuaXgoICJcbiIgKSwKLSAgICBjcmxmKCAiXHJcbiIgKSwKLSAgICBsZiggIlxuIiApOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbGluZUVuZGluZ0NoYXJhY3RlcnM7Ci0KLSAgICBwcml2YXRlIExpbmVFbmRpbmdzKCBTdHJpbmcgbGluZUVuZGluZ0NoYXJhY3RlcnMgKQotICAgIHsKLSAgICAgICAgdGhpcy5saW5lRW5kaW5nQ2hhcmFjdGVycyA9IGxpbmVFbmRpbmdDaGFyYWN0ZXJzOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzTmV3TGluZSgpCi0gICAgewotICAgICAgICByZXR1cm4gdGhpcyA9PSB1bml4IHx8IHRoaXMgPT0gbGY7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDckxGKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0aGlzID09IHdpbmRvd3MgfHwgdGhpcyA9PSBjcmxmIHx8IHRoaXMgPT0gZG9zOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubGluZUVuZGluZ0NoYXJhY3RlcnM7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9MaW5lRW5kaW5nc1V0aWxzLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvTGluZUVuZGluZ3NVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjBmN2ZmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9MaW5lRW5kaW5nc1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLklPVXRpbDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKLQotLyoqCi0gKiBMaW5lIEVuZGluZyBjbGFzcyB3aGljaCBjb250YWlucyBjb252ZW5pZW5jZSBtZXRob2RzIHRvIGNoYW5nZSBsaW5lIGVuZGluZ3MuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBMaW5lRW5kaW5nc1V0aWxzCi17Ci0KLSAgICBwcml2YXRlIExpbmVFbmRpbmdzVXRpbHMoKQotICAgIHsKLSAgICAgICAgLy8gcHJldmVudCBjcmVhdGlvbnMgb2YgaW5zdGFuY2VzLgotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBsaW5lIGVuZGluZ3Mgb2YgYSBmaWxlLCB3cml0aW5nIGEgbmV3IGZpbGUuIFRoZSBlbmNvZGluZyBvZiByZWFkaW5nIGFuZCB3cml0aW5nIGNhbiBiZSBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc291cmNlICAgICAgVGhlIHNvdXJjZSBmaWxlLCBub3QgbnVsbAotICAgICAqIEBwYXJhbSBkZXN0ICAgICAgICBUaGUgZGVzdGluYXRpb24gZmlsZSwgbm90IG51bGwKLSAgICAgKiBAcGFyYW0gbGluZUVuZGluZ3MgVGhpcyBpcyB0aGUgcmVzdWx0IG9mIHRoZSBnZXRMaW5lRW5kaW5nQ2hhcnMoLi4pIG1ldGhvZCBpbiB0aGlzIHV0aWxpdHkgY2xhc3M7IHRoZSBhY3R1YWwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgbGluZS1lbmRpbmcgY2hhcmFjdGVycywgbm90IG51bGwuCi0gICAgICogQHBhcmFtIGF0RW5kT2ZGaWxlIFRoZSBlbmQtb2YtZmlsZSBsaW5lIGVuZGluZywgaWYgdHJ1ZSB0aGVuIHRoZSByZXN1bHRpbmcgZmlsZSB3aWxsIGhhdmUgYSBuZXcgbGluZSBhdCB0aGUgZW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgdGhlIGlucHV0IGRpZG4ndCBoYXZlIG9uZSwgaWYgZmFsc2UgdGhlbiB0aGUgcmVzdWx0aW5nIGZpbGUgd2lsbCBoYXZlIG5vIG5ldyBsaW5lIGF0Ci0gICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBlbmQgZXZlbiBpZiB0aGUgaW5wdXQgZGlkIGhhdmUgb25lLCBudWxsIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGhhdmUgYSBuZXcgbGluZSBhdCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgZW5kIG9mIHRoZSBmaWxlIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlCi0gICAgICogQHBhcmFtIGVuY29kaW5nICAgIFRoZSBlbmNvZGluZyB0byB1c2UsIG51bGwgZm9yIHBsYXRmb3JtIGVuY29kaW5nCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbnZlcnRMaW5lRW5kaW5ncyggQE5vbm51bGwgRmlsZSBzb3VyY2UsIEBOb25udWxsIEZpbGUgZGVzdCwgTGluZUVuZGluZ3MgbGluZUVuZGluZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBhdEVuZE9mRmlsZSwgU3RyaW5nIGVuY29kaW5nICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICAvLyBNQVNTRU1CTFktNjM3LCBNQVNTRU1CTFktOTYKLSAgICAgICAgLy8gZmluZCBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUKLSAgICAgICAgLy8gbmVlZGVkIHRvIHByZXNlcnZlIHRoZSBsYXN0IGxpbmUgZW5kaW5nCi0gICAgICAgIC8vIG9ubHkgY2hlY2sgZm9yIExGIChhcyBDUkxGIGFsc28gZW5kcyBpbiBMRikKLSAgICAgICAgU3RyaW5nIGVvZkNoYXJzID0gIiI7Ci0gICAgICAgIGlmICggYXRFbmRPZkZpbGUgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgcmFmID0gbnVsbDsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggc291cmNlLmxlbmd0aCgpID49IDEgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmFmID0gbmV3IFJhbmRvbUFjY2Vzc0ZpbGUoIHNvdXJjZSwgInIiICk7Ci0gICAgICAgICAgICAgICAgICAgIHJhZi5zZWVrKCBzb3VyY2UubGVuZ3RoKCkgLSAxICk7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGUgbGFzdCA9IHJhZi5yZWFkQnl0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIGxhc3QgPT0gJ1xuJyApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVvZkNoYXJzID0gbGluZUVuZGluZ3MuZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsbHkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoIHJhZiAhPSBudWxsICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYWYuY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXRjaCAoIElPRXhjZXB0aW9uIGV4ICkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGF0RW5kT2ZGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgZW9mQ2hhcnMgPSBsaW5lRW5kaW5ncy5nZXRMaW5lRW5kaW5nQ2hhcmFjdGVycygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgaW4gPSBudWxsOwotICAgICAgICBCdWZmZXJlZFdyaXRlciBvdXQgPSBudWxsOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBlbmNvZGluZyA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBwbGF0Zm9ybSBlbmNvZGluZwotICAgICAgICAgICAgICAgIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIG5ldyBGaWxlSW5wdXRTdHJlYW0oIHNvdXJjZSApICkgKTsKLSAgICAgICAgICAgICAgICBvdXQgPSBuZXcgQnVmZmVyZWRXcml0ZXIoIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBkZXN0ICkgKSApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE1BU1NFTUJMWS0zNzEKLSAgICAgICAgICAgICAgICBpbiA9IG5ldyBCdWZmZXJlZFJlYWRlciggbmV3IElucHV0U3RyZWFtUmVhZGVyKCBuZXcgRmlsZUlucHV0U3RyZWFtKCBzb3VyY2UgKSwgZW5jb2RpbmcgKSApOwotICAgICAgICAgICAgICAgIG91dCA9IG5ldyBCdWZmZXJlZFdyaXRlciggbmV3IE91dHB1dFN0cmVhbVdyaXRlciggbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGRlc3QgKSwgZW5jb2RpbmcgKSApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBTdHJpbmcgbGluZTsKLQotICAgICAgICAgICAgbGluZSA9IGluLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICB3aGlsZSAoIGxpbmUgIT0gbnVsbCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0LndyaXRlKCBsaW5lICk7Ci0gICAgICAgICAgICAgICAgbGluZSA9IGluLnJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCBsaW5lICE9IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCBsaW5lRW5kaW5ncy5nZXRMaW5lRW5kaW5nQ2hhcmFjdGVycygpICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG91dC53cml0ZSggZW9mQ2hhcnMgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG91dC5mbHVzaCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKCBpbiApOwotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKCBvdXQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoZSBsaW5lIGVuZGluZ3Mgb2YgYSBmaWxlLCB3cml0aW5nIGEgbmV3IGZpbGUuIFRoZSBlbmNvZGluZyBvZiByZWFkaW5nIGFuZCB3cml0aW5nIGNhbiBiZSBzcGVjaWZpZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gICAgICAgICAgVGhlIHNvdXJjZSByZWFkZXIKLSAgICAgKiBAcGFyYW0gbGluZUVuZGluZ3MgVGhpcyBpcyB0aGUgcmVzdWx0IG9mIHRoZSBnZXRMaW5lRW5kaW5nQ2hhcnMoLi4pIG1ldGhvZCBpbiB0aGlzIHV0aWxpdHkgY2xhc3M7IHRoZSBhY3R1YWwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgbGluZS1lbmRpbmcgY2hhcmFjdGVycywgbm90IG51bGwuCi0gICAgICogQHJldHVybiBhbiBpbnB1dCBzdHJlYW0gdGhhdCBlbmZvcmNlcyBhIHNwZWNpZmkgbGluZSBlbmRpbmcgc3R5bGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGxpbmVFbmRpbmdDb252ZXJ0ZXIoIEBOb25udWxsIElucHV0U3RyZWFtIGluLCBMaW5lRW5kaW5ncyBsaW5lRW5kaW5ncyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIGxpbmVFbmRpbmdzLmlzTmV3TGluZSgpCi0gICAgICAgICAgICA/IG5ldyBMaW51eExpbmVGZWVkSW5wdXRTdHJlYW0oIGluLCBmYWxzZSApCi0gICAgICAgICAgICA6IGxpbmVFbmRpbmdzLmlzQ3JMRigpID8gbmV3IFdpbmRvd3NMaW5lRmVlZElucHV0U3RyZWFtKCBpbiwgZmFsc2UgKSA6IGluOwotICAgIH0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIHN0YXRpYyBMaW5lRW5kaW5ncyBnZXRMaW5lRW5kaW5nKCBATnVsbGFibGUgU3RyaW5nIGxpbmVFbmRpbmcgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBMaW5lRW5kaW5ncyByZXN1bHQgPSBMaW5lRW5kaW5ncy5rZWVwOwotICAgICAgICBpZiAoIGxpbmVFbmRpbmcgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCA9IExpbmVFbmRpbmdzLnZhbHVlT2YoIGxpbmVFbmRpbmcgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24oICJJbGxlZ2FsIGxpbmVFbmRpbmcgc3BlY2lmaWVkOiAnIiArIGxpbmVFbmRpbmcgKyAiJyIsIGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGFwcG9wcmlhdGUgbGluZSBlbmRpbmcgY2hhcmFjdGVycyBmb3IgdGhlIHNwZWNpZmllZCBzdHlsZQotICAgICAqCi0gICAgICogQHBhcmFtIGxpbmVFbmRpbmcgVGhlIG5hbWUgb2YgdGhlIGxpbmUgZW5kaW5nIHN0eWxlLAotICAgICAqICAgICAgICBzZWUgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuTGluZUVuZGluZ3MjdmFsdWVPZgotICAgICAqIEByZXR1cm4gVGhlIHByb3BlciBsaW5lIGVuZGluZyBjaGFyYWN0ZXJzCi0gICAgICogQHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRMaW5lRW5kaW5nQ2hhcmFjdGVycyggQE51bGxhYmxlIFN0cmluZyBsaW5lRW5kaW5nICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLQotICAgICAgICBTdHJpbmcgdmFsdWUgPSBsaW5lRW5kaW5nOwotCi0gICAgICAgIGlmICggbGluZUVuZGluZyAhPSBudWxsICkKLSAgICAgICAgewotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IExpbmVFbmRpbmdzLnZhbHVlT2YoIGxpbmVFbmRpbmcgKS5nZXRMaW5lRW5kaW5nQ2hhcmFjdGVycygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiggIklsbGVnYWwgbGluZUVuZGluZyBzcGVjaWZpZWQ6ICciICsgbGluZUVuZGluZyArICInIiwgZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0xpbnV4TGluZUZlZWRJbnB1dFN0cmVhbS5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0xpbnV4TGluZUZlZWRJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjY2MjI0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9MaW51eExpbmVGZWVkSW5wdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEBhdXRob3IgS3Jpc3RpYW4gUm9zZW52b2xkCi0gKi8KLWNsYXNzIExpbnV4TGluZUZlZWRJbnB1dFN0cmVhbQotICAgIGV4dGVuZHMgSW5wdXRTdHJlYW0KLXsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzbGFzaE5TZWVuID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2xhc2hSU2VlbiA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGVvZlNlZW4gPSBmYWxzZTsKLQotICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gdGFyZ2V0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVuc3VyZUxpbmVGZWVkQXRFbmRPZkZpbGU7Ci0KLSAgICBwdWJsaWMgTGludXhMaW5lRmVlZElucHV0U3RyZWFtKCBJbnB1dFN0cmVhbSBpbiwgYm9vbGVhbiBlbnN1cmVMaW5lRmVlZEF0RW5kT2ZGaWxlICkKLSAgICB7Ci0gICAgICAgIHRoaXMudGFyZ2V0ID0gaW47Ci0gICAgICAgIHRoaXMuZW5zdXJlTGluZUZlZWRBdEVuZE9mRmlsZSA9IGVuc3VyZUxpbmVGZWVkQXRFbmRPZkZpbGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgcmVhZFdpdGhVcGRhdGUoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIGludCB0YXJnZXQgPSB0aGlzLnRhcmdldC5yZWFkKCk7Ci0gICAgICAgIGVvZlNlZW4gPSB0YXJnZXQgPT0gLTE7Ci0gICAgICAgIGlmICggZW9mU2VlbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgICAgIH0KLSAgICAgICAgc2xhc2hOU2VlbiA9IHRhcmdldCA9PSAnXG4nOwotICAgICAgICBzbGFzaFJTZWVuID0gdGFyZ2V0ID09ICdccic7Ci0gICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBib29sZWFuIHByZXZXYXNTbGFzaFIgPSBzbGFzaFJTZWVuOwotICAgICAgICBpZiAoIGVvZlNlZW4gKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZW9mR2FtZSggcHJldldhc1NsYXNoUiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHRhcmdldCA9IHJlYWRXaXRoVXBkYXRlKCk7Ci0gICAgICAgICAgICBpZiAoIGVvZlNlZW4gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlb2ZHYW1lKCBwcmV2V2FzU2xhc2hSICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIHNsYXNoUlNlZW4gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAnXG4nOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIHByZXZXYXNTbGFzaFIgJiYgc2xhc2hOU2VlbiApCi0gICAgICAgICAgICB7IC8vIExvbmUgL3IKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVhZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGVvZkdhbWUoIGJvb2xlYW4gcHJldmlvdXNXYXNTbGFzaFIgKQotICAgIHsKLSAgICAgICAgaWYgKCBwcmV2aW91c1dhc1NsYXNoUiB8fCAhZW5zdXJlTGluZUZlZWRBdEVuZE9mRmlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpZiAoICFzbGFzaE5TZWVuICkKLSAgICAgICAgewotICAgICAgICAgICAgc2xhc2hOU2VlbiA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gJ1xuJzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5jbG9zZSgpOwotICAgICAgICB0YXJnZXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgbWFyayggaW50IHJlYWRsaW1pdCApCi0gICAgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJNYXJrIG5vdCBpbXBsZW1lbnRlZCB5ZXQiICk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1Byb2plY3RVdGlscy5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1Byb2plY3RVdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDA4MTI5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9Qcm9qZWN0VXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk5vbm51bGw7Ci1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUHJvamVjdFV0aWxzCi17Ci0KLSAgICBwcml2YXRlIFByb2plY3RVdGlscygpCi0gICAgewotICAgIH0KLQotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENsYXNzaWZpZXIoIEBOb25udWxsIEFydGlmYWN0IGFydGlmYWN0ICkKLSAgICB7Ci0gICAgICAgIFN0cmluZyBjbGFzc2lmaWVyID0gYXJ0aWZhY3QuZ2V0Q2xhc3NpZmllcigpOwotICAgICAgICBpZiAoIGNsYXNzaWZpZXIgIT0gbnVsbCAmJiBjbGFzc2lmaWVyLmxlbmd0aCgpID09IDAgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjbGFzc2lmaWVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2xhc3NpZmllcjsKLSAgICB9Ci0KLSAgICBATm9ubnVsbAotICAgIHB1YmxpYyBzdGF0aWMgU2V0PE1hdmVuUHJvamVjdD4gZ2V0UHJvamVjdE1vZHVsZXMoIEBOb25udWxsIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25udWxsIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiByZWFjdG9yUHJvamVjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmNsdWRlU3ViTW9kdWxlcywgQE5vbm51bGwgZmluYWwgTG9nZ2VyIGxvZ2dlciApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gc2luZ2xlUGFyZW50U2V0ID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gbW9kdWxlQ2FuZGlkYXRlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PE1hdmVuUHJvamVjdD4oIHJlYWN0b3JQcm9qZWN0cyApOwotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IG1vZHVsZXMgPSBuZXcgTGlua2VkSGFzaFNldDxNYXZlblByb2plY3Q+KCk7Ci0KLSAgICAgICAgLy8gd2UgdGVtcG9yYXJpbHkgYWRkIHRoZSBtYXN0ZXIgcHJvamVjdCB0byB0aGUgbW9kdWxlcyBzZXQsIHNpbmNlIHRoaXMKLSAgICAgICAgLy8gc2V0IGlzIHB1bGxpbmcgZG91YmxlIGR1dHkgYXMgYSBzZXQgb2YKLSAgICAgICAgLy8gcG90ZW50aWFsIG1vZHVsZSBwYXJlbnRzIGluIHRoZSB0cmVlIHJvb3RlZCBhdCB0aGUgbWFzdGVyCi0gICAgICAgIC8vIHByb2plY3QuLi50aGlzIGFsbG93cyB1cyB0byB1c2UgdGhlIHNhbWUgbG9vcGluZwotICAgICAgICAvLyBhbGdvcml0aG0gYmVsb3cgdG8gZGlzY292ZXIgYm90aCBkaXJlY3QgbW9kdWxlcyBvZiB0aGUgbWFzdGVyIHByb2plY3QKLSAgICAgICAgLy8gQU5EIG1vZHVsZXMgb2YgdGhvc2UgZGlyZWN0IG1vZHVsZXMuCi0gICAgICAgIG1vZHVsZXMuYWRkKCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgaW50IGNoYW5nZWQ7Ci0KLSAgICAgICAgZG8KLSAgICAgICAgewotICAgICAgICAgICAgY2hhbmdlZCA9IDA7Ci0KLSAgICAgICAgICAgIGZvciAoIGZpbmFsIEl0ZXJhdG9yPE1hdmVuUHJvamVjdD4gY2FuZGlkYXRlSXRlcmF0b3IgPSBtb2R1bGVDYW5kaWRhdGVzLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICBjYW5kaWRhdGVJdGVyYXRvci5oYXNOZXh0KCk7ICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlQ2FuZGlkYXRlID0gY2FuZGlkYXRlSXRlcmF0b3IubmV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKCBtb2R1bGVDYW5kaWRhdGUuZ2V0RmlsZSgpID09IG51bGwgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNvbXB1dGUgd2hldGhlciAiICsgbW9kdWxlQ2FuZGlkYXRlLmdldElkKCkgKyAiIGlzIGEgbW9kdWxlIG9mOiAiICsgcHJvamVjdC5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOyBpdCBkb2VzIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgUE9NIGZpbGUgb24gdGhlIGxvY2FsIGZpbGVzeXN0ZW0uIiApOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBTZXQ8TWF2ZW5Qcm9qZWN0PiBjdXJyZW50UG90ZW50aWFsUGFyZW50czsKLSAgICAgICAgICAgICAgICBpZiAoIGluY2x1ZGVTdWJNb2R1bGVzICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQb3RlbnRpYWxQYXJlbnRzID0gbmV3IExpbmtlZEhhc2hTZXQ8TWF2ZW5Qcm9qZWN0PiggbW9kdWxlcyApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjdXJyZW50UG90ZW50aWFsUGFyZW50cyA9IHNpbmdsZVBhcmVudFNldDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmb3IgKCBmaW5hbCBNYXZlblByb2plY3QgcG90ZW50aWFsUGFyZW50IDogY3VycmVudFBvdGVudGlhbFBhcmVudHMgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCBwb3RlbnRpYWxQYXJlbnQuZ2V0RmlsZSgpID09IG51bGwgKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybiggIkNhbm5vdCB1c2U6ICIgKyBtb2R1bGVDYW5kaWRhdGUuZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYXMgYSBwb3RlbnRpYWwgbW9kdWxlLXBhcmVudCB3aGlsZSBjb21wdXRpbmcgdGhlIG1vZHVsZSBzZXQgZm9yOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcHJvamVjdC5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgaXQgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkIFBPTSBmaWxlIG9uIHRoZSBsb2NhbCBmaWxlc3lzdGVtLiIgKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBwYXJlbnQgaGFzIGFuIGVudHJ5IGZvciB0aGUgbW9kdWxlIGNhbmRpZGF0ZSBpbgotICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcGF0aCBhZGp1c3RtZW50cyBtYXAsIGl0J3MgYSBkaXJlY3QKLSAgICAgICAgICAgICAgICAgICAgLy8gbW9kdWxlIG9mIHRoYXQgcGFyZW50LgotICAgICAgICAgICAgICAgICAgICBpZiAoIHByb2plY3RDb250YWluc01vZHVsZSggcG90ZW50aWFsUGFyZW50LCBtb2R1bGVDYW5kaWRhdGUgKSApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCB0aGUgY2FuZGlkYXRlIHRvIHRoZSBsaXN0IG9mIG1vZHVsZXMgKGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcG90ZW50aWFsIHBhcmVudHMpCi0gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzLmFkZCggbW9kdWxlQ2FuZGlkYXRlICk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgY2FuZGlkYXRlIGZyb20gdGhlIGNhbmRpZGF0ZSBwb29sLCBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIGJlZW4gdmVyaWZpZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVJdGVyYXRvci5yZW1vdmUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSBjaGFuZ2UgY291bnRlciwgdG8gc2hvdyB0aGF0IHdlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZmllZCBhIG5ldyBtb2R1bGUgb24gdGhpcyBwYXNzLgotICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCsrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICggY2hhbmdlZCAhPSAwICk7Ci0KLSAgICAgICAgLy8gcmVtb3ZlIHRoZSBtYXN0ZXIgcHJvamVjdCBmcm9tIHRoZSBtb2R1bGVzIHNldCwgbm93IHRoYXQgd2UncmUgZG9uZQotICAgICAgICAvLyB1c2luZyBpdCBhcyBhIHNldCBvZiBwb3RlbnRpYWwgbW9kdWxlCi0gICAgICAgIC8vIHBhcmVudHMuLi4KLSAgICAgICAgbW9kdWxlcy5yZW1vdmUoIHByb2plY3QgKTsKLQotICAgICAgICByZXR1cm4gbW9kdWxlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHByb2plY3RDb250YWluc01vZHVsZSggQE5vbm51bGwgZmluYWwgTWF2ZW5Qcm9qZWN0IG1haW5Qcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9ubnVsbCBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlUHJvamVjdCApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoICJ1bmNoZWNrZWQiICkgZmluYWwgTGlzdDxTdHJpbmc+IG1vZHVsZXMgPSBtYWluUHJvamVjdC5nZXRNb2R1bGVzKCk7Ci0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IG1haW5Qcm9qZWN0LmdldEJhc2VkaXIoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIG1vZHVsZUZpbGUgPSBtb2R1bGVQcm9qZWN0LmdldEZpbGUoKS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0KLSAgICAgICAgRmlsZSBtb2R1bGVCYXNlZGlyID0gbW9kdWxlUHJvamVjdC5nZXRCYXNlZGlyKCk7Ci0KLSAgICAgICAgaWYgKCBtb2R1bGVCYXNlZGlyID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtb2R1bGVCYXNlZGlyID0gbW9kdWxlRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0KLSAgICAgICAgICAgIGlmICggbW9kdWxlQmFzZWRpciA9PSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtb2R1bGVCYXNlZGlyID0gbmV3IEZpbGUoICIuIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgbW9kdWxlQmFzZWRpciA9IG1vZHVsZUJhc2VkaXIuZ2V0Q2Fub25pY2FsRmlsZSgpOwotCi0gICAgICAgIGZvciAoIGZpbmFsIFN0cmluZyBtb2R1bGVTdWJwYXRoIDogbW9kdWxlcyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgbW9kdWxlRGlyID0gbmV3IEZpbGUoIGJhc2VkaXIsIG1vZHVsZVN1YnBhdGggKS5nZXRDYW5vbmljYWxGaWxlKCk7Ci0KLSAgICAgICAgICAgIGlmICggbW9kdWxlRGlyLmVxdWFscyggbW9kdWxlRmlsZSApIHx8IG1vZHVsZURpci5lcXVhbHMoIG1vZHVsZUJhc2VkaXIgKSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvVHlwZUNvbnZlcnNpb25VdGlscy5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1R5cGVDb252ZXJzaW9uVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNmI1Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvVHlwZUNvbnZlcnNpb25VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHM7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUeXBlQ29udmVyc2lvblV0aWxzCi17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVV9SID0gMjU2OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVfVyA9IDEyODsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVX1ggPSA2NDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHX1IgPSAzMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHX1cgPSAxNjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBHX1ggPSA4OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdfUiA9IDQ7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV19XID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXX1ggPSAxOwotCi0gICAgcHJpdmF0ZSBUeXBlQ29udmVyc2lvblV0aWxzKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b1N0cmluZ0FycmF5KCBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCApCi0gICAgewotICAgICAgICBTdHJpbmdbXSByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIGlmICggKCBsaXN0ICE9IG51bGwgKSAmJiAhbGlzdC5pc0VtcHR5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXN1bHQgPSBsaXN0LnRvQXJyYXkoIG5ldyBTdHJpbmdbbGlzdC5zaXplKCldICk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50IG1vZGVUb0ludCggZmluYWwgU3RyaW5nIG1vZGUsIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpZiAoIG1vZGUgPT0gbnVsbCB8fCBtb2RlLnRyaW0oKS5sZW5ndGgoKSA8IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgaW50IHZhbHVlID0gSW50ZWdlci5wYXJzZUludCggbW9kZSwgOCApOwotCi0gICAgICAgICAgICAvLyBkaXNjYXJkIHNhbml0eSBhc3Nlc3NtZW50IGhlcmU7IHdlJ3JlIHB1c2hpbmcgYWhlYWQuCi0gICAgICAgICAgICB2ZXJpZnlNb2RlU2FuaXR5KCB2YWx1ZSwgbG9nZ2VyICk7Ci0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiggIkZhaWxlZCB0byBwYXJzZSBtb2RlIGFzIGFuIG9jdGFsIG51bWJlcjogXCciICsgbW9kZSArICJcJy4iLCBlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyB0aGUgYm9vbGVhbiByZXR1cm4gdHlwZSBpcyBmb3IgcGVvcGxlIHdobyB3YW50IHRvIG1ha2UgYSBkZWNpc2lvbiBiYXNlZCBvbiB0aGUgc2FuaXR5Ci0gICAgLy8gYXNzZXNzbWVudC4KLSAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyaWZ5TW9kZVNhbml0eSggZmluYWwgaW50IG1vZGUsIGZpbmFsIExvZ2dlciBsb2dnZXIgKQotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBtZXNzYWdlcyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0KLSAgICAgICAgbWVzc2FnZXMuYXBwZW5kKCAiVGhlIG1vZGU6ICIgKS5hcHBlbmQoIEludGVnZXIudG9TdHJpbmcoIG1vZGUsIDggKSApLmFwcGVuZCgKLSAgICAgICAgICAgICIgY29udGFpbnMgbm9uc2Vuc2ljYWwgcGVybWlzc2lvbnM6IiApOwotCi0gICAgICAgIGJvb2xlYW4gd2FybiA9IGZhbHNlOwotCi0gICAgICAgIC8vIHJlYWQtYWNjZXNzIGNoZWNrcy4KLSAgICAgICAgaWYgKCAoICggbW9kZSAmIFVfUiApID09IDAgKSAmJiAoICggbW9kZSAmIEdfUiApID09IEdfUiApICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMuYXBwZW5kKCAiXG4tIEdyb3VwIGhhcyByZWFkIGFjY2VzcywgYnV0IHVzZXIgZG9lcyBub3QuIiApOwotICAgICAgICAgICAgd2FybiA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICggKCBtb2RlICYgVV9SICkgPT0gMCApICYmICggKCBtb2RlICYgV19SICkgPT0gV19SICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlcy5hcHBlbmQoICJcbi0gV29ybGQgaGFzIHJlYWQgYWNjZXNzLCBidXQgdXNlciBkb2VzIG5vdC4iICk7Ci0gICAgICAgICAgICB3YXJuID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKCAoIG1vZGUgJiBHX1IgKSA9PSAwICkgJiYgKCAoIG1vZGUgJiBXX1IgKSA9PSBXX1IgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLmFwcGVuZCggIlxuLSBXb3JsZCBoYXMgcmVhZCBhY2Nlc3MsIGJ1dCBncm91cCBkb2VzIG5vdC4iICk7Ci0gICAgICAgICAgICB3YXJuID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBlbmQgcmVhZC1hY2Nlc3MgY2hlY2tzLgotCi0gICAgICAgIC8vIHdyaXRlLWFjY2VzcyBjaGVja3MuCi0gICAgICAgIGlmICggKCAoIG1vZGUgJiBVX1cgKSA9PSAwICkgJiYgKCAoIG1vZGUgJiBHX1cgKSA9PSBHX1cgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLmFwcGVuZCggIlxuLSBHcm91cCBoYXMgd3JpdGUgYWNjZXNzLCBidXQgdXNlciBkb2VzIG5vdC4iICk7Ci0gICAgICAgICAgICB3YXJuID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKCAoIG1vZGUgJiBVX1cgKSA9PSAwICkgJiYgKCAoIG1vZGUgJiBXX1cgKSA9PSBXX1cgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLmFwcGVuZCggIlxuLSBXb3JsZCBoYXMgd3JpdGUgYWNjZXNzLCBidXQgdXNlciBkb2VzIG5vdC4iICk7Ci0gICAgICAgICAgICB3YXJuID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKCAoIG1vZGUgJiBHX1cgKSA9PSAwICkgJiYgKCAoIG1vZGUgJiBXX1cgKSA9PSBXX1cgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLmFwcGVuZCggIlxuLSBXb3JsZCBoYXMgd3JpdGUgYWNjZXNzLCBidXQgZ3JvdXAgZG9lcyBub3QuIiApOwotICAgICAgICAgICAgd2FybiA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZW5kIHdyaXRlLWFjY2VzcyBjaGVja3MuCi0KLSAgICAgICAgLy8gZXhlY3V0ZS0vbGlzdC1hY2Nlc3MgY2hlY2tzLgotICAgICAgICBpZiAoICggKCBtb2RlICYgVV9YICkgPT0gMCApICYmICggKCBtb2RlICYgR19YICkgPT0gR19YICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBtZXNzYWdlcy5hcHBlbmQoICJcbi0gR3JvdXAgaGFzIGV4ZWN1dGUvbGlzdCBhY2Nlc3MsIGJ1dCB1c2VyIGRvZXMgbm90LiIgKTsKLSAgICAgICAgICAgIHdhcm4gPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAoICggbW9kZSAmIFVfWCApID09IDAgKSAmJiAoICggbW9kZSAmIFdfWCApID09IFdfWCApICkKLSAgICAgICAgewotICAgICAgICAgICAgbWVzc2FnZXMuYXBwZW5kKCAiXG4tIFdvcmxkIGhhcyBleGVjdXRlL2xpc3QgYWNjZXNzLCBidXQgdXNlciBkb2VzIG5vdC4iICk7Ci0gICAgICAgICAgICB3YXJuID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggKCAoIG1vZGUgJiBHX1ggKSA9PSAwICkgJiYgKCAoIG1vZGUgJiBXX1ggKSA9PSBXX1ggKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1lc3NhZ2VzLmFwcGVuZCggIlxuLSBXb3JsZCBoYXMgZXhlY3V0ZS9saXN0IGFjY2VzcywgYnV0IGdyb3VwIGRvZXMgbm90LiIgKTsKLSAgICAgICAgICAgIHdhcm4gPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGVuZCBleGVjdXRlLS9saXN0LWFjY2VzcyBjaGVja3MuCi0KLSAgICAgICAgaWYgKCB3YXJuICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyLndhcm4oIG1lc3NhZ2VzLnRvU3RyaW5nKCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAhd2FybjsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9XaW5kb3dzTGluZUZlZWRJbnB1dFN0cmVhbS5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1dpbmRvd3NMaW5lRmVlZElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzOGRlNWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1dpbmRvd3NMaW5lRmVlZElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBAYXV0aG9yIEtyaXN0aWFuIFJvc2Vudm9sZAotICovCi1jbGFzcyBXaW5kb3dzTGluZUZlZWRJbnB1dFN0cmVhbQotICAgIGV4dGVuZHMgSW5wdXRTdHJlYW0KLXsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBzbGFzaFJTZWVuID0gZmFsc2U7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gc2xhc2hOU2VlbiA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGluamVjdFNsYXNoTiA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGVvZlNlZW4gPSBmYWxzZTsKLQotICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gdGFyZ2V0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVuc3VyZUxpbmVGZWVkQXRFbmRPZkZpbGU7Ci0KLSAgICBwdWJsaWMgV2luZG93c0xpbmVGZWVkSW5wdXRTdHJlYW0oIElucHV0U3RyZWFtIGluLCBib29sZWFuIGVuc3VyZUxpbmVGZWVkQXRFbmRPZkZpbGUgKQotICAgIHsKLSAgICAgICAgdGhpcy50YXJnZXQgPSBpbjsKLSAgICAgICAgdGhpcy5lbnN1cmVMaW5lRmVlZEF0RW5kT2ZGaWxlID0gZW5zdXJlTGluZUZlZWRBdEVuZE9mRmlsZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZWFkV2l0aFVwZGF0ZSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgaW50IHRhcmdldCA9IHRoaXMudGFyZ2V0LnJlYWQoKTsKLSAgICAgICAgZW9mU2VlbiA9IHRhcmdldCA9PSAtMTsKLSAgICAgICAgaWYgKCBlb2ZTZWVuICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICAgICAgfQotICAgICAgICBzbGFzaFJTZWVuID0gdGFyZ2V0ID09ICdccic7Ci0gICAgICAgIHNsYXNoTlNlZW4gPSB0YXJnZXQgPT0gJ1xuJzsKLSAgICAgICAgcmV0dXJuIHRhcmdldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHJlYWQoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGlmICggZW9mU2VlbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlb2ZHYW1lKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoIGluamVjdFNsYXNoTiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGluamVjdFNsYXNoTiA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuICdcbic7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBib29sZWFuIHByZXZXYXNTbGFzaFIgPSBzbGFzaFJTZWVuOwotICAgICAgICAgICAgaW50IHRhcmdldCA9IHJlYWRXaXRoVXBkYXRlKCk7Ci0gICAgICAgICAgICBpZiAoIGVvZlNlZW4gKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBlb2ZHYW1lKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIHRhcmdldCA9PSAnXG4nICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoICFwcmV2V2FzU2xhc2hSICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGluamVjdFNsYXNoTiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAnXHInOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBlb2ZHYW1lKCkKLSAgICB7Ci0gICAgICAgIGlmICggIWVuc3VyZUxpbmVGZWVkQXRFbmRPZkZpbGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhc2xhc2hOU2VlbiAmJiAhc2xhc2hSU2VlbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNsYXNoUlNlZW4gPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuICdccic7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCAhc2xhc2hOU2VlbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNsYXNoUlNlZW4gPSBmYWxzZTsKLSAgICAgICAgICAgIHNsYXNoTlNlZW4gPSB0cnVlOwotICAgICAgICAgICAgcmV0dXJuICdcbic7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuY2xvc2UoKTsKLSAgICAgICAgdGFyZ2V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoIGludCByZWFkbGltaXQgKQotICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAiTWFyayBub3QgaW1wbGVtZW50ZWQgeWV0IiApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vbWRvL2NvbXBvbmVudC5tZG8gYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL21kby9jb21wb25lbnQubWRvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YTFhMGY0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vbWRvL2NvbXBvbmVudC5tZG8KKysrIC9kZXYvbnVsbApAQCAtMSwxMzAyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0gTm90ZSBEZWZpbml0aW9ucyBvZiBGaWxlU2V0LCBGaWxlSXRlbSwgYW5kIERlcGVuZGVuY3lTZXQgYXJlCi0gICAgIGFscmVhZHkgZGVmaW5lZCBpbiBkZXNjcmlwdG9yLm1kbywgYnV0IHJlcGVhdGVkICBoZXJlIHNpbmNlCi0gICAgIE1vZGVsbG8gY3VycmVudGx5IGRvZXMgbm90IGhhdmUgY2FwYWJpbGl0eSB0byBzaGFyZSBmaWxlcwotLS0+Ci0KLTxtb2RlbCB4bWxucz0iaHR0cDovL21vZGVsbG8uY29kZWhhdXMub3JnL01PREVMTE8vMS40LjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbW9kZWxsby5jb2RlaGF1cy5vcmcvTU9ERUxMTy8xLjQuMCBodHRwOi8vbW9kZWxsby5jb2RlaGF1cy5vcmcveHNkL21vZGVsbG8tMS40LjAueHNkIgotICAgICAgIHhtbC5uYW1lc3BhY2U9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2NvbXBvbmVudC8ke3ZlcnNpb259IiAKLSAgICAgICB4bWwuc2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9jb21wb25lbnQtJHt2ZXJzaW9ufS54c2QiPgotICAgICAgIAotICA8aWQ+Y29tcG9uZW50PC9pZD4KLSAgPG5hbWU+Q29tcG9uZW50PC9uYW1lPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgPCFbQ0RBVEFbCi0gICAgPHA+Ci0gICAgV2hlbiBjcmVhdGluZyBzZXZlcmFsIGFzc2VtYmxpZXMgZm9yIGEgcHJvamVjdCB3aXRoIGEgY3VzdG9tIGFzc2VtYmx5Ci0gICAgZGVzY3JpcHRvciwgaXQgY2FuJ3QgYmUgaGVscGVkIHRoYXQgeW91IHdpbGwgYmUgZHVwbGljYXRpbmcgc29tZSBwYXJ0cyBvZgotICAgIGEgZGVmaW5lZCBhc3NlbWJseS4gVGhlc2UgZHVwbGljYXRlcyBjYW4gYmUgZXh0cmFjdGVkIGFuZCBwbGFjZWQgaW4gYQotICAgIHNlcGFyYXRlIGZpbGUgY2FsbGVkIGEgZGVzY3JpcHRvciBjb21wb25lbnQuCi0gICAgPC9wPgotICAgIDxwPgotICAgIERlc2NyaXB0b3IgY29tcG9uZW50cyBjb250YWluIEZpbGVTZXRzLCBGaWxlcywgYW5kIERlcGVuZGVuY3lTZXRzIG1lYW50Ci0gICAgdG8gYmUgc2hhcmVkIGJ5IGFzc2VtYmx5IGRlc2NyaXB0b3JzIGJ5IHJlZmVyZW5jaW5nIHRoZW0gdXNpbmcKLSAgICAmbHQ7Y29tcG9uZW50RGVzY3JpcHRvcnMmZ3Q7LiBJdCBhbGxvd3MgbXVsdGlwbGUgYXNzZW1ibGllcyB0byBzaGFyZSBhIHNldAotICAgIG9mIHVzZXIgZGVmaW5lZCBjb2xsZWN0aW9ucy4KLSAgICA8L3A+Ci0gICAgXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0gIDxkZWZhdWx0cz4KLSAgICA8ZGVmYXVsdD4KLSAgICAgIDxrZXk+cGFja2FnZTwva2V5PgotICAgICAgPHZhbHVlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsPC92YWx1ZT4KLSAgICA8L2RlZmF1bHQ+Ci0gIDwvZGVmYXVsdHM+Ci0gIDxjbGFzc2VzPgotICAgIDxjbGFzcyByb290RWxlbWVudD0idHJ1ZSIgeG1sLnRhZ05hbWU9ImNvbXBvbmVudCI+Ci0gICAgICA8bmFtZT5Db21wb25lbnQ8L25hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+RGVzY3JpYmVzIHRoZSBjb21wb25lbnQgbGF5b3V0IGFuZCBwYWNrYWdpbmcuPC9kZXNjcmlwdGlvbj4KLSAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5tb2R1bGVTZXRzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5Nb2R1bGVTZXQ8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIG1vZHVsZSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBhc3NlbWJseS4gQSBtb2R1bGVTZXQKLSAgICAgICAgICAgIGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YgJmx0O21vZHVsZVNldCZndDsKLSAgICAgICAgICAgIHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVTZXRzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5GaWxlU2V0PC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBncm91cHMgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgYXNzZW1ibHkuIEEKLSAgICAgICAgICAgIGZpbGVTZXQgaXMgc3BlY2lmaWVkIGJ5IHByb3ZpZGluZyBvbmUgb3IgbW9yZSBvZiAmbHQ7ZmlsZVNldCZndDsKLSAgICAgICAgICAgIHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5GaWxlSXRlbTwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggc2luZ2xlIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIGFzc2VtYmx5LiBBIGZpbGUKLSAgICAgICAgICAgIGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YgJmx0O2ZpbGUmZ3Q7Ci0gICAgICAgICAgICBzdWJlbGVtZW50cy4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5kZXBlbmRlbmN5U2V0czwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+RGVwZW5kZW5jeVNldDwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggZGVwZW5kZW5jaWVzIHRvIGluY2x1ZGUgaW4gdGhlIGFzc2VtYmx5LiBBCi0gICAgICAgICAgICBkZXBlbmRlbmN5U2V0IGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YKLSAgICAgICAgICAgICZsdDtkZXBlbmRlbmN5U2V0Jmd0OyBzdWJlbGVtZW50cy4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5yZXBvc2l0b3JpZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPlJlcG9zaXRvcnk8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIGEgc2V0IG9mIHJlcG9zaXRvcmllcyB0byBpbmNsdWRlIGluIHRoZSBhc3NlbWJseS4gQQotICAgICAgICAgICAgcmVwb3NpdG9yeSBpcyBzcGVjaWZpZWQgYnkgcHJvdmlkaW5nIG9uZSBvciBtb3JlIG9mCi0gICAgICAgICAgICAmbHQ7cmVwb3NpdG9yeSZndDsgc3ViZWxlbWVudHMuCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+Y29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5Db250YWluZXJEZXNjcmlwdG9ySGFuZGxlckNvbmZpZzwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTZXQgb2YgY29tcG9uZW50cyB3aGljaCBmaWx0ZXIgdmFyaW91cyBjb250YWluZXIgZGVzY3JpcHRvcnMgb3V0IG9mCi0gICAgICAgICAgICB0aGUgbm9ybWFsIGFyY2hpdmUgc3RyZWFtLCBzbyB0aGV5IGNhbiBiZSBhZ2dyZWdhdGVkIHRoZW4gYWRkZWQuCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLQotICAgIDwhLS0gU2hhcmVkIHdpdGggY29tcG9uZW50IGRlc2NyaXB0b3IgZnJvbSBoZXJlIG9uLiAtLT4KLSAgICA8Y2xhc3M+Ci0gICAgICA8bmFtZT5GaWxlU2V0PC9uYW1lPgotICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBIGZpbGVTZXQgYWxsb3dzIHRoZSBpbmNsdXNpb24gb2YgZ3JvdXBzIG9mIGZpbGVzIGludG8gdGhlIGFzc2VtYmx5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT51c2VEZWZhdWx0RXhjbHVkZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT50cnVlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgV2hldGhlciBzdGFuZGFyZCBleGNsdXNpb24gcGF0dGVybnMsIHN1Y2ggYXMgdGhvc2UgbWF0Y2hpbmcgQ1ZTIGFuZCBTdWJ2ZXJzaW9uCi0gICAgICAgICAgICBtZXRhZGF0YSBmaWxlcywgc2hvdWxkIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgZmlsZXMgYWZmZWN0ZWQgYnkgdGhpcyBzZXQuCi0gICAgICAgICAgICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+b3V0cHV0RGlyZWN0b3J5PC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgcm9vdAotICAgICAgICAgICAgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhc3NlbWJseS4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAgICAibG9nIiB3aWxsIHB1dCB0aGUgc3BlY2lmaWVkIGZpbGVzIGluIHRoZSBsb2cgZGlyZWN0b3J5LgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2luY2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgZmlsZXMgYW5kIGRpcmVjdG9yeSB0byBpbmNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtpbmNsdWRlcyZndDsgcmVwcmVzZW50cyBhbGwgdmFsaWQgdmFsdWVzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7ZXhjbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBmaWxlcyBhbmQgZGlyZWN0b3J5IHRvIGV4Y2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2V4Y2x1ZGVzJmd0OyByZXByZXNlbnRzIG5vIGV4Y2x1c2lvbnMuCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZmlsZU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDY0NDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZmlsZSBtb2RlIG9mIHRoZSBmaWxlcyBpbmNsdWRlZC4KLSAgICAgICAgICAgIFRISVMgSVMgQU4gT0NUQUwgVkFMVUUuCi0gICAgICAgICAgICBGb3JtYXQ6IChVc2VyKShHcm91cCkoT3RoZXIpIHdoZXJlIGVhY2ggY29tcG9uZW50IGlzIGEgc3VtIG9mIFJlYWQgPSA0LAotICAgICAgICAgICAgV3JpdGUgPSAyLCBhbmQgRXhlY3V0ZSA9IDEuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIDA2NDQKLSAgICAgICAgICAgIHRyYW5zbGF0ZXMgdG8gVXNlciByZWFkLXdyaXRlLCBHcm91cCBhbmQgT3RoZXIgcmVhZC1vbmx5LiAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDY0NC4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25sYW1wLmNvbS9wdWIvYS9ic2QvMjAwMC8wOS8wNi9GcmVlQlNEX0Jhc2ljcy5odG1sIj4obW9yZSBvbiB1bml4LXN0eWxlIHBlcm1pc3Npb25zKTwvYT4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5kaXJlY3RvcnlNb2RlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjA3NTU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNpbWlsYXIgdG8gYSBVTklYIHBlcm1pc3Npb24sIHNldHMgdGhlIGRpcmVjdG9yeSBtb2RlIG9mIHRoZSBkaXJlY3RvcmllcwotICAgICAgICAgICAgaW5jbHVkZWQuIAotICAgICAgICAgICAgVEhJUyBJUyBBTiBPQ1RBTCBWQUxVRS4KLSAgICAgICAgICAgIEZvcm1hdDogKFVzZXIpKEdyb3VwKShPdGhlcikgd2hlcmUgZWFjaCBjb21wb25lbnQgaXMgYSBzdW0gb2YKLSAgICAgICAgICAgIFJlYWQgPSA0LCBXcml0ZSA9IDIsIGFuZCBFeGVjdXRlID0gMS4gIEZvciBleGFtcGxlLCB0aGUgdmFsdWUKLSAgICAgICAgICAgIDA3NTUgdHJhbnNsYXRlcyB0byBVc2VyIHJlYWQtd3JpdGUsIEdyb3VwIGFuZCBPdGhlciByZWFkLW9ubHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDA3NTUuCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9ubGFtcC5jb20vcHViL2EvYnNkLzIwMDAvMDkvMDYvRnJlZUJTRF9CYXNpY3MuaHRtbCI+KG1vcmUgb24gdW5peC1zdHlsZSBwZXJtaXNzaW9ucyk8L2E+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZGlyZWN0b3J5PC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgbG9jYXRpb24gZnJvbSB0aGUgbW9kdWxlJ3MKLSAgICAgICAgICAgIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUsICJzcmMvbWFpbi9iaW4iIHdvdWxkIHNlbGVjdCB0aGlzCi0gICAgICAgICAgICBzdWJkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QgaW4gd2hpY2ggdGhpcyBkZXBlbmRlbmN5IGlzIGRlZmluZWQuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5saW5lRW5kaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTZXRzIHRoZSBsaW5lLWVuZGluZ3Mgb2YgdGhlIGZpbGVzIGluIHRoaXMgZmlsZVNldC4KLSAgICAgICAgICAgIFZhbGlkIHZhbHVlczoKLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxiPiJrZWVwIjwvYj4gLSBQcmVzZXJ2ZSBhbGwgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJ1bml4IjwvYj4gLSBVc2UgVW5peC1zdHlsZSBsaW5lIGVuZGluZ3M8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+ImxmIjwvYj4gLSBVc2UgYSBzaW5nbGUgbGluZS1mZWVkIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4iZG9zIjwvYj4gLSBVc2UgRE9TLXN0eWxlIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4iY3JsZiI8L2I+IC0gVXNlIENhcnJhaWdlLXJldHVybiwgbGluZS1mZWVkIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbHRlcmVkPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgV2hldGhlciB0byBmaWx0ZXIgc3ltYm9scyBpbiB0aGUgZmlsZXMgYXMgdGhleSBhcmUgY29waWVkLCB1c2luZwotICAgICAgICAgIHByb3BlcnRpZXMgZnJvbSB0aGUgYnVpbGQgY29uZmlndXJhdGlvbi4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+ZmFsc2U8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLSAgICA8Y2xhc3M+Ci0gICAgICA8bmFtZT5GaWxlSXRlbTwvbmFtZT4KLSAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQSBmaWxlIGFsbG93cyBpbmRpdmlkdWFsIGZpbGUgaW5jbHVzaW9uIHdpdGggdGhlIG9wdGlvbiB0byBjaGFuZ2UKLSAgICAgICAgdGhlIGRlc3RpbmF0aW9uIGZpbGVuYW1lIG5vdCBzdXBwb3J0ZWQgYnkgZmlsZVNldHMuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnNvdXJjZTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBhYnNvbHV0ZSBvciByZWxhdGl2ZSBwYXRoIGZyb20gdGhlIG1vZHVsZSdzIGRpcmVjdG9yeQotICAgICAgICAgICAgb2YgdGhlIGZpbGUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGFzc2VtYmx5LgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXREaXJlY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8cmVxdWlyZWQ+ZmFsc2U8L3JlcXVpcmVkPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHJvb3QKLSAgICAgICAgICAgIG9mIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgYXNzZW1ibHkuIEZvciBleGFtcGxlLAotICAgICAgICAgICAgImxvZyIgd2lsbCBwdXQgdGhlIHNwZWNpZmllZCBmaWxlcyBpbiB0aGUgbG9nIGRpcmVjdG9yeS4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZGVzdE5hbWU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBkZXN0aW5hdGlvbiBmaWxlbmFtZSBpbiB0aGUgb3V0cHV0RGlyZWN0b3J5LgotICAgICAgICAgICAgRGVmYXVsdCBpcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBzb3VyY2UncyBmaWxlLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5maWxlTW9kZTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDwhLS0gCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4wNjQ0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgLS0+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTaW1pbGFyIHRvIGEgVU5JWCBwZXJtaXNzaW9uLCBzZXRzIHRoZSBmaWxlIG1vZGUgb2YgdGhlIGZpbGVzIGluY2x1ZGVkLgotICAgICAgICAgICAgVEhJUyBJUyBBTiBPQ1RBTCBWQUxVRS4KLSAgICAgICAgICAgIEZvcm1hdDogKFVzZXIpKEdyb3VwKShPdGhlcikgd2hlcmUgZWFjaCBjb21wb25lbnQgaXMgYSBzdW0gb2YgUmVhZCA9IDQsCi0gICAgICAgICAgICBXcml0ZSA9IDIsIGFuZCBFeGVjdXRlID0gMS4gIEZvciBleGFtcGxlLCB0aGUgdmFsdWUgMDY0NAotICAgICAgICAgICAgdHJhbnNsYXRlcyB0byBVc2VyIHJlYWQtd3JpdGUsIEdyb3VwIGFuZCBPdGhlciByZWFkLW9ubHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDA2NDQuCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9ubGFtcC5jb20vcHViL2EvYnNkLzIwMDAvMDkvMDYvRnJlZUJTRF9CYXNpY3MuaHRtbCI+KG1vcmUgb24gdW5peC1zdHlsZSBwZXJtaXNzaW9ucyk8L2E+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+bGluZUVuZGluZzwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2V0cyB0aGUgbGluZS1lbmRpbmdzIG9mIHRoZSBmaWxlcyBpbiB0aGlzIGZpbGUuCi0gICAgICAgICAgICBWYWxpZCB2YWx1ZXMgYXJlOgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGI+ImtlZXAiPC9iPiAtIFByZXNlcnZlIGFsbCBsaW5lIGVuZGluZ3M8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+InVuaXgiPC9iPiAtIFVzZSBVbml4LXN0eWxlIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4ibGYiPC9iPiAtIFVzZSBhIHNpbmdsZSBsaW5lLWZlZWQgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJkb3MiPC9iPiAtIFVzZSBET1Mtc3R5bGUgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJjcmxmIjwvYj4gLSBVc2UgQ2FycmFpZ2UtcmV0dXJuLCBsaW5lLWZlZWQgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZmlsdGVyZWQ8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB3aGV0aGVyIHRvIGRldGVybWluZSBpZiB0aGUgZmlsZSBpcyBmaWx0ZXJlZC4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLQotICAgIDxjbGFzcz4KLSAgICAgIDxuYW1lPkRlcGVuZGVuY3lTZXQ8L25hbWU+Ci0gICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgZGVwZW5kZW5jeVNldCBhbGxvd3MgaW5jbHVzaW9uIGFuZCBleGNsdXNpb24gb2YgcHJvamVjdCBkZXBlbmRlbmNpZXMKLSAgICAgICAgaW4gdGhlIGFzc2VtYmx5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXREaXJlY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSByb290Ci0gICAgICAgICAgICBvZiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGFzc2VtYmx5LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICAgICJsb2ciIHdpbGwgcHV0IHRoZSBzcGVjaWZpZWQgZmlsZXMgaW4gdGhlIGxvZyBkaXJlY3RvcnksCi0gICAgICAgICAgICBkaXJlY3RseSBiZW5lYXRoIHRoZSByb290IG9mIHRoZSBhcmNoaXZlLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2luY2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgYXJ0aWZhY3QgY29vcmRpbmF0ZXMgdG8gaW5jbHVkZS4gSWYgbm9uZSBpcyBwcmVzZW50LCB0aGVuCi0gICAgICAgICAgICAmbHQ7aW5jbHVkZXMmZ3Q7IHJlcHJlc2VudHMgYWxsIHZhbGlkIHZhbHVlcy4KLQotICAgICAgICAgICAgQXJ0aWZhY3QgY29vcmRpbmF0ZXMgbWF5IGJlIGdpdmVuIGluIHNpbXBsZSBncm91cElkOmFydGlmYWN0SWQgZm9ybSwKLSAgICAgICAgICAgIG9yIHRoZXkgbWF5IGJlIGZ1bGx5IHF1YWxpZmllZCBpbiB0aGUgZm9ybSBncm91cElkOmFydGlmYWN0SWQ6dHlwZVs6Y2xhc3NpZmllcl06dmVyc2lvbi4KLSAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgd2lsZGNhcmRzIGNhbiBiZSB1c2VkLCBhcyBpbiAqOm1hdmVuLSoKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5leGNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2V4Y2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgZGVwZW5kZW5jeSBhcnRpZmFjdCBjb29yZGluYXRlcyB0byBleGNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtleGNsdWRlcyZndDsgcmVwcmVzZW50cyBubyBleGNsdXNpb25zLgotCi0gICAgICAgICAgICBBcnRpZmFjdCBjb29yZGluYXRlcyBtYXkgYmUgZ2l2ZW4gaW4gc2ltcGxlIGdyb3VwSWQ6YXJ0aWZhY3RJZCBmb3JtLAotICAgICAgICAgICAgb3IgdGhleSBtYXkgYmUgZnVsbHkgcXVhbGlmaWVkIGluIHRoZSBmb3JtIGdyb3VwSWQ6YXJ0aWZhY3RJZDp0eXBlWzpjbGFzc2lmaWVyXTp2ZXJzaW9uLgotICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQsIGFzIGluICo6bWF2ZW4tKgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVNb2RlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjA2NDQ8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNpbWlsYXIgdG8gYSBVTklYIHBlcm1pc3Npb24sIHNldHMgdGhlIGZpbGUgbW9kZSBvZiB0aGUgZmlsZXMgaW5jbHVkZWQuCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZiBSZWFkID0gNCwKLSAgICAgICAgICAgIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAwNjQ0Ci0gICAgICAgICAgICB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDY0NC4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25sYW1wLmNvbS9wdWIvYS9ic2QvMjAwMC8wOS8wNi9GcmVlQlNEX0Jhc2ljcy5odG1sIj4obW9yZSBvbiB1bml4LXN0eWxlIHBlcm1pc3Npb25zKTwvYT4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5kaXJlY3RvcnlNb2RlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjA3NTU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNpbWlsYXIgdG8gYSBVTklYIHBlcm1pc3Npb24sIHNldHMgdGhlIGRpcmVjdG9yeSBtb2RlIG9mIHRoZSBkaXJlY3RvcmllcwotICAgICAgICAgICAgaW5jbHVkZWQuIAotICAgICAgICAgICAgVEhJUyBJUyBBTiBPQ1RBTCBWQUxVRS4KLSAgICAgICAgICAgIEZvcm1hdDogKFVzZXIpKEdyb3VwKShPdGhlcikgd2hlcmUgZWFjaCBjb21wb25lbnQgaXMgYSBzdW0gb2YKLSAgICAgICAgICAgIFJlYWQgPSA0LCBXcml0ZSA9IDIsIGFuZCBFeGVjdXRlID0gMS4gIEZvciBleGFtcGxlLCB0aGUgdmFsdWUKLSAgICAgICAgICAgIDA3NTUgdHJhbnNsYXRlcyB0byBVc2VyIHJlYWQtd3JpdGUsIEdyb3VwIGFuZCBPdGhlciByZWFkLW9ubHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDA3NTUuCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9ubGFtcC5jb20vcHViL2EvYnNkLzIwMDAvMDkvMDYvRnJlZUJTRF9CYXNpY3MuaHRtbCI+KG1vcmUgb24gdW5peC1zdHlsZSBwZXJtaXNzaW9ucyk8L2E+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlU3RyaWN0RmlsdGVyaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+ZmFsc2U8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgV2hlbiBzcGVjaWZpZWQgYXMgdHJ1ZSwgYW55IGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJucyB3aGljaCBhcmVuJ3QgdXNlZCB0byBmaWx0ZXIgYW4gYWN0dWFsCi0gICAgICAgICAgYXJ0aWZhY3QgZHVyaW5nIGFzc2VtYmx5IGNyZWF0aW9uIHdpbGwgY2F1c2UgdGhlIGJ1aWxkIHRvIGZhaWwgd2l0aCBhbiBlcnJvci4gVGhpcyBpcyBtZWFudAotICAgICAgICAgIHRvIGhpZ2hsaWdodCBvYnNvbGV0ZSBpbmNsdXNpb25zIG9yIGV4Y2x1c2lvbnMsIG9yIGVsc2Ugc2lnbmFsIHRoYXQgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IKLSAgICAgICAgICBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkLiAoU2luY2UgMi4yKQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXRGaWxlTmFtZU1hcHBpbmc8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0tJHthcnRpZmFjdC52ZXJzaW9ufSR7ZGFzaENsYXNzaWZpZXI/fS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBtYXBwaW5nIHBhdHRlcm4gZm9yIGFsbCBkZXBlbmRlbmNpZXMgaW5jbHVkZWQgaW4gdGhpcwotICAgICAgICAgICAgYXNzZW1ibHkuIERlZmF1bHQgaXMgJHthcnRpZmFjdC5hcnRpZmFjdElkfS0ke2FydGlmYWN0LnZlcnNpb259JHtkYXNoQ2xhc3NpZmllcj99LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufS4KLSAgICAgICAgICAgIChTaW5jZSAyLjItYmV0YS0yOyAyLjItYmV0YS0xIHVzZXMgJHthcnRpZmFjdElkfS0ke3ZlcnNpb259JHtkYXNoQ2xhc3NpZmllcj99LiR7ZXh0ZW5zaW9ufSkuCi0gICAgICAgICAgICBOT1RFOiBJZiB0aGUgZGVwZW5kZW5jeVNldCBzcGVjaWZpZXMgdW5wYWNrID09IHRydWUsIG91dHB1dEZpbGVOYW1lTWFwcGluZyBXSUxMIE5PVCBCRSBVU0VEOyBpbiB0aGVzZSBjYXNlcywKLSAgICAgICAgICAgIHVzZSBvdXRwdXREaXJlY3RvcnkuCi0gICAgICAgICAgICBTZWUgdGhlIHBsdWdpbiBGQVEgZm9yIG1vcmUgZGV0YWlscyBhYm91dCBlbnRyaWVzIHVzYWJsZSBpbiB0aGUgb3V0cHV0RmlsZU5hbWVNYXBwaW5nIHBhcmFtZXRlci4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dW5wYWNrPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+ZmFsc2U8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBJZiBzZXQgdG8gdHJ1ZSwgdGhpcyBwcm9wZXJ0eSB3aWxsIHVucGFjayBhbGwgZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICBpbnRvIHRoZSBzcGVjaWZpZWQgb3V0cHV0IGRpcmVjdG9yeS4gV2hlbiBzZXQgdG8gZmFsc2UsCi0gICAgICAgICAgICBkZXBlbmRlbmNpZXMgd2lsbCBiZSBpbmNsdWRlZCBhcyBhcmNoaXZlcyAoamFycykuIENhbiBvbmx5IHVucGFjawotICAgICAgICAgICAgamFyLCB6aXAsIHRhci5neiwgYW5kIHRhci5ieiBhcmNoaXZlcy4gRGVmYXVsdCB2YWx1ZSBpcyBmYWxzZS4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dW5wYWNrT3B0aW9uczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIEFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBpbmNsdWRlcyBhbmQgZXhjbHVkZXMsIGFsb25nIHdpdGggZmlsdGVyaW5nIG9wdGlvbnMsIGZvciBpdGVtcwotICAgICAgICAgIHVucGFja2VkIGZyb20gYSBkZXBlbmRlbmN5IGFydGlmYWN0LiAoU2luY2UgMi4yKQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+VW5wYWNrT3B0aW9uczwvdHlwZT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPiAgICAgICAgICAgICAgCi0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+cnVudGltZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBkZXBlbmRlbmN5IHNjb3BlIGZvciB0aGlzIGRlcGVuZGVuY3lTZXQuCi0gICAgICAgICAgICBEZWZhdWx0IHNjb3BlIHZhbHVlIGlzICJydW50aW1lIi4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlUHJvamVjdEFydGlmYWN0PC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+dHJ1ZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGFydGlmYWN0IHByb2R1Y2VkIGR1cmluZyB0aGUgY3VycmVudCBwcm9qZWN0J3MKLSAgICAgICAgICBidWlsZCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhpcyBkZXBlbmRlbmN5IHNldC4gRGVmYXVsdCB2YWx1ZSBpcyB0cnVlLAotICAgICAgICAgIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LiAoU2luY2UgMi4yKQotICAgICAgICAgIF1dPjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT51c2VQcm9qZWN0QXR0YWNobWVudHM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5mYWxzZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVsKLSAgICAgICAgICBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGF0dGFjaGVkIGFydGlmYWN0cyBwcm9kdWNlZCBkdXJpbmcgdGhlIGN1cnJlbnQgcHJvamVjdCdzCi0gICAgICAgICAgYnVpbGQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoaXMgZGVwZW5kZW5jeSBzZXQuIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuIChTaW5jZSAyLjIpCi0gICAgICAgICAgXV0+PC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT50cnVlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIERldGVybWluZXMgd2hldGhlciB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBwcm9jZXNzaW5nIG9mCi0gICAgICAgICAgdGhlIGN1cnJlbnQgZGVwZW5kZW5jeSBzZXQuIElmIHRydWUsIGluY2x1ZGVzL2V4Y2x1ZGVzL3VzZVRyYW5zaXRpdmVGaWx0ZXJpbmcKLSAgICAgICAgICB3aWxsIGFwcGx5IHRvIHRyYW5zaXRpdmUgZGVwZW5kZW5jeSBhcnRpZmFjdHMgaW4gYWRkaXRpb24gdG8gdGhlIG1haW4gcHJvamVjdAotICAgICAgICAgIGRlcGVuZGVuY3kgYXJ0aWZhY3RzLiBJZiBmYWxzZSwgdXNlVHJhbnNpdGl2ZUZpbHRlcmluZyBpcyBtZWFuaW5nbGVzcywgYW5kIAotICAgICAgICAgIGluY2x1ZGVzL2V4Y2x1ZGVzIG9ubHkgYWZmZWN0IHRoZSBpbW1lZGlhdGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBwcm9qZWN0LgotICAgICAgICAgIEJ5IGRlZmF1bHQsIHRoaXMgdmFsdWUgaXMgdHJ1ZS4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlVHJhbnNpdGl2ZUZpbHRlcmluZzwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPmZhbHNlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIERldGVybWluZXMgd2hldGhlciB0aGUgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIGluIHRoaXMgZGVwZW5kZW5jeSBzZXQgd2lsbCBiZSBhcHBsaWVkIHRvCi0gICAgICAgICAgdGhlIHRyYW5zaXRpdmUgcGF0aCBvZiBhIGdpdmVuIGFydGlmYWN0LiBJZiB0cnVlLCBhbmQgdGhlIGN1cnJlbnQgYXJ0aWZhY3QgaXMgYSB0cmFuc2l0aXZlCi0gICAgICAgICAgZGVwZW5kZW5jeSBicm91Z2h0IGluIGJ5IGFub3RoZXIgYXJ0aWZhY3Qgd2hpY2ggbWF0Y2hlcyBhbiBpbmNsdXNpb24gb3IgZXhjbHVzaW9uIHBhdHRlcm4sIAotICAgICAgICAgIHRoZW4gdGhlIGN1cnJlbnQgYXJ0aWZhY3QgaGFzIHRoZSBzYW1lIGluY2x1c2lvbi9leGNsdXNpb24gbG9naWMgYXBwbGllZCB0byBpdCBhcyB3ZWxsLiBCeQotICAgICAgICAgIGRlZmF1bHQsIHRoaXMgdmFsdWUgaXMgZmFsc2UsIGluIG9yZGVyIHRvIHByZXNlcnZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uIDIuMS4KLSAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgaW5jbHVkZXMvZXhjbHVkZXMgb25seSBhcHBseSBkaXJlY3RseSB0byB0aGUgY3VycmVudCBhcnRpZmFjdCwgYW5kIG5vdCB0bwotICAgICAgICAgIHRoZSB0cmFuc2l0aXZlIHNldCBvZiBhcnRpZmFjdHMgd2hpY2ggYnJvdWdodCBpdCBpbi4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLQotICAgIDxjbGFzcz4KLSAgICAgIDxuYW1lPk1vZHVsZVNldDwvbmFtZT4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgIEEgbW9kdWxlU2V0IHJlcHJlc2VudCBvbmUgb3IgbW9yZSBwcm9qZWN0ICZsdDttb2R1bGUmZ3Q7IHByZXNlbnQgaW5zaWRlCi0gICAgICAgIGEgcHJvamVjdCdzIHBvbS54bWwuIFRoaXMgYWxsb3dzIHlvdSB0byBpbmNsdWRlIHNvdXJjZXMgb3IgYmluYXJpZXMKLSAgICAgICAgYmVsb25naW5nIHRvIGEgcHJvamVjdCdzICZsdDttb2R1bGVzJmd0Oy4KLQotICAgICAgICA8YnIvPjxiPk5PVEU6PC9iPiBXaGVuIHVzaW5nICZsdDttb2R1bGVTZXRzJmd0OyBmcm9tIHRoZSBjb21tYW5kLWxpbmUsIGl0Ci0gICAgICAgIGlzIHJlcXVpcmVkIHRvIHBhc3MgZmlyc3QgdGhlIHBhY2thZ2UgcGhhc2UgYnkgZG9pbmc6ICJtdm4gcGFja2FnZQotICAgICAgICBhc3NlbWJseTphc3NlbWJseSIuIFRoaXMgYnVnL2lzc3VlIGlzIHNjaGVkdWxlZCB0byBiZSBhZGRyZXNzZWQgYnkgTWF2ZW4gMi4xLgotICAgICAgICBdXT4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICA8ZmllbGRzPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlQWxsUmVhY3RvclByb2plY3RzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+ZmFsc2U8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgSWYgc2V0IHRvIHRydWUsIHRoZSBwbHVnaW4gd2lsbCBpbmNsdWRlIGFsbCBwcm9qZWN0cyBpbiB0aGUgY3VycmVudCByZWFjdG9yIGZvciBwcm9jZXNzaW5nIAotICAgICAgICAgIGluIHRoaXMgTW9kdWxlU2V0LiBUaGVzZSB3aWxsIGJlIHN1YmplY3QgdG8gaW5jbHVkZS9leGNsdWRlIHJ1bGVzLgotICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+aW5jbHVkZVN1Yk1vZHVsZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT50cnVlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlIHBsdWdpbiB3aWxsIGV4Y2x1ZGUgc3ViLW1vZHVsZXMgZnJvbSBwcm9jZXNzaW5nIGluIHRoaXMgTW9kdWxlU2V0LgotICAgICAgICAgIE90aGVyd2lzZSwgaXQgd2lsbCBwcm9jZXNzIGFsbCBzdWItbW9kdWxlcywgZWFjaCBzdWJqZWN0IHRvIGluY2x1ZGUvZXhjbHVkZSBydWxlcy4KLSAgICAgICAgICBEZWZhdWx0IHZhbHVlIGlzIHRydWUuIChTaW5jZSAyLjIpCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmluY2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7aW5jbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBwcm9qZWN0IGNvb3JkaW5hdGVzIHRvIGluY2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2luY2x1ZGVzJmd0OyByZXByZXNlbnRzIGFsbCB2YWxpZCB2YWx1ZXMuCi0KLSAgICAgICAgICAgIEFydGlmYWN0IGNvb3JkaW5hdGVzIG1heSBiZSBnaXZlbiBpbiBzaW1wbGUgZ3JvdXBJZDphcnRpZmFjdElkIGZvcm0sCi0gICAgICAgICAgICBvciB0aGV5IG1heSBiZSBmdWxseSBxdWFsaWZpZWQgaW4gdGhlIGZvcm0gZ3JvdXBJZDphcnRpZmFjdElkOnR5cGVbOmNsYXNzaWZpZXJdOnZlcnNpb24uCi0gICAgICAgICAgICBBZGRpdGlvbmFsbHksIHdpbGRjYXJkcyBjYW4gYmUgdXNlZCwgYXMgaW4gKjptYXZlbi0qCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZXhjbHVkZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBXaGVuICZsdDtleGNsdWRlJmd0OyBzdWJlbGVtZW50cyBhcmUgcHJlc2VudCwgdGhleSBkZWZpbmUgYSBzZXQgb2YKLSAgICAgICAgICAgIHByb2plY3QgYXJ0aWZhY3QgY29vcmRpbmF0ZXMgdG8gZXhjbHVkZS4gSWYgbm9uZSBpcyBwcmVzZW50LCB0aGVuCi0gICAgICAgICAgICAmbHQ7ZXhjbHVkZXMmZ3Q7IHJlcHJlc2VudHMgbm8gZXhjbHVzaW9ucy4KLQotICAgICAgICAgICAgQXJ0aWZhY3QgY29vcmRpbmF0ZXMgbWF5IGJlIGdpdmVuIGluIHNpbXBsZSBncm91cElkOmFydGlmYWN0SWQgZm9ybSwKLSAgICAgICAgICAgIG9yIHRoZXkgbWF5IGJlIGZ1bGx5IHF1YWxpZmllZCBpbiB0aGUgZm9ybSBncm91cElkOmFydGlmYWN0SWQ6dHlwZVs6Y2xhc3NpZmllcl06dmVyc2lvbi4KLSAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgd2lsZGNhcmRzIGNhbiBiZSB1c2VkLCBhcyBpbiAqOm1hdmVuLSoKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5zb3VyY2VzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBXaGVuIHRoaXMgaXMgcHJlc2VudCwgdGhlIHBsdWdpbiB3aWxsIGluY2x1ZGUgdGhlIHNvdXJjZSBmaWxlcyBvZgotICAgICAgICAgICAgdGhlIGluY2x1ZGVkIG1vZHVsZXMgZnJvbSB0aGlzIHNldCBpbiB0aGUgcmVzdWx0aW5nIGFzc2VtYmx5LgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+TW9kdWxlU291cmNlczwvdHlwZT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+YmluYXJpZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFdoZW4gdGhpcyBpcyBwcmVzZW50LCB0aGUgcGx1Z2luIHdpbGwgaW5jbHVkZSB0aGUgYmluYXJpZXMgb2YgdGhlCi0gICAgICAgICAgICBpbmNsdWRlZCBtb2R1bGVzIGZyb20gdGhpcyBzZXQgaW4gdGhlIHJlc3VsdGluZyBhc3NlbWJseS4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPk1vZHVsZUJpbmFyaWVzPC90eXBlPgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICA8L2ZpZWxkcz4KLSAgICA8L2NsYXNzPgotCi0gICAgPGNsYXNzPgotICAgICAgPG5hbWU+TW9kdWxlU291cmNlczwvbmFtZT4KLSAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQ29udGFpbnMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBpbmNsdWRpbmcgdGhlIHNvdXJjZSBmaWxlcyBvZiBhCi0gICAgICAgIHByb2plY3QgbW9kdWxlIGluIGFuIGFzc2VtYmx5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT51c2VEZWZhdWx0RXhjbHVkZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT50cnVlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgV2hldGhlciBzdGFuZGFyZCBleGNsdXNpb24gcGF0dGVybnMsIHN1Y2ggYXMgdGhvc2UgbWF0Y2hpbmcgQ1ZTIGFuZCBTdWJ2ZXJzaW9uCi0gICAgICAgICAgICBtZXRhZGF0YSBmaWxlcywgc2hvdWxkIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgZmlsZXMgYWZmZWN0ZWQgYnkgdGhpcyBzZXQuCi0gICAgICAgICAgICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+b3V0cHV0RGlyZWN0b3J5PC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgcm9vdAotICAgICAgICAgICAgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhc3NlbWJseS4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAgICAibG9nIiB3aWxsIHB1dCB0aGUgc3BlY2lmaWVkIGZpbGVzIGluIHRoZSBsb2cgZGlyZWN0b3J5LgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2luY2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgZmlsZXMgYW5kIGRpcmVjdG9yeSB0byBpbmNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtpbmNsdWRlcyZndDsgcmVwcmVzZW50cyBhbGwgdmFsaWQgdmFsdWVzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7ZXhjbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBmaWxlcyBhbmQgZGlyZWN0b3J5IHRvIGV4Y2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2V4Y2x1ZGVzJmd0OyByZXByZXNlbnRzIG5vIGV4Y2x1c2lvbnMuCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZmlsZU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDY0NDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZmlsZSBtb2RlIG9mIHRoZSBmaWxlcyBpbmNsdWRlZC4KLSAgICAgICAgICAgIFRISVMgSVMgQU4gT0NUQUwgVkFMVUUuCi0gICAgICAgICAgICBGb3JtYXQ6IChVc2VyKShHcm91cCkoT3RoZXIpIHdoZXJlIGVhY2ggY29tcG9uZW50IGlzIGEgc3VtIG9mIFJlYWQgPSA0LAotICAgICAgICAgICAgV3JpdGUgPSAyLCBhbmQgRXhlY3V0ZSA9IDEuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIDA2NDQKLSAgICAgICAgICAgIHRyYW5zbGF0ZXMgdG8gVXNlciByZWFkLXdyaXRlLCBHcm91cCBhbmQgT3RoZXIgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwNjQ0LgotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmxhbXAuY29tL3B1Yi9hL2JzZC8yMDAwLzA5LzA2L0ZyZWVCU0RfQmFzaWNzLmh0bWwiPihtb3JlIG9uIHVuaXgtc3R5bGUgcGVybWlzc2lvbnMpPC9hPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmRpcmVjdG9yeU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDc1NTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZGlyZWN0b3J5IG1vZGUgb2YgdGhlIGRpcmVjdG9yaWVzCi0gICAgICAgICAgICBpbmNsdWRlZC4gCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZgotICAgICAgICAgICAgUmVhZCA9IDQsIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZQotICAgICAgICAgICAgMDc1NSB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDc1NS4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25sYW1wLmNvbS9wdWIvYS9ic2QvMjAwMC8wOS8wNi9GcmVlQlNEX0Jhc2ljcy5odG1sIj4obW9yZSBvbiB1bml4LXN0eWxlIHBlcm1pc3Npb25zKTwvYT4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5maWxlU2V0czwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+RmlsZVNldDwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggZ3JvdXBzIG9mIGZpbGVzIGZyb20gZWFjaCBpbmNsdWRlZCBtb2R1bGUgdG8gaW5jbHVkZSBpbiB0aGUgYXNzZW1ibHkuIEEKLSAgICAgICAgICAgIGZpbGVTZXQgaXMgc3BlY2lmaWVkIGJ5IHByb3ZpZGluZyBvbmUgb3IgbW9yZSBvZiAmbHQ7ZmlsZVNldCZndDsgc3ViZWxlbWVudHMuIChTaW5jZSAyLjIpCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+aW5jbHVkZU1vZHVsZURpcmVjdG9yeTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnRydWU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNwZWNpZmllcyB3aGV0aGVyIHRoZSBtb2R1bGUncyBmaW5hbE5hbWUgc2hvdWxkIGJlIHByZXBlbmRlZCB0byB0aGUgb3V0cHV0RGlyZWN0b3J5IAotICAgICAgICAgICAgdmFsdWVzIG9mIGFueSBmaWxlU2V0cyBhcHBsaWVkIHRvIGl0LiBEZWZhdWx0IHZhbHVlIGlzIHRydWUuIChTaW5jZSAyLjIpCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZXhjbHVkZVN1Yk1vZHVsZURpcmVjdG9yaWVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+dHJ1ZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3ViLW1vZHVsZSBkaXJlY3RvcmllcyBiZWxvdyB0aGUgY3VycmVudCBtb2R1bGUgc2hvdWxkIGJlIGV4Y2x1ZGVkCi0gICAgICAgICAgICBmcm9tIGZpbGVTZXRzIGFwcGxpZWQgdG8gdGhhdCBtb2R1bGUuIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIHlvdSBvbmx5IG1lYW4gdG8gY29weQotICAgICAgICAgICAgdGhlIHNvdXJjZXMgZm9yIHRoZSBleGFjdCBtb2R1bGUgbGlzdCBtYXRjaGVkIGJ5IHRoaXMgTW9kdWxlU2V0LCBpZ25vcmluZyAob3IgcHJvY2Vzc2luZwotICAgICAgICAgICAgc2VwYXJhdGVseSkgdGhlIG1vZHVsZXMgd2hpY2ggZXhpc3QgaW4gZGlyZWN0b3JpZXMgYmVsb3cgdGhlIGN1cnJlbnQgb25lLiAKLSAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4gKFNpbmNlIDIuMikKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXREaXJlY3RvcnlNYXBwaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4ke21vZHVsZS5hcnRpZmFjdElkfTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIG1hcHBpbmcgcGF0dGVybiBmb3IgYWxsIG1vZHVsZSBiYXNlLWRpcmVjdG9yaWVzIGluY2x1ZGVkIGluIHRoaXMgYXNzZW1ibHkuCi0gICAgICAgICAgICBOT1RFOiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpZiBpbmNsdWRlTW9kdWxlRGlyZWN0b3J5ID09IHRydWUuCi0gICAgICAgICAgICBEZWZhdWx0IGlzIHRoZSBtb2R1bGUncyAke2FydGlmYWN0SWR9IGluIDIuMi1iZXRhLTEsIGFuZCAke21vZHVsZS5hcnRpZmFjdElkfSBpbiBzdWJzZXF1ZW50IHZlcnNpb25zLiAoU2luY2UgMi4yKQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICA8L2ZpZWxkcz4KLSAgICA8L2NsYXNzPgotCi0gICAgPGNsYXNzPgotICAgICAgPG5hbWU+TW9kdWxlQmluYXJpZXM8L25hbWU+Ci0gICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIENvbnRhaW5zIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgaW5jbHVkaW5nIHRoZSBiaW5hcnkgZmlsZXMgb2YgYQotICAgICAgICBwcm9qZWN0IG1vZHVsZSBpbiBhbiBhc3NlbWJseS4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZmllbGRzPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+b3V0cHV0RGlyZWN0b3J5PC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgcm9vdAotICAgICAgICAgICAgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhc3NlbWJseS4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAgICAibG9nIiB3aWxsIHB1dCB0aGUgc3BlY2lmaWVkIGZpbGVzIGluIHRoZSBsb2cgZGlyZWN0b3J5LAotICAgICAgICAgICAgZGlyZWN0bHkgYmVuZWF0aCB0aGUgcm9vdCBvZiB0aGUgYXJjaGl2ZS4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+aW5jbHVkZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBXaGVuICZsdDtpbmNsdWRlJmd0OyBzdWJlbGVtZW50cyBhcmUgcHJlc2VudCwgdGhleSBkZWZpbmUgYSBzZXQgb2YKLSAgICAgICAgICAgIGFydGlmYWN0IGNvb3JkaW5hdGVzIHRvIGluY2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2luY2x1ZGVzJmd0OyByZXByZXNlbnRzIGFsbCB2YWxpZCB2YWx1ZXMuCi0KLSAgICAgICAgICAgIEFydGlmYWN0IGNvb3JkaW5hdGVzIG1heSBiZSBnaXZlbiBpbiBzaW1wbGUgZ3JvdXBJZDphcnRpZmFjdElkIGZvcm0sCi0gICAgICAgICAgICBvciB0aGV5IG1heSBiZSBmdWxseSBxdWFsaWZpZWQgaW4gdGhlIGZvcm0gZ3JvdXBJZDphcnRpZmFjdElkOnR5cGVbOmNsYXNzaWZpZXJdOnZlcnNpb24uCi0gICAgICAgICAgICBBZGRpdGlvbmFsbHksIHdpbGRjYXJkcyBjYW4gYmUgdXNlZCwgYXMgaW4gKjptYXZlbi0qCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZXhjbHVkZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBXaGVuICZsdDtleGNsdWRlJmd0OyBzdWJlbGVtZW50cyBhcmUgcHJlc2VudCwgdGhleSBkZWZpbmUgYSBzZXQgb2YKLSAgICAgICAgICAgIGRlcGVuZGVuY3kgYXJ0aWZhY3QgY29vcmRpbmF0ZXMgdG8gZXhjbHVkZS4gSWYgbm9uZSBpcyBwcmVzZW50LCB0aGVuCi0gICAgICAgICAgICAmbHQ7ZXhjbHVkZXMmZ3Q7IHJlcHJlc2VudHMgbm8gZXhjbHVzaW9ucy4KLQotICAgICAgICAgICAgQXJ0aWZhY3QgY29vcmRpbmF0ZXMgbWF5IGJlIGdpdmVuIGluIHNpbXBsZSBncm91cElkOmFydGlmYWN0SWQgZm9ybSwKLSAgICAgICAgICAgIG9yIHRoZXkgbWF5IGJlIGZ1bGx5IHF1YWxpZmllZCBpbiB0aGUgZm9ybSBncm91cElkOmFydGlmYWN0SWQ6dHlwZVs6Y2xhc3NpZmllcl06dmVyc2lvbi4KLSAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgd2lsZGNhcmRzIGNhbiBiZSB1c2VkLCBhcyBpbiAqOm1hdmVuLSoKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5maWxlTW9kZTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDwhLS0gCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4wNjQ0PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgLS0+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTaW1pbGFyIHRvIGEgVU5JWCBwZXJtaXNzaW9uLCBzZXRzIHRoZSBmaWxlIG1vZGUgb2YgdGhlIGZpbGVzIGluY2x1ZGVkLgotICAgICAgICAgICAgVEhJUyBJUyBBTiBPQ1RBTCBWQUxVRS4KLSAgICAgICAgICAgIEZvcm1hdDogKFVzZXIpKEdyb3VwKShPdGhlcikgd2hlcmUgZWFjaCBjb21wb25lbnQgaXMgYSBzdW0gb2YgUmVhZCA9IDQsCi0gICAgICAgICAgICBXcml0ZSA9IDIsIGFuZCBFeGVjdXRlID0gMS4gIEZvciBleGFtcGxlLCB0aGUgdmFsdWUgMDY0NAotICAgICAgICAgICAgdHJhbnNsYXRlcyB0byBVc2VyIHJlYWQtd3JpdGUsIEdyb3VwIGFuZCBPdGhlciByZWFkLW9ubHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDA2NDQuCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9ubGFtcC5jb20vcHViL2EvYnNkLzIwMDAvMDkvMDYvRnJlZUJTRF9CYXNpY3MuaHRtbCI+KG1vcmUgb24gdW5peC1zdHlsZSBwZXJtaXNzaW9ucyk8L2E+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZGlyZWN0b3J5TW9kZTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDwhLS0gCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4wNzU1PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgLS0+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTaW1pbGFyIHRvIGEgVU5JWCBwZXJtaXNzaW9uLCBzZXRzIHRoZSBkaXJlY3RvcnkgbW9kZSBvZiB0aGUgZGlyZWN0b3JpZXMKLSAgICAgICAgICAgIGluY2x1ZGVkLiAKLSAgICAgICAgICAgIFRISVMgSVMgQU4gT0NUQUwgVkFMVUUuCi0gICAgICAgICAgICBGb3JtYXQ6IChVc2VyKShHcm91cCkoT3RoZXIpIHdoZXJlIGVhY2ggY29tcG9uZW50IGlzIGEgc3VtIG9mCi0gICAgICAgICAgICBSZWFkID0gNCwgV3JpdGUgPSAyLCBhbmQgRXhlY3V0ZSA9IDEuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlCi0gICAgICAgICAgICAwNzU1IHRyYW5zbGF0ZXMgdG8gVXNlciByZWFkLXdyaXRlLCBHcm91cCBhbmQgT3RoZXIgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwNzU1LgotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmxhbXAuY29tL3B1Yi9hL2JzZC8yMDAwLzA5LzA2L0ZyZWVCU0RfQmFzaWNzLmh0bWwiPihtb3JlIG9uIHVuaXgtc3R5bGUgcGVybWlzc2lvbnMpPC9hPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmF0dGFjaG1lbnRDbGFzc2lmaWVyPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgYXR0YWNobWVudENsYXNzaWZpZXIgd2lsbCBjYXVzZSB0aGUgYXNzZW1ibGVyIHRvIGxvb2sgYXQgYXJ0aWZhY3RzCi0gICAgICAgICAgYXR0YWNoZWQgdG8gdGhlIG1vZHVsZSBpbnN0ZWFkIG9mIHRoZSBtYWluIHByb2plY3QgYXJ0aWZhY3QuIElmIGl0IGNhbiBmaW5kIGFuIGF0dGFjaGVkCi0gICAgICAgICAgYXJ0aWZhY3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBjbGFzc2lmaWVyLCBpdCB3aWxsIHVzZSBpdDsgb3RoZXJ3aXNlLCBpdCB3aWxsIHRocm93IGFuCi0gICAgICAgICAgZXhjZXB0aW9uLiAoU2luY2UgMi4yKQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlRGVwZW5kZW5jaWVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+dHJ1ZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICBJZiBzZXQgdG8gdHJ1ZSwgdGhlIHBsdWdpbiB3aWxsIGluY2x1ZGUgdGhlIGRpcmVjdCBhbmQgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgb2YKLSAgICAgICAgICBvZiB0aGUgcHJvamVjdCBtb2R1bGVzIGluY2x1ZGVkIGhlcmUuICBPdGhlcndpc2UsIGl0IHdpbGwgb25seSBpbmNsdWRlIHRoZSBtb2R1bGUKLSAgICAgICAgICBwYWNrYWdlcyBvbmx5LiBEZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmRlcGVuZGVuY3lTZXRzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5EZXBlbmRlbmN5U2V0PC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBkZXBlbmRlbmNpZXMgb2YgdGhlIG1vZHVsZSB0byBpbmNsdWRlIGluIHRoZSBhc3NlbWJseS4gQQotICAgICAgICAgICAgZGVwZW5kZW5jeVNldCBpcyBzcGVjaWZpZWQgYnkgcHJvdmlkaW5nIG9uZSBvciBtb3JlIG9mCi0gICAgICAgICAgICAmbHQ7ZGVwZW5kZW5jeVNldCZndDsgc3ViZWxlbWVudHMuIChTaW5jZSAyLjIpCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dW5wYWNrPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+dHJ1ZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIElmIHNldCB0byB0cnVlLCB0aGlzIHByb3BlcnR5IHdpbGwgdW5wYWNrIGFsbCBtb2R1bGUgcGFja2FnZXMKLSAgICAgICAgICAgIGludG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgZGlyZWN0b3J5LiBXaGVuIHNldCB0byBmYWxzZQotICAgICAgICAgICAgbW9kdWxlIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQgYXMgYXJjaGl2ZXMgKGphcnMpLgotICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT51bnBhY2tPcHRpb25zPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgQWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGluY2x1ZGVzIGFuZCBleGNsdWRlcywgYWxvbmcgd2l0aCBmaWx0ZXJpbmcgb3B0aW9ucywgZm9yIGl0ZW1zCi0gICAgICAgICAgdW5wYWNrZWQgZnJvbSBhIG1vZHVsZSBhcnRpZmFjdC4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPiAKLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5VbnBhY2tPcHRpb25zPC90eXBlPgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXRGaWxlTmFtZU1hcHBpbmc8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjIrPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPiR7bW9kdWxlLmFydGlmYWN0SWR9LSR7bW9kdWxlLnZlcnNpb259JHtkYXNoQ2xhc3NpZmllcj99LiR7bW9kdWxlLmV4dGVuc2lvbn08L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBtYXBwaW5nIHBhdHRlcm4gZm9yIGFsbCBOT04tVU5QQUNLRUQgZGVwZW5kZW5jaWVzIGluY2x1ZGVkCi0gICAgICAgICAgICBpbiB0aGlzIGFzc2VtYmx5LgotICAgICAgICAgICAgRGVmYXVsdCBpcyAke21vZHVsZS5hcnRpZmFjdElkfS0ke21vZHVsZS52ZXJzaW9ufSR7ZGFzaENsYXNzaWZpZXI/fS4ke21vZHVsZS5leHRlbnNpb259LgotICAgICAgICAgICAgKFNpbmNlIDIuMi1iZXRhLTI7IDIuMi1iZXRhLTEgdXNlcyAke2FydGlmYWN0SWR9LSR7dmVyc2lvbn0ke2Rhc2hDbGFzc2lmaWVyP30uJHtleHRlbnNpb259KSBOT1RFOiBJZiB0aGUgCi0gICAgICAgICAgICBkZXBlbmRlbmN5U2V0IHNwZWNpZmllcyB1bnBhY2sgPT0gdHJ1ZSwgb3V0cHV0RmlsZU5hbWVNYXBwaW5nIFdJTEwgTk9UIEJFIFVTRUQ7IGluIHRoZXNlIGNhc2VzLCB1c2Ugb3V0cHV0RGlyZWN0b3J5LgotICAgICAgICAgICAgU2VlIHRoZSBwbHVnaW4gRkFRIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgZW50cmllcyB1c2FibGUgaW4gdGhlIG91dHB1dEZpbGVOYW1lTWFwcGluZyBwYXJhbWV0ZXIuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgIDwvZmllbGRzPgotICAgIDwvY2xhc3M+Ci0KLSAgICA8Y2xhc3M+Ci0gICAgICA8bmFtZT5SZXBvc2l0b3J5PC9uYW1lPgotICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgRGVmaW5lcyBhIE1hdmVuIHJlcG9zaXRvcnkgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIGFzc2VtYmx5LiBUaGUgYXJ0aWZhY3RzCi0gICAgICAgIGF2YWlsYWJsZSB0byBiZSBpbmNsdWRlZCBpbiBhIHJlcG9zaXRvcnkgYXJlIHlvdXIgcHJvamVjdCdzIGRlcGVuZGVuY3kKLSAgICAgICAgYXJ0aWZhY3RzLiBUaGUgcmVwb3NpdG9yeSBjcmVhdGVkIGNvbnRhaW5zIHRoZSBuZWVkZWQgbWV0YWRhdGEgZW50cmllcwotICAgICAgICBhbmQgYWxzbyBjb250YWlucyBib3RoIHNoYTEgYW5kIG1kNSBjaGVja3N1bXMuIFRoaXMgaXMgdXNlZnVsIGZvciBjcmVhdGluZwotICAgICAgICBhcmNoaXZlcyB3aGljaCB3aWxsIGJlIGRlcGxveWVkIHRvIGludGVybmFsIHJlcG9zaXRvcmllcy4KLQotICAgICAgICA8YnIvPjxiPk5PVEU6PC9iPiBDdXJyZW50bHksIG9ubHkgYXJ0aWZhY3RzIGZyb20gdGhlIGNlbnRyYWwgcmVwb3NpdG9yeQotICAgICAgICBhcmUgYWxsb3dlZC4KLSAgICAgICAgXV0+Ci0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPm91dHB1dERpcmVjdG9yeTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHJvb3QKLSAgICAgICAgICAgIG9mIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgYXNzZW1ibHkuIEZvciBleGFtcGxlLAotICAgICAgICAgICAgImxvZyIgd2lsbCBwdXQgdGhlIHNwZWNpZmllZCBmaWxlcyBpbiB0aGUgbG9nIGRpcmVjdG9yeSwKLSAgICAgICAgICAgIGRpcmVjdGx5IGJlbmVhdGggdGhlIHJvb3Qgb2YgdGhlIGFyY2hpdmUuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmluY2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7aW5jbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBhcnRpZmFjdCBjb29yZGluYXRlcyB0byBpbmNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtpbmNsdWRlcyZndDsgcmVwcmVzZW50cyBhbGwgdmFsaWQgdmFsdWVzLgotCi0gICAgICAgICAgICBBcnRpZmFjdCBjb29yZGluYXRlcyBtYXkgYmUgZ2l2ZW4gaW4gc2ltcGxlIGdyb3VwSWQ6YXJ0aWZhY3RJZCBmb3JtLAotICAgICAgICAgICAgb3IgdGhleSBtYXkgYmUgZnVsbHkgcXVhbGlmaWVkIGluIHRoZSBmb3JtIGdyb3VwSWQ6YXJ0aWZhY3RJZDp0eXBlWzpjbGFzc2lmaWVyXTp2ZXJzaW9uLgotICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQsIGFzIGluICo6bWF2ZW4tKgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7ZXhjbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBkZXBlbmRlbmN5IGFydGlmYWN0IGNvb3JkaW5hdGVzIHRvIGV4Y2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2V4Y2x1ZGVzJmd0OyByZXByZXNlbnRzIG5vIGV4Y2x1c2lvbnMuCi0KLSAgICAgICAgICAgIEFydGlmYWN0IGNvb3JkaW5hdGVzIG1heSBiZSBnaXZlbiBpbiBzaW1wbGUgZ3JvdXBJZDphcnRpZmFjdElkIGZvcm0sCi0gICAgICAgICAgICBvciB0aGV5IG1heSBiZSBmdWxseSBxdWFsaWZpZWQgaW4gdGhlIGZvcm0gZ3JvdXBJZDphcnRpZmFjdElkOnR5cGVbOmNsYXNzaWZpZXJdOnZlcnNpb24uCi0gICAgICAgICAgICBBZGRpdGlvbmFsbHksIHdpbGRjYXJkcyBjYW4gYmUgdXNlZCwgYXMgaW4gKjptYXZlbi0qCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZmlsZU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDY0NDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZmlsZSBtb2RlIG9mIHRoZSBmaWxlcyBpbmNsdWRlZC4KLSAgICAgICAgICAgIFRISVMgSVMgQU4gT0NUQUwgVkFMVUUuCi0gICAgICAgICAgICBGb3JtYXQ6IChVc2VyKShHcm91cCkoT3RoZXIpIHdoZXJlIGVhY2ggY29tcG9uZW50IGlzIGEgc3VtIG9mIFJlYWQgPSA0LAotICAgICAgICAgICAgV3JpdGUgPSAyLCBhbmQgRXhlY3V0ZSA9IDEuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIDA2NDQKLSAgICAgICAgICAgIHRyYW5zbGF0ZXMgdG8gVXNlciByZWFkLXdyaXRlLCBHcm91cCBhbmQgT3RoZXIgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwNjQ0LgotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmxhbXAuY29tL3B1Yi9hL2JzZC8yMDAwLzA5LzA2L0ZyZWVCU0RfQmFzaWNzLmh0bWwiPihtb3JlIG9uIHVuaXgtc3R5bGUgcGVybWlzc2lvbnMpPC9hPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmRpcmVjdG9yeU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDc1NTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZGlyZWN0b3J5IG1vZGUgb2YgdGhlIGRpcmVjdG9yaWVzCi0gICAgICAgICAgICBpbmNsdWRlZC4gCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZgotICAgICAgICAgICAgUmVhZCA9IDQsIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZQotICAgICAgICAgICAgMDc1NSB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDc1NS4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25sYW1wLmNvbS9wdWIvYS9ic2QvMjAwMC8wOS8wNi9GcmVlQlNEX0Jhc2ljcy5odG1sIj4obW9yZSBvbiB1bml4LXN0eWxlIHBlcm1pc3Npb25zKTwvYT4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlTWV0YWRhdGE8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5mYWxzZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIElmIHNldCB0byB0cnVlLCB0aGlzIHByb3BlcnR5IHdpbGwgdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgcmVwb3NpdG9yeQotICAgICAgICAgICAgbWV0YWRhdGEgd2hpY2ggd2lsbCBhbGxvdyB0aGUgcmVwb3NpdG9yeSB0byBiZSB1c2VkIGFzIGEgZnVuY3Rpb25hbCByZW1vdGUKLSAgICAgICAgICAgIHJlcG9zaXRvcnkuIERlZmF1bHQgdmFsdWUgaXMgZmFsc2UuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmdyb3VwVmVyc2lvbkFsaWdubWVudHM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgeW91IHdhbnQgdG8gYWxpZ24gYSBncm91cCBvZiBhcnRpZmFjdHMgdG8gYSBzcGVjaWZpZWQKLSAgICAgICAgICAgIHZlcnNpb24uIEEgZ3JvdXBWZXJzaW9uQWxpZ25tZW50IGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yCi0gICAgICAgICAgICBtb3JlIG9mICZsdDtncm91cFZlcnNpb25BbGlnbm1lbnQmZ3Q7IHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5Hcm91cFZlcnNpb25BbGlnbm1lbnQ8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPiAgICAgICAgICAgICAgCi0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+cnVudGltZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHNjb3BlIGZvciBhcnRpZmFjdHMgaW5jbHVkZWQgaW4gdGhpcyByZXBvc2l0b3J5LgotICAgICAgICAgICAgRGVmYXVsdCBzY29wZSB2YWx1ZSBpcyAicnVudGltZSIuIChTaW5jZSAyLjIpCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgIDwvZmllbGRzPgotICAgIDwvY2xhc3M+Ci0gICAgPGNsYXNzPgotICAgICAgPG5hbWU+R3JvdXBWZXJzaW9uQWxpZ25tZW50PC9uYW1lPgotICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBbGxvd3MgYSBncm91cCBvZiBhcnRpZmFjdHMgdG8gYmUgYWxpZ25lZCB0byBhIHNwZWNpZmllZCB2ZXJzaW9uLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pZDwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSBncm91cElkIG9mIHRoZSBhcnRpZmFjdHMgZm9yIHdoaWNoIHlvdSB3YW50IHRvIGFsaWduIHRoZQotICAgICAgICAgICAgdmVyc2lvbnMuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnZlcnNpb248L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBUaGUgdmVyc2lvbiB5b3Ugd2FudCB0byBhbGlnbiB0aGlzIGdyb3VwIHRvLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5leGNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBXaGVuICZsdDtleGNsdWRlJmd0OyBzdWJlbGVtZW50cyBhcmUgcHJlc2VudCwgdGhleSBkZWZpbmUgdGhlCi0gICAgICAgICAgICBhcnRpZmFjdElkcyBvZiB0aGUgYXJ0aWZhY3RzIHRvIGV4Y2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2V4Y2x1ZGVzJmd0OyByZXByZXNlbnRzIG5vIGV4Y2x1c2lvbnMuIEFuIGV4Y2x1ZGUgaXMgc3BlY2lmaWVkCi0gICAgICAgICAgICBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YgJmx0O2V4Y2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLSAgICA8Y2xhc3M+Ci0gICAgICA8bmFtZT5VbnBhY2tPcHRpb25zPC9uYW1lPgotICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgU3BlY2lmaWVzIG9wdGlvbnMgZm9yIGluY2x1ZGluZy9leGNsdWRpbmcvZmlsdGVyaW5nIGl0ZW1zIGV4dHJhY3RlZCBmcm9tIGFuIGFyY2hpdmUuIChTaW5jZSAyLjIpCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmluY2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNldCBvZiBmaWxlIGFuZC9vciBkaXJlY3RvcnkgcGF0dGVybnMgZm9yIG1hdGNoaW5nIGl0ZW1zIHRvIGJlIGluY2x1ZGVkIGZyb20gYW4gYXJjaGl2ZSBhcyBpdCBpcyB1bnBhY2tlZC4gCi0gICAgICAgICAgICBFYWNoIGl0ZW0gaXMgc3BlY2lmaWVkIGFzICZsdDtpbmNsdWRlJmd0O3NvbWUvcGF0aCZsdDsvaW5jbHVkZSZndDsgKFNpbmNlIDIuMikKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNldCBvZiBmaWxlIGFuZC9vciBkaXJlY3RvcnkgcGF0dGVybnMgZm9yIG1hdGNoaW5nIGl0ZW1zIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYW4gYXJjaGl2ZSBhcyBpdCBpcyB1bnBhY2tlZC4KLSAgICAgICAgICAgIEVhY2ggaXRlbSBpcyBzcGVjaWZpZWQgYXMgJmx0O2V4Y2x1ZGUmZ3Q7c29tZS9wYXRoJmx0Oy9leGNsdWRlJmd0OyAoU2luY2UgMi4yKQotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZmlsdGVyZWQ8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICBXaGV0aGVyIHRvIGZpbHRlciBzeW1ib2xzIGluIHRoZSBmaWxlcyBhcyB0aGV5IGFyZSB1bnBhY2tlZCBmcm9tIHRoZSBhcmNoaXZlLCB1c2luZwotICAgICAgICAgIHByb3BlcnRpZXMgZnJvbSB0aGUgYnVpbGQgY29uZmlndXJhdGlvbi4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+ZmFsc2U8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+bGluZUVuZGluZzwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2V0cyB0aGUgbGluZS1lbmRpbmdzIG9mIHRoZSBmaWxlcy4gKFNpbmNlIDIuMikKLSAgICAgICAgICAgIFZhbGlkIHZhbHVlczoKLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxiPiJrZWVwIjwvYj4gLSBQcmVzZXJ2ZSBhbGwgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJ1bml4IjwvYj4gLSBVc2UgVW5peC1zdHlsZSBsaW5lIGVuZGluZ3M8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+ImxmIjwvYj4gLSBVc2UgYSBzaW5nbGUgbGluZS1mZWVkIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4iZG9zIjwvYj4gLSBVc2UgRE9TLXN0eWxlIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4iY3JsZiI8L2I+IC0gVXNlIENhcnJhaWdlLXJldHVybiwgbGluZS1mZWVkIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICA8L3VsPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnVzZURlZmF1bHRFeGNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnRydWU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBXaGV0aGVyIHN0YW5kYXJkIGV4Y2x1c2lvbiBwYXR0ZXJucywgc3VjaCBhcyB0aG9zZSBtYXRjaGluZyBDVlMgYW5kIFN1YnZlcnNpb24KLSAgICAgICAgICAgIG1ldGFkYXRhIGZpbGVzLCBzaG91bGQgYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBmaWxlcyBhZmZlY3RlZCBieSB0aGlzIHNldC4KLSAgICAgICAgICAgIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLiAoU2luY2UgMi4yKQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICA8L2ZpZWxkPgotICAgICAgICAgPGZpZWxkPgotICAgICAgICAgICAgPG5hbWU+ZW5jb2Rpbmc8L25hbWU+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMys8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgICBBbGxvd3MgdG8gc3BlY2lmeSB0aGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gdW5wYWNraW5nIGFyY2hpdmVzLCBmb3IgdW5hcmNoaXZlcnMKLSAgICAgICAgICAgICAgdGhhdCBzdXBwb3J0IHNwZWNpZnlpbmcgZW5jb2RpbmcuIElmIHVuc3BlY2lmaWVkLCBhcmNoaXZlciBkZWZhdWx0IHdpbGwgYmUgdXNlZC4KLSAgICAgICAgICAgICAgQXJjaGl2ZXIgZGVmYXVsdHMgZ2VuZXJhbGx5IHJlcHJlc2VudCBzYW5lIChtb2Rlcm4pIHZhbHVlcy4KLSAgICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgPC9maWVsZD4KLSAgICAgIDwvZmllbGRzPgotICAgIDwvY2xhc3M+Ci0gICAgPGNsYXNzPgotICAgICAgPG5hbWU+Q29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJDb25maWc8L25hbWU+Ci0gICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIENvbmZpZ3VyZXMgYSBmaWx0ZXIgZm9yIGZpbGVzIGhlYWRlZCBpbnRvIHRoZSBhc3NlbWJseSBhcmNoaXZlLCB0byBlbmFibGUKLSAgICAgICAgYWdncmVnYXRpb24gb2YgdmFyaW91cyB0eXBlcyBvZiBkZXNjcmlwdG9yIGZyYWdtZW50cywgc3VjaCBhcyBjb21wb25lbnRzLnhtbCwKLSAgICAgICAgd2ViLnhtbCwgZXRjLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5oYW5kbGVyTmFtZTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIGhhbmRsZXIncyBwbGV4dXMgcm9sZS1oaW50LCBmb3IgbG9va3VwIGZyb20gdGhlIGNvbnRhaW5lci4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5jb25maWd1cmF0aW9uPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBoYW5kbGVyLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPHR5cGU+RE9NPC90eXBlPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLSAgPC9jbGFzc2VzPgotPC9tb2RlbD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vbWRvL2Rlc2NyaXB0b3IubWRvIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9tZG8vZGVzY3JpcHRvci5tZG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMzFmMDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9tZG8vZGVzY3JpcHRvci5tZG8KKysrIC9kZXYvbnVsbApAQCAtMSwxNDEyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAgLS0+Ci0KLTwhLS0KLSAgU2luY2UgTW9kZWxsbyBkb2VzIG5vdCBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvIHNoYXJlIGRlc2NyaXB0b3IsCi0gIGlmIHlvdSBtYWtlIGNoYW5nZXMgdG8gRmlsZVNldCwgRmlsZUl0ZW0sIERlcGVuZGVuZGVuY3lTZXQsIG9yCi0gIGFkZGluZyBuZXcgY29sbGVjdGlvbiwgbWFrZSBzdXJlIHRvIHByb3BhZ2F0ZSB5b3VyIGNoYW5nZXMKLSAgdG8gImNvbXBvbmVudC5tZG8iLgotLS0+Ci0KLTxtb2RlbCB4bWxucz0iaHR0cDovL21vZGVsbG8uY29kZWhhdXMub3JnL01PREVMTE8vMS40LjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbW9kZWxsby5jb2RlaGF1cy5vcmcvTU9ERUxMTy8xLjQuMCBodHRwOi8vbW9kZWxsby5jb2RlaGF1cy5vcmcveHNkL21vZGVsbG8tMS40LjAueHNkIgotICAgICAgIHhtbC5uYW1lc3BhY2U9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7dmVyc2lvbn0iIAotICAgICAgIHhtbC5zY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7dmVyc2lvbn0ueHNkIj4KLSAgICAgICAKLSAgPGlkPmFzc2VtYmx5PC9pZD4KLSAgPG5hbWU+QXNzZW1ibHk8L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICA8IVtDREFUQVsKLSAgICA8cD4KLSAgICBNYXZlbiBBc3NlbWJseSBQbHVnaW4gcmVsaWVzIG9uIHRoZSBwcm92aWRlZCBhc3NlbWJseSBkZXNjcmlwdG9ycyB0byBkaWN0YXRlCi0gICAgaXRzIGV4ZWN1dGlvbi4gQWx0aG91Z2ggdGhlcmUgYXJlIGFscmVhZHkgcHJlZmFicmljYXRlZCBkZXNjcmlwdG9ycyBhdmFpbGFibGUKLSAgICBmb3IgdXNlLCB0aGV5IGNhbiBvbmx5IHN1ZmZpY2Ugc29tZSBvZiB0aGUgY29tbW9uIGFzc2VtYmx5IHJlcXVpcmVtZW50cy4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgU28gaW4gb3JkZXIgZm9yIHlvdSB0byBjdXN0b21pemUgdGhlIHdheSB0aGUgQXNzZW1ibHkgUGx1Z2luIGNyZWF0ZXMgeW91cgotICAgIGFzc2VtYmxpZXMsIHlvdSBuZWVkIHRvIGtub3cgaG93IHRvIHVzZSB0aGUgQXNzZW1ibHkgRGVzY3JpcHRvci4KLSAgICA8L3A+Ci0gICAgPHA+Ci0gICAgVGhpcyBkZXNjcmlwdG9yIHNwZWNpZmllcyB0aGUgdHlwZSBvZiBhc3NlbWJseSBhcmNoaXZlIHRvIGNyZWF0ZSwgdGhlIGNvbnRlbnRzCi0gICAgb2YgdGhlIGFzc2VtYmx5LCBhbmQgdGhlIHdheXMgaW4gd2hpY2ggZGVwZW5kZW5jaWVzIG9yIGl0cyBtb2R1bGVzIGFyZSBidW5kbGVkCi0gICAgd2l0aCBhbiBhc3NlbWJseS4KLSAgICA8L3A+Ci0gICAgXV0+Ci0gIDwvZGVzY3JpcHRpb24+Ci0gIDxkZWZhdWx0cz4KLSAgICA8ZGVmYXVsdD4KLSAgICAgIDxrZXk+cGFja2FnZTwva2V5PgotICAgICAgPHZhbHVlPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsPC92YWx1ZT4KLSAgICA8L2RlZmF1bHQ+Ci0gIDwvZGVmYXVsdHM+Ci0gIDxjbGFzc2VzPgotICAgIDxjbGFzcyByb290RWxlbWVudD0idHJ1ZSIgeG1sLnRhZ05hbWU9ImFzc2VtYmx5Ij4KLSAgICAgIDxuYW1lPkFzc2VtYmx5PC9uYW1lPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgQW4gYXNzZW1ibHkgZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgZmlsZXMgdXN1YWxseSBkaXN0cmlidXRlZCBpbiBhbgotICAgICAgICBhcmNoaXZlIGZvcm1hdCBzdWNoIGFzIHppcCwgdGFyLCBvciB0YXIuZ3ogdGhhdCBpcyBnZW5lcmF0ZWQgZnJvbSBhCi0gICAgICAgIHByb2plY3QuICBGb3IgZXhhbXBsZSwgYSBwcm9qZWN0IGNvdWxkIHByb2R1Y2UgYSBaSVAgYXNzZW1ibHkgd2hpY2gKLSAgICAgICAgY29udGFpbnMgYSBwcm9qZWN0J3MgSkFSIGFydGlmYWN0IGluIHRoZSByb290IGRpcmVjdG9yeSwgdGhlCi0gICAgICAgIHJ1bnRpbWUgZGVwZW5kZW5jaWVzIGluIGEgbGliLyBkaXJlY3RvcnksIGFuZCBhIHNoZWxsIHNjcmlwdCB0byBsYXVuY2gKLSAgICAgICAgYSBzdGFuZC1hbG9uZSBhcHBsaWNhdGlvbi4KLSAgICAgICAgXV0+Ci0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmlkPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIGlkIG9mIHRoaXMgYXNzZW1ibHkuIFRoaXMgaXMgYSBzeW1ib2xpYyBuYW1lIGZvciBhCi0gICAgICAgICAgICBwYXJ0aWN1bGFyIGFzc2VtYmx5IG9mIGZpbGVzIGZyb20gdGhpcyBwcm9qZWN0LiBBbHNvLCBhc2lkZSBmcm9tCi0gICAgICAgICAgICBiZWluZyB1c2VkIHRvIGRpc3RpbmN0bHkgbmFtZSB0aGUgYXNzZW1ibGVkIHBhY2thZ2UgYnkgYXR0YWNoaW5nCi0gICAgICAgICAgICBpdHMgdmFsdWUgdG8gdGhlIGdlbmVyYXRlZCBhcmNoaXZlLCB0aGUgaWQgaXMgdXNlZCBhcyB5b3VyCi0gICAgICAgICAgICBhcnRpZmFjdCdzIGNsYXNzaWZpZXIgd2hlbiBkZXBsb3lpbmcuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZvcm1hdHM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNwZWNpZmllcyB0aGUgZm9ybWF0cyBvZiB0aGUgYXNzZW1ibHkuIAotICAgICAgICAgICAgCi0gICAgICAgICAgICBJdCBpcyBvZnRlbiBiZXR0ZXIgdG8gc3BlY2lmeSB0aGUgZm9ybWF0cyB2aWEgdGhlIGdvYWwgcGFyYW1ldGVyIHJhdGhlcgotICAgICAgICAgICAgdGhhbiBoZXJlLiBGb3IgZXhhbXBsZSwgdGhhdCBhbGxvd3MgZGlmZmVyZW50IHByb2ZpbGVzIHRvIGdlbmVyYXRlCi0gICAgICAgICAgICBkaWZmZXJlbnQgdHlwZXMgb2YgYXJjaGl2ZXMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIE11bHRpcGxlIGZvcm1hdHMgY2FuIGJlCi0gICAgICAgICAgICBzdXBwbGllZCBhbmQgdGhlIEFzc2VtYmx5IFBsdWdpbiB3aWxsIGdlbmVyYXRlIGFuIGFyY2hpdmUgZm9yIGVhY2gKLSAgICAgICAgICAgIG9mIHRoZSBkZXNpcmVkIGZvcm1hdHMuIFdoZW4gZGVwbG95aW5nIHlvdXIgcHJvamVjdCwgYWxsIGZpbGUgZm9ybWF0cwotICAgICAgICAgICAgc3BlY2lmaWVkIHdpbGwgYWxzbyBiZSBkZXBsb3llZC4gQSBmb3JtYXQgaXMgc3BlY2lmaWVkIGJ5IHN1cHBseWluZwotICAgICAgICAgICAgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzIGluIGEgJmx0O2Zvcm1hdCZndDsgc3ViZWxlbWVudDoKLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxiPiJ6aXAiPC9iPiAtIENyZWF0ZXMgYSBaSVAgZmlsZSBmb3JtYXQ8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+InRhciI8L2I+IC0gQ3JlYXRlcyBhIFRBUiBmb3JtYXQ8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+InRhci5neiI8L2I+IG9yIDxiPiJ0Z3oiPC9iPiAtIENyZWF0ZXMgYSBnemlwJ2QgVEFSIGZvcm1hdDwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4idGFyLmJ6MiI8L2I+IG9yIDxiPiJ0YnoyIjwvYj4gLSBDcmVhdGVzIGEgYnppcCdkIFRBUiBmb3JtYXQ8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+ImphciI8L2I+IC0gQ3JlYXRlcyBhIEpBUiBmb3JtYXQ8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+ImRpciI8L2I+IC0gQ3JlYXRlcyBhbiBleHBsb2RlZCBkaXJlY3RvcnkgZm9ybWF0PC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJ3YXIiPC9iPiAtIENyZWF0ZXMgYSBXQVIgZm9ybWF0PC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+aW5jbHVkZUJhc2VEaXJlY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnRydWU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBJbmNsdWRlcyBhIGJhc2UgZGlyZWN0b3J5IGluIHRoZSBmaW5hbCBhcmNoaXZlLiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICAgIGlmIHlvdSBhcmUgY3JlYXRpbmcgYW4gYXNzZW1ibHkgbmFtZWQgInlvdXItYXBwIiwgc2V0dGluZwotICAgICAgICAgICAgaW5jbHVkZUJhc2VEaXJlY3RvcnkgdG8gdHJ1ZSB3aWxsIGNyZWF0ZSBhbiBhcmNoaXZlIHRoYXQKLSAgICAgICAgICAgIGluY2x1ZGVzIHRoaXMgYmFzZSBkaXJlY3RvcnkuIElmIHRoaXMgb3B0aW9uIGlzIHNldCB0byBmYWxzZQotICAgICAgICAgICAgdGhlIGFyY2hpdmUgY3JlYXRlZCB3aWxsIHVuemlwIGl0cyBjb250ZW50IHRvIHRoZSBjdXJyZW50Ci0gICAgICAgICAgICBkaXJlY3RvcnkuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmJhc2VEaXJlY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBiYXNlIGRpcmVjdG9yeSBvZiB0aGUgcmVzdWx0aW5nIGFzc2VtYmx5IGFyY2hpdmUuIElmIHRoaXMgaXMgbm90Ci0gICAgICAgICAgICBzZXQgYW5kIGluY2x1ZGVCYXNlRGlyZWN0b3J5ID09IHRydWUsICR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IHdpbGwgYmUgdXNlZCBpbnN0ZWFkLgotICAgICAgICAgICAgKFNpbmNlIDIuMi1iZXRhLTEpCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmluY2x1ZGVTaXRlRGlyZWN0b3J5PC9uYW1lPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5mYWxzZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIEluY2x1ZGVzIGEgc2l0ZSBkaXJlY3RvcnkgaW4gdGhlIGZpbmFsIGFyY2hpdmUuIFRoZSBzaXRlIGRpcmVjdG9yeQotICAgICAgICAgICAgbG9jYXRpb24gb2YgYSBwcm9qZWN0IGlzIGRldGVybWluZWQgYnkgdGhlIHNpdGVEaXJlY3RvcnkgcGFyYW1ldGVyCi0gICAgICAgICAgICBvZiB0aGUgQXNzZW1ibHkgUGx1Z2luLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5jb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPkNvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyQ29uZmlnPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNldCBvZiBjb21wb25lbnRzIHdoaWNoIGZpbHRlciB2YXJpb3VzIGNvbnRhaW5lciBkZXNjcmlwdG9ycyBvdXQgb2YKLSAgICAgICAgICAgIHRoZSBub3JtYWwgYXJjaGl2ZSBzdHJlYW0sIHNvIHRoZXkgY2FuIGJlIGFnZ3JlZ2F0ZWQgdGhlbiBhZGRlZC4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5tb2R1bGVTZXRzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5Nb2R1bGVTZXQ8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIG1vZHVsZSBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSBhc3NlbWJseS4gQSBtb2R1bGVTZXQKLSAgICAgICAgICAgIGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YgJmx0O21vZHVsZVNldCZndDsKLSAgICAgICAgICAgIHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVTZXRzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5GaWxlU2V0PC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNwZWNpZmllcyB3aGljaCBncm91cHMgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgYXNzZW1ibHkuIEEKLSAgICAgICAgICAgIGZpbGVTZXQgaXMgc3BlY2lmaWVkIGJ5IHByb3ZpZGluZyBvbmUgb3IgbW9yZSBvZiAmbHQ7ZmlsZVNldCZndDsKLSAgICAgICAgICAgIHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5GaWxlSXRlbTwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggc2luZ2xlIGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIGFzc2VtYmx5LiBBIGZpbGUKLSAgICAgICAgICAgIGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YgJmx0O2ZpbGUmZ3Q7Ci0gICAgICAgICAgICBzdWJlbGVtZW50cy4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5kZXBlbmRlbmN5U2V0czwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+RGVwZW5kZW5jeVNldDwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggZGVwZW5kZW5jaWVzIHRvIGluY2x1ZGUgaW4gdGhlIGFzc2VtYmx5LiBBCi0gICAgICAgICAgICBkZXBlbmRlbmN5U2V0IGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YKLSAgICAgICAgICAgICZsdDtkZXBlbmRlbmN5U2V0Jmd0OyBzdWJlbGVtZW50cy4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5yZXBvc2l0b3JpZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPlJlcG9zaXRvcnk8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIHJlcG9zaXRvcnkgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgYXNzZW1ibHkuIEEKLSAgICAgICAgICAgIHJlcG9zaXRvcnkgaXMgc3BlY2lmaWVkIGJ5IHByb3ZpZGluZyBvbmUgb3IgbW9yZSBvZgotICAgICAgICAgICAgJmx0O3JlcG9zaXRvcnkmZ3Q7IHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmNvbXBvbmVudERlc2NyaXB0b3JzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHRoZSBzaGFyZWQgY29tcG9uZW50cyB4bWwgZmlsZSBsb2NhdGlvbnMgdG8gaW5jbHVkZSBpbiB0aGUKLSAgICAgICAgICAgIGFzc2VtYmx5LiBUaGUgbG9jYXRpb25zIHNwZWNpZmllZCBtdXN0IGJlIHJlbGF0aXZlIHRvIHRoZSBiYXNlIGxvY2F0aW9uCi0gICAgICAgICAgICBvZiB0aGUgZGVzY3JpcHRvci4gSWYgdGhlIGRlc2NyaXB0b3Igd2FzIGZvdW5kIHZpYSBhICZsdDtkZXNjcmlwdG9yUmVmLyZndDsgCi0gICAgICAgICAgICBlbGVtZW50IGluIHRoZQotICAgICAgICAgICAgY2xhc3NwYXRoLCBhbnkgY29tcG9uZW50cyBpdCBzcGVjaWZpZXMgd2lsbCBhbHNvIGJlIGZvdW5kIG9uIHRoZSBjbGFzc3BhdGguCi0gICAgICAgICAgICBJZiBpdCBpcyBmb3VuZCBieSBwYXRobmFtZSB2aWEgYSAmbHQ7ZGVzY3JpcHRvci8mZ3Q7IGVsZW1lbnQgCi0gICAgICAgICAgICB0aGUgdmFsdWUgaGVyZSB3aWxsIGJlIGludGVycHJldGVkCi0gICAgICAgICAgICBhcyBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHByb2plY3QgYmFzZWRpci4KLSAgICAgICAgICAgIFdoZW4gbXVsdGlwbGUgY29tcG9uZW50RGVzY3JpcHRvcnMgYXJlIGZvdW5kLCB0aGVpcgotICAgICAgICAgICAgY29udGVudHMgYXJlIG1lcmdlZC4gQ2hlY2sgb3V0IHRoZSA8YSBocmVmPSJjb21wb25lbnQuaHRtbCI+Ci0gICAgICAgICAgICBkZXNjcmlwdG9yIGNvbXBvbmVudHM8L2E+IGZvciBtb3JlIGluZm9ybWF0aW9uLiBBCi0gICAgICAgICAgICBjb21wb25lbnREZXNjcmlwdG9yIGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YKLSAgICAgICAgICAgICZsdDtjb21wb25lbnREZXNjcmlwdG9yJmd0OyBzdWJlbGVtZW50cy4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICA8L2ZpZWxkcz4KLSAgICA8L2NsYXNzPgotCi0gICAgPCEtLSBTaGFyZWQgd2l0aCBjb21wb25lbnQgZGVzY3JpcHRvciBmcm9tIGhlcmUgb24uIC0tPgotICAgIDxjbGFzcz4KLSAgICAgIDxuYW1lPkZpbGVTZXQ8L25hbWU+Ci0gICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgZmlsZVNldCBhbGxvd3MgdGhlIGluY2x1c2lvbiBvZiBncm91cHMgb2YgZmlsZXMgaW50byB0aGUgYXNzZW1ibHkuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnVzZURlZmF1bHRFeGNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnRydWU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBXaGV0aGVyIHN0YW5kYXJkIGV4Y2x1c2lvbiBwYXR0ZXJucywgc3VjaCBhcyB0aG9zZSBtYXRjaGluZyBDVlMgYW5kIFN1YnZlcnNpb24KLSAgICAgICAgICAgIG1ldGFkYXRhIGZpbGVzLCBzaG91bGQgYmUgdXNlZCB3aGVuIGNhbGN1bGF0aW5nIHRoZSBmaWxlcyBhZmZlY3RlZCBieSB0aGlzIHNldC4KLSAgICAgICAgICAgIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+b3V0cHV0RGlyZWN0b3J5PC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgcm9vdAotICAgICAgICAgICAgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhc3NlbWJseS4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAgICAibG9nIiB3aWxsIHB1dCB0aGUgc3BlY2lmaWVkIGZpbGVzIGluIHRoZSBsb2cgZGlyZWN0b3J5LgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2luY2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgZmlsZXMgYW5kIGRpcmVjdG9yeSB0byBpbmNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtpbmNsdWRlcyZndDsgcmVwcmVzZW50cyBhbGwgdmFsaWQgdmFsdWVzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7ZXhjbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBmaWxlcyBhbmQgZGlyZWN0b3J5IHRvIGV4Y2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2V4Y2x1ZGVzJmd0OyByZXByZXNlbnRzIG5vIGV4Y2x1c2lvbnMuCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZmlsZU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDY0NDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZmlsZSBtb2RlIG9mIHRoZSBmaWxlcyBpbmNsdWRlZC4KLSAgICAgICAgICAgIFRISVMgSVMgQU4gT0NUQUwgVkFMVUUuCi0gICAgICAgICAgICBGb3JtYXQ6IChVc2VyKShHcm91cCkoT3RoZXIpIHdoZXJlIGVhY2ggY29tcG9uZW50IGlzIGEgc3VtIG9mIFJlYWQgPSA0LAotICAgICAgICAgICAgV3JpdGUgPSAyLCBhbmQgRXhlY3V0ZSA9IDEuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIDA2NDQKLSAgICAgICAgICAgIHRyYW5zbGF0ZXMgdG8gVXNlciByZWFkLXdyaXRlLCBHcm91cCBhbmQgT3RoZXIgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwNjQ0LgotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmxhbXAuY29tL3B1Yi9hL2JzZC8yMDAwLzA5LzA2L0ZyZWVCU0RfQmFzaWNzLmh0bWwiPihtb3JlIG9uIHVuaXgtc3R5bGUgcGVybWlzc2lvbnMpPC9hPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmRpcmVjdG9yeU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDc1NTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZGlyZWN0b3J5IG1vZGUgb2YgdGhlIGRpcmVjdG9yaWVzCi0gICAgICAgICAgICBpbmNsdWRlZC4gCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZgotICAgICAgICAgICAgUmVhZCA9IDQsIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZQotICAgICAgICAgICAgMDc1NSB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDA3NTUuCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9ubGFtcC5jb20vcHViL2EvYnNkLzIwMDAvMDkvMDYvRnJlZUJTRF9CYXNpY3MuaHRtbCI+KG1vcmUgb24gdW5peC1zdHlsZSBwZXJtaXNzaW9ucyk8L2E+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZGlyZWN0b3J5PC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgbG9jYXRpb24gZnJvbSB0aGUgbW9kdWxlJ3MKLSAgICAgICAgICAgIGRpcmVjdG9yeS4gRm9yIGV4YW1wbGUsICJzcmMvbWFpbi9iaW4iIHdvdWxkIHNlbGVjdCB0aGlzCi0gICAgICAgICAgICBzdWJkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QgaW4gd2hpY2ggdGhpcyBkZXBlbmRlbmN5IGlzIGRlZmluZWQuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5saW5lRW5kaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTZXRzIHRoZSBsaW5lLWVuZGluZ3Mgb2YgdGhlIGZpbGVzIGluIHRoaXMgZmlsZVNldC4KLSAgICAgICAgICAgIFZhbGlkIHZhbHVlczoKLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPjxiPiJrZWVwIjwvYj4gLSBQcmVzZXJ2ZSBhbGwgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJ1bml4IjwvYj4gLSBVc2UgVW5peC1zdHlsZSBsaW5lIGVuZGluZ3MgKGkuZS4gIlxuIik8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+ImxmIjwvYj4gLSBVc2UgYSBzaW5nbGUgbGluZS1mZWVkIGxpbmUgZW5kaW5ncyAoaS5lLiAiXG4iKTwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4iZG9zIjwvYj4gLSBVc2UgRE9TLS9XaW5kb3dzLXN0eWxlIGxpbmUgZW5kaW5ncyAoaS5lLiAiXHJcbiIpPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJ3aW5kb3dzIjwvYj4gLSBVc2UgRE9TLS9XaW5kb3dzLXN0eWxlIGxpbmUgZW5kaW5ncyAoaS5lLiAiXHJcbiIpPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJjcmxmIjwvYj4gLSBVc2UgY2FycmlhZ2UtcmV0dXJuLCBsaW5lLWZlZWQgbGluZSBlbmRpbmdzIChpLmUuICJcclxuIik8L2xpPgotICAgICAgICAgICAgPC91bD4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5maWx0ZXJlZDwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIFdoZXRoZXIgdG8gZmlsdGVyIHN5bWJvbHMgaW4gdGhlIGZpbGVzIGFzIHRoZXkgYXJlIGNvcGllZCwgdXNpbmcKLSAgICAgICAgICBwcm9wZXJ0aWVzIGZyb20gdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24uIChTaW5jZSAyLjItYmV0YS0xKQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5mYWxzZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICA8L2ZpZWxkcz4KLSAgICA8L2NsYXNzPgotICAgIDxjbGFzcz4KLSAgICAgIDxuYW1lPkZpbGVJdGVtPC9uYW1lPgotICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBBIGZpbGUgYWxsb3dzIGluZGl2aWR1YWwgZmlsZSBpbmNsdXNpb24gd2l0aCB0aGUgb3B0aW9uIHRvIGNoYW5nZQotICAgICAgICB0aGUgZGVzdGluYXRpb24gZmlsZW5hbWUgbm90IHN1cHBvcnRlZCBieSBmaWxlU2V0cy4KLSAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICA8ZmllbGRzPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+c291cmNlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPHJlcXVpcmVkPnRydWU8L3JlcXVpcmVkPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGggZnJvbSB0aGUgbW9kdWxlJ3MgZGlyZWN0b3J5Ci0gICAgICAgICAgICBvZiB0aGUgZmlsZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYXNzZW1ibHkuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPm91dHB1dERpcmVjdG9yeTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxyZXF1aXJlZD5mYWxzZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgb3V0cHV0IGRpcmVjdG9yeSByZWxhdGl2ZSB0byB0aGUgcm9vdAotICAgICAgICAgICAgb2YgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhc3NlbWJseS4gRm9yIGV4YW1wbGUsCi0gICAgICAgICAgICAibG9nIiB3aWxsIHB1dCB0aGUgc3BlY2lmaWVkIGZpbGVzIGluIHRoZSBsb2cgZGlyZWN0b3J5LgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5kZXN0TmFtZTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIGRlc3RpbmF0aW9uIGZpbGVuYW1lIGluIHRoZSBvdXRwdXREaXJlY3RvcnkuCi0gICAgICAgICAgICBEZWZhdWx0IGlzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIHNvdXJjZSdzIGZpbGUuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVNb2RlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjA2NDQ8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNpbWlsYXIgdG8gYSBVTklYIHBlcm1pc3Npb24sIHNldHMgdGhlIGZpbGUgbW9kZSBvZiB0aGUgZmlsZXMgaW5jbHVkZWQuCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZiBSZWFkID0gNCwKLSAgICAgICAgICAgIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAwNjQ0Ci0gICAgICAgICAgICB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDA2NDQKLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25sYW1wLmNvbS9wdWIvYS9ic2QvMjAwMC8wOS8wNi9GcmVlQlNEX0Jhc2ljcy5odG1sIj4obW9yZSBvbiB1bml4LXN0eWxlIHBlcm1pc3Npb25zKTwvYT4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5saW5lRW5kaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTZXRzIHRoZSBsaW5lLWVuZGluZ3Mgb2YgdGhlIGZpbGVzIGluIHRoaXMgZmlsZS4KLSAgICAgICAgICAgIFZhbGlkIHZhbHVlcyBhcmU6Ci0gICAgICAgICAgICA8dWw+Ci0gICAgICAgICAgICAgIDxsaT48Yj4ia2VlcCI8L2I+IC0gUHJlc2VydmUgYWxsIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4idW5peCI8L2I+IC0gVXNlIFVuaXgtc3R5bGUgbGluZSBlbmRpbmdzIChpLmUuICJcbiIpPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJsZiI8L2I+IC0gVXNlIGEgc2luZ2xlIGxpbmUtZmVlZCBsaW5lIGVuZGluZ3MgKGkuZS4gIlxuIik8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+ImRvcyI8L2I+IC0gVXNlIERPUy0vV2luZG93cy1zdHlsZSBsaW5lIGVuZGluZ3MgKGkuZS4gIlxyXG4iKTwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4id2luZG93cyI8L2I+IC0gVXNlIERPUy0vV2luZG93cy1zdHlsZSBsaW5lIGVuZGluZ3MgKGkuZS4gIlxyXG4iKTwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4iY3JsZiI8L2I+IC0gVXNlIGNhcnJpYWdlLXJldHVybiwgbGluZS1mZWVkIGxpbmUgZW5kaW5ncyAoaS5lLiAiXHJcbiIpPC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZmlsdGVyZWQ8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB3aGV0aGVyIHRvIGRldGVybWluZSBpZiB0aGUgZmlsZSBpcyBmaWx0ZXJlZC4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLQotICAgIDxjbGFzcz4KLSAgICAgIDxuYW1lPkRlcGVuZGVuY3lTZXQ8L25hbWU+Ci0gICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEEgZGVwZW5kZW5jeVNldCBhbGxvd3MgaW5jbHVzaW9uIGFuZCBleGNsdXNpb24gb2YgcHJvamVjdCBkZXBlbmRlbmNpZXMKLSAgICAgICAgaW4gdGhlIGFzc2VtYmx5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXREaXJlY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSByb290Ci0gICAgICAgICAgICBvZiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGFzc2VtYmx5LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICAgICJsb2ciIHdpbGwgcHV0IHRoZSBzcGVjaWZpZWQgZmlsZXMgaW4gdGhlIGxvZyBkaXJlY3RvcnksCi0gICAgICAgICAgICBkaXJlY3RseSBiZW5lYXRoIHRoZSByb290IG9mIHRoZSBhcmNoaXZlLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2luY2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgYXJ0aWZhY3QgY29vcmRpbmF0ZXMgdG8gaW5jbHVkZS4gSWYgbm9uZSBpcyBwcmVzZW50LCB0aGVuCi0gICAgICAgICAgICAmbHQ7aW5jbHVkZXMmZ3Q7IHJlcHJlc2VudHMgYWxsIHZhbGlkIHZhbHVlcy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXJ0aWZhY3QgY29vcmRpbmF0ZXMgbWF5IGJlIGdpdmVuIGluIHNpbXBsZSBncm91cElkOmFydGlmYWN0SWQgZm9ybSwKLSAgICAgICAgICAgIG9yIHRoZXkgbWF5IGJlIGZ1bGx5IHF1YWxpZmllZCBpbiB0aGUgZm9ybSBncm91cElkOmFydGlmYWN0SWQ6dHlwZVs6Y2xhc3NpZmllcl06dmVyc2lvbi4KLSAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgd2lsZGNhcmRzIGNhbiBiZSB1c2VkLCBhcyBpbiAqOm1hdmVuLSoKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5leGNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2V4Y2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgZGVwZW5kZW5jeSBhcnRpZmFjdCBjb29yZGluYXRlcyB0byBleGNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtleGNsdWRlcyZndDsgcmVwcmVzZW50cyBubyBleGNsdXNpb25zLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBBcnRpZmFjdCBjb29yZGluYXRlcyBtYXkgYmUgZ2l2ZW4gaW4gc2ltcGxlIGdyb3VwSWQ6YXJ0aWZhY3RJZCBmb3JtLAotICAgICAgICAgICAgb3IgdGhleSBtYXkgYmUgZnVsbHkgcXVhbGlmaWVkIGluIHRoZSBmb3JtIGdyb3VwSWQ6YXJ0aWZhY3RJZDp0eXBlWzpjbGFzc2lmaWVyXTp2ZXJzaW9uLgotICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQsIGFzIGluICo6bWF2ZW4tKgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVNb2RlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjA2NDQ8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNpbWlsYXIgdG8gYSBVTklYIHBlcm1pc3Npb24sIHNldHMgdGhlIGZpbGUgbW9kZSBvZiB0aGUgZmlsZXMgaW5jbHVkZWQuCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZiBSZWFkID0gNCwKLSAgICAgICAgICAgIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAwNjQ0Ci0gICAgICAgICAgICB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDA2NDQKLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25sYW1wLmNvbS9wdWIvYS9ic2QvMjAwMC8wOS8wNi9GcmVlQlNEX0Jhc2ljcy5odG1sIj4obW9yZSBvbiB1bml4LXN0eWxlIHBlcm1pc3Npb25zKTwvYT4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5kaXJlY3RvcnlNb2RlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjA3NTU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNpbWlsYXIgdG8gYSBVTklYIHBlcm1pc3Npb24sIHNldHMgdGhlIGRpcmVjdG9yeSBtb2RlIG9mIHRoZSBkaXJlY3RvcmllcwotICAgICAgICAgICAgaW5jbHVkZWQuIAotICAgICAgICAgICAgVEhJUyBJUyBBTiBPQ1RBTCBWQUxVRS4KLSAgICAgICAgICAgIEZvcm1hdDogKFVzZXIpKEdyb3VwKShPdGhlcikgd2hlcmUgZWFjaCBjb21wb25lbnQgaXMgYSBzdW0gb2YKLSAgICAgICAgICAgIFJlYWQgPSA0LCBXcml0ZSA9IDIsIGFuZCBFeGVjdXRlID0gMS4gIEZvciBleGFtcGxlLCB0aGUgdmFsdWUKLSAgICAgICAgICAgIDA3NTUgdHJhbnNsYXRlcyB0byBVc2VyIHJlYWQtd3JpdGUsIEdyb3VwIGFuZCBPdGhlciByZWFkLW9ubHkuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDA3NTUuCi0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9ubGFtcC5jb20vcHViL2EvYnNkLzIwMDAvMDkvMDYvRnJlZUJTRF9CYXNpY3MuaHRtbCI+KG1vcmUgb24gdW5peC1zdHlsZSBwZXJtaXNzaW9ucyk8L2E+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlU3RyaWN0RmlsdGVyaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+ZmFsc2U8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgV2hlbiBzcGVjaWZpZWQgYXMgdHJ1ZSwgYW55IGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJucyB3aGljaCBhcmVuJ3QgdXNlZCB0byBmaWx0ZXIgYW4gYWN0dWFsCi0gICAgICAgICAgYXJ0aWZhY3QgZHVyaW5nIGFzc2VtYmx5IGNyZWF0aW9uIHdpbGwgY2F1c2UgdGhlIGJ1aWxkIHRvIGZhaWwgd2l0aCBhbiBlcnJvci4gVGhpcyBpcyBtZWFudAotICAgICAgICAgIHRvIGhpZ2hsaWdodCBvYnNvbGV0ZSBpbmNsdXNpb25zIG9yIGV4Y2x1c2lvbnMsIG9yIGVsc2Ugc2lnbmFsIHRoYXQgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IKLSAgICAgICAgICBpcyBpbmNvcnJlY3RseSBjb25maWd1cmVkLiAoU2luY2UgMi4yKQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXRGaWxlTmFtZU1hcHBpbmc8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPiR7YXJ0aWZhY3QuYXJ0aWZhY3RJZH0tJHthcnRpZmFjdC52ZXJzaW9ufSR7ZGFzaENsYXNzaWZpZXI/fS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBtYXBwaW5nIHBhdHRlcm4gZm9yIGFsbCBkZXBlbmRlbmNpZXMgaW5jbHVkZWQgaW4gdGhpcwotICAgICAgICAgICAgYXNzZW1ibHkuIChTaW5jZSAyLjItYmV0YS0yOyAyLjItYmV0YS0xIHVzZXMgJHthcnRpZmFjdElkfS0ke3ZlcnNpb259JHtkYXNoQ2xhc3NpZmllcj99LiR7ZXh0ZW5zaW9ufQotICAgICAgICAgICAgYXMgZGVmYXVsdCB2YWx1ZSkuIAotICAgICAgICAgICAgU2VlIHRoZSBwbHVnaW4gRkFRIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgZW50cmllcyB1c2FibGUgaW4gdGhlIG91dHB1dEZpbGVOYW1lTWFwcGluZyBwYXJhbWV0ZXIuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnVucGFjazwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPmZhbHNlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgSWYgc2V0IHRvIHRydWUsIHRoaXMgcHJvcGVydHkgd2lsbCB1bnBhY2sgYWxsIGRlcGVuZGVuY2llcwotICAgICAgICAgICAgaW50byB0aGUgc3BlY2lmaWVkIG91dHB1dCBkaXJlY3RvcnkuIFdoZW4gc2V0IHRvIGZhbHNlCi0gICAgICAgICAgICBkZXBlbmRlbmNpZXMgd2lsbCBiZSBpbmNsdWRlcyBhcyBhcmNoaXZlcyAoamFycykuIENhbiBvbmx5IHVucGFjawotICAgICAgICAgICAgamFyLCB6aXAsIHRhci5neiwgYW5kIHRhci5ieiBhcmNoaXZlcy4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dW5wYWNrT3B0aW9uczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIEFsbG93cyB0aGUgc3BlY2lmaWNhdGlvbiBvZiBpbmNsdWRlcyBhbmQgZXhjbHVkZXMsIGFsb25nIHdpdGggZmlsdGVyaW5nIG9wdGlvbnMsIGZvciBpdGVtcwotICAgICAgICAgIHVucGFja2VkIGZyb20gYSBkZXBlbmRlbmN5IGFydGlmYWN0LiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPlVucGFja09wdGlvbnM8L3R5cGU+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnNjb3BlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4gICAgICAgICAgICAgIAotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnJ1bnRpbWU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgZGVwZW5kZW5jeSBzY29wZSBmb3IgdGhpcyBkZXBlbmRlbmN5U2V0LgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT51c2VQcm9qZWN0QXJ0aWZhY3Q8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT50cnVlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWwotICAgICAgICAgIERldGVybWluZXMgd2hldGhlciB0aGUgYXJ0aWZhY3QgcHJvZHVjZWQgZHVyaW5nIHRoZSBjdXJyZW50IHByb2plY3QncwotICAgICAgICAgIGJ1aWxkIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGlzIGRlcGVuZGVuY3kgc2V0LiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlUHJvamVjdEF0dGFjaG1lbnRzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+ZmFsc2U8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbCi0gICAgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhdHRhY2hlZCBhcnRpZmFjdHMgcHJvZHVjZWQgZHVyaW5nIHRoZSBjdXJyZW50IHByb2plY3QncwotICAgICAgICAgIGJ1aWxkIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGlzIGRlcGVuZGVuY3kgc2V0LiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICBdXT48L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnRydWU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgRGV0ZXJtaW5lcyB3aGV0aGVyIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHByb2Nlc3Npbmcgb2YKLSAgICAgICAgICB0aGUgY3VycmVudCBkZXBlbmRlbmN5IHNldC4gSWYgdHJ1ZSwgaW5jbHVkZXMvZXhjbHVkZXMvdXNlVHJhbnNpdGl2ZUZpbHRlcmluZwotICAgICAgICAgIHdpbGwgYXBwbHkgdG8gdHJhbnNpdGl2ZSBkZXBlbmRlbmN5IGFydGlmYWN0cyBpbiBhZGRpdGlvbiB0byB0aGUgbWFpbiBwcm9qZWN0Ci0gICAgICAgICAgZGVwZW5kZW5jeSBhcnRpZmFjdHMuIElmIGZhbHNlLCB1c2VUcmFuc2l0aXZlRmlsdGVyaW5nIGlzIG1lYW5pbmdsZXNzLCBhbmQgCi0gICAgICAgICAgaW5jbHVkZXMvZXhjbHVkZXMgb25seSBhZmZlY3QgdGhlIGltbWVkaWF0ZSBkZXBlbmRlbmNpZXMgb2YgdGhlIHByb2plY3QuCi0gICAgICAgICAgQnkgZGVmYXVsdCwgdGhpcyB2YWx1ZSBpcyB0cnVlLiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlVHJhbnNpdGl2ZUZpbHRlcmluZzwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPmZhbHNlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIERldGVybWluZXMgd2hldGhlciB0aGUgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zIGluIHRoaXMgZGVwZW5kZW5jeSBzZXQgd2lsbCBiZSBhcHBsaWVkIHRvCi0gICAgICAgICAgdGhlIHRyYW5zaXRpdmUgcGF0aCBvZiBhIGdpdmVuIGFydGlmYWN0LiBJZiB0cnVlLCBhbmQgdGhlIGN1cnJlbnQgYXJ0aWZhY3QgaXMgYSB0cmFuc2l0aXZlCi0gICAgICAgICAgZGVwZW5kZW5jeSBicm91Z2h0IGluIGJ5IGFub3RoZXIgYXJ0aWZhY3Qgd2hpY2ggbWF0Y2hlcyBhbiBpbmNsdXNpb24gb3IgZXhjbHVzaW9uIHBhdHRlcm4sIAotICAgICAgICAgIHRoZW4gdGhlIGN1cnJlbnQgYXJ0aWZhY3QgaGFzIHRoZSBzYW1lIGluY2x1c2lvbi9leGNsdXNpb24gbG9naWMgYXBwbGllZCB0byBpdCBhcyB3ZWxsLiBCeQotICAgICAgICAgIGRlZmF1bHQsIHRoaXMgdmFsdWUgaXMgZmFsc2UsIGluIG9yZGVyIHRvIHByZXNlcnZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uIDIuMS4KLSAgICAgICAgICBUaGlzIG1lYW5zIHRoYXQgaW5jbHVkZXMvZXhjbHVkZXMgb25seSBhcHBseSBkaXJlY3RseSB0byB0aGUgY3VycmVudCBhcnRpZmFjdCwgYW5kIG5vdCB0bwotICAgICAgICAgIHRoZSB0cmFuc2l0aXZlIHNldCBvZiBhcnRpZmFjdHMgd2hpY2ggYnJvdWdodCBpdCBpbi4gKFNpbmNlIDIuMi1iZXRhLTEpCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgIDwvZmllbGRzPgotICAgIDwvY2xhc3M+Ci0KLSAgICA8Y2xhc3M+Ci0gICAgICA8bmFtZT5Nb2R1bGVTZXQ8L25hbWU+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIDwhW0NEQVRBWwotICAgICAgICBBIG1vZHVsZVNldCByZXByZXNlbnQgb25lIG9yIG1vcmUgcHJvamVjdCAmbHQ7bW9kdWxlJmd0OyBwcmVzZW50IGluc2lkZQotICAgICAgICBhIHByb2plY3QncyBwb20ueG1sLiBUaGlzIGFsbG93cyB5b3UgdG8gaW5jbHVkZSBzb3VyY2VzIG9yIGJpbmFyaWVzCi0gICAgICAgIGJlbG9uZ2luZyB0byBhIHByb2plY3QncyAmbHQ7bW9kdWxlcyZndDsuCi0KLSAgICAgICAgPGJyLz48Yj5OT1RFOjwvYj4gV2hlbiB1c2luZyAmbHQ7bW9kdWxlU2V0cyZndDsgZnJvbSB0aGUgY29tbWFuZC1saW5lLCBpdAotICAgICAgICBpcyByZXF1aXJlZCB0byBwYXNzIGZpcnN0IHRoZSBwYWNrYWdlIHBoYXNlIGJ5IGRvaW5nOiAibXZuIHBhY2thZ2UKLSAgICAgICAgYXNzZW1ibHk6YXNzZW1ibHkiLiBUaGlzIGJ1Zy9pc3N1ZSBpcyBzY2hlZHVsZWQgdG8gYmUgYWRkcmVzc2VkIGJ5IE1hdmVuIDIuMS4KLSAgICAgICAgXV0+Ci0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnVzZUFsbFJlYWN0b3JQcm9qZWN0czwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMis8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPmZhbHNlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIElmIHNldCB0byB0cnVlLCB0aGUgcGx1Z2luIHdpbGwgaW5jbHVkZSBhbGwgcHJvamVjdHMgaW4gdGhlIGN1cnJlbnQgcmVhY3RvciBmb3IgcHJvY2Vzc2luZyAKLSAgICAgICAgICBpbiB0aGlzIE1vZHVsZVNldC4gVGhlc2Ugd2lsbCBiZSBzdWJqZWN0IHRvIGluY2x1ZGUvZXhjbHVkZSBydWxlcy4gKFNpbmNlIDIuMikKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+aW5jbHVkZVN1Yk1vZHVsZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT50cnVlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIElmIHNldCB0byBmYWxzZSwgdGhlIHBsdWdpbiB3aWxsIGV4Y2x1ZGUgc3ViLW1vZHVsZXMgZnJvbSBwcm9jZXNzaW5nIGluIHRoaXMgTW9kdWxlU2V0LgotICAgICAgICAgIE90aGVyd2lzZSwgaXQgd2lsbCBwcm9jZXNzIGFsbCBzdWItbW9kdWxlcywgZWFjaCBzdWJqZWN0IHRvIGluY2x1ZGUvZXhjbHVkZSBydWxlcy4gKFNpbmNlIDIuMi1iZXRhLTEpCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmluY2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7aW5jbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBwcm9qZWN0IGNvb3JkaW5hdGVzIHRvIGluY2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2luY2x1ZGVzJmd0OyByZXByZXNlbnRzIGFsbCB2YWxpZCB2YWx1ZXMuCi0gICAgICAgICAgCi0gICAgICAgICAgICBBcnRpZmFjdCBjb29yZGluYXRlcyBtYXkgYmUgZ2l2ZW4gaW4gc2ltcGxlIGdyb3VwSWQ6YXJ0aWZhY3RJZCBmb3JtLAotICAgICAgICAgICAgb3IgdGhleSBtYXkgYmUgZnVsbHkgcXVhbGlmaWVkIGluIHRoZSBmb3JtIGdyb3VwSWQ6YXJ0aWZhY3RJZDp0eXBlWzpjbGFzc2lmaWVyXTp2ZXJzaW9uLgotICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQsIGFzIGluICo6bWF2ZW4tKgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7ZXhjbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBwcm9qZWN0IGFydGlmYWN0IGNvb3JkaW5hdGVzIHRvIGV4Y2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2V4Y2x1ZGVzJmd0OyByZXByZXNlbnRzIG5vIGV4Y2x1c2lvbnMuCi0gICAgICAgICAgCi0gICAgICAgICAgICBBcnRpZmFjdCBjb29yZGluYXRlcyBtYXkgYmUgZ2l2ZW4gaW4gc2ltcGxlIGdyb3VwSWQ6YXJ0aWZhY3RJZCBmb3JtLAotICAgICAgICAgICAgb3IgdGhleSBtYXkgYmUgZnVsbHkgcXVhbGlmaWVkIGluIHRoZSBmb3JtIGdyb3VwSWQ6YXJ0aWZhY3RJZDp0eXBlWzpjbGFzc2lmaWVyXTp2ZXJzaW9uLgotICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQsIGFzIGluICo6bWF2ZW4tKgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPnNvdXJjZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFdoZW4gdGhpcyBpcyBwcmVzZW50LCB0aGUgcGx1Z2luIHdpbGwgaW5jbHVkZSB0aGUgc291cmNlIGZpbGVzIG9mCi0gICAgICAgICAgICB0aGUgaW5jbHVkZWQgbW9kdWxlcyBmcm9tIHRoaXMgc2V0IGluIHRoZSByZXN1bHRpbmcgYXNzZW1ibHkuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5Nb2R1bGVTb3VyY2VzPC90eXBlPgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5iaW5hcmllczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgV2hlbiB0aGlzIGlzIHByZXNlbnQsIHRoZSBwbHVnaW4gd2lsbCBpbmNsdWRlIHRoZSBiaW5hcmllcyBvZiB0aGUKLSAgICAgICAgICAgIGluY2x1ZGVkIG1vZHVsZXMgZnJvbSB0aGlzIHNldCBpbiB0aGUgcmVzdWx0aW5nIGFzc2VtYmx5LgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+TW9kdWxlQmluYXJpZXM8L3R5cGU+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgIDwvZmllbGRzPgotICAgIDwvY2xhc3M+Ci0gICAgCi0gICAgPGNsYXNzPgotICAgICAgPG5hbWU+TW9kdWxlU291cmNlczwvbmFtZT4KLSAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgQ29udGFpbnMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBpbmNsdWRpbmcgdGhlIHNvdXJjZSBmaWxlcyBvZiBhCi0gICAgICAgIHByb2plY3QgbW9kdWxlIGluIGFuIGFzc2VtYmx5LgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT51c2VEZWZhdWx0RXhjbHVkZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT50cnVlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgV2hldGhlciBzdGFuZGFyZCBleGNsdXNpb24gcGF0dGVybnMsIHN1Y2ggYXMgdGhvc2UgbWF0Y2hpbmcgQ1ZTIGFuZCBTdWJ2ZXJzaW9uCi0gICAgICAgICAgICBtZXRhZGF0YSBmaWxlcywgc2hvdWxkIGJlIHVzZWQgd2hlbiBjYWxjdWxhdGluZyB0aGUgZmlsZXMgYWZmZWN0ZWQgYnkgdGhpcyBzZXQuCi0gICAgICAgICAgICBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIGRlZmF1bHQgdmFsdWUgaXMgdHJ1ZS4gKFNpbmNlIDIuMi1iZXRhLTEpCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPm91dHB1dERpcmVjdG9yeTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHJvb3QKLSAgICAgICAgICAgIG9mIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgYXNzZW1ibHkuIEZvciBleGFtcGxlLAotICAgICAgICAgICAgImxvZyIgd2lsbCBwdXQgdGhlIHNwZWNpZmllZCBmaWxlcyBpbiB0aGUgbG9nIGRpcmVjdG9yeS4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+aW5jbHVkZXM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBXaGVuICZsdDtpbmNsdWRlJmd0OyBzdWJlbGVtZW50cyBhcmUgcHJlc2VudCwgdGhleSBkZWZpbmUgYSBzZXQgb2YKLSAgICAgICAgICAgIGZpbGVzIGFuZCBkaXJlY3RvcnkgdG8gaW5jbHVkZS4gSWYgbm9uZSBpcyBwcmVzZW50LCB0aGVuCi0gICAgICAgICAgICAmbHQ7aW5jbHVkZXMmZ3Q7IHJlcHJlc2VudHMgYWxsIHZhbGlkIHZhbHVlcy4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5leGNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2V4Y2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgZmlsZXMgYW5kIGRpcmVjdG9yeSB0byBleGNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtleGNsdWRlcyZndDsgcmVwcmVzZW50cyBubyBleGNsdXNpb25zLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVNb2RlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjA2NDQ8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNpbWlsYXIgdG8gYSBVTklYIHBlcm1pc3Npb24sIHNldHMgdGhlIGZpbGUgbW9kZSBvZiB0aGUgZmlsZXMgaW5jbHVkZWQuCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZiBSZWFkID0gNCwKLSAgICAgICAgICAgIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAwNjQ0Ci0gICAgICAgICAgICB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDY0NAotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmxhbXAuY29tL3B1Yi9hL2JzZC8yMDAwLzA5LzA2L0ZyZWVCU0RfQmFzaWNzLmh0bWwiPihtb3JlIG9uIHVuaXgtc3R5bGUgcGVybWlzc2lvbnMpPC9hPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmRpcmVjdG9yeU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDc1NTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZGlyZWN0b3J5IG1vZGUgb2YgdGhlIGRpcmVjdG9yaWVzCi0gICAgICAgICAgICBpbmNsdWRlZC4gCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZgotICAgICAgICAgICAgUmVhZCA9IDQsIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZQotICAgICAgICAgICAgMDc1NSB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDc1NS4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25sYW1wLmNvbS9wdWIvYS9ic2QvMjAwMC8wOS8wNi9GcmVlQlNEX0Jhc2ljcy5odG1sIj4obW9yZSBvbiB1bml4LXN0eWxlIHBlcm1pc3Npb25zKTwvYT4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5maWxlU2V0czwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+RmlsZVNldDwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hpY2ggZ3JvdXBzIG9mIGZpbGVzIGZyb20gZWFjaCBpbmNsdWRlZCBtb2R1bGUgdG8gaW5jbHVkZSBpbiB0aGUgYXNzZW1ibHkuIEEKLSAgICAgICAgICAgIGZpbGVTZXQgaXMgc3BlY2lmaWVkIGJ5IHByb3ZpZGluZyBvbmUgb3IgbW9yZSBvZiAmbHQ7ZmlsZVNldCZndDsgc3ViZWxlbWVudHMuIChTaW5jZSAyLjItYmV0YS0xKQotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmluY2x1ZGVNb2R1bGVEaXJlY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT50cnVlPC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTcGVjaWZpZXMgd2hldGhlciB0aGUgbW9kdWxlJ3MgZmluYWxOYW1lIHNob3VsZCBiZSBwcmVwZW5kZWQgdG8gdGhlIG91dHB1dERpcmVjdG9yeSAKLSAgICAgICAgICAgIHZhbHVlcyBvZiBhbnkgZmlsZVNldHMgYXBwbGllZCB0byBpdC4gKFNpbmNlIDIuMi1iZXRhLTEpCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZXhjbHVkZVN1Yk1vZHVsZURpcmVjdG9yaWVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+dHJ1ZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHdoZXRoZXIgc3ViLW1vZHVsZSBkaXJlY3RvcmllcyBiZWxvdyB0aGUgY3VycmVudCBtb2R1bGUgc2hvdWxkIGJlIGV4Y2x1ZGVkCi0gICAgICAgICAgICBmcm9tIGZpbGVTZXRzIGFwcGxpZWQgdG8gdGhhdCBtb2R1bGUuIFRoaXMgbWlnaHQgYmUgdXNlZnVsIGlmIHlvdSBvbmx5IG1lYW4gdG8gY29weQotICAgICAgICAgICAgdGhlIHNvdXJjZXMgZm9yIHRoZSBleGFjdCBtb2R1bGUgbGlzdCBtYXRjaGVkIGJ5IHRoaXMgTW9kdWxlU2V0LCBpZ25vcmluZyAob3IgcHJvY2Vzc2luZwotICAgICAgICAgICAgc2VwYXJhdGVseSkgdGhlIG1vZHVsZXMgd2hpY2ggZXhpc3QgaW4gZGlyZWN0b3JpZXMgYmVsb3cgdGhlIGN1cnJlbnQgb25lLiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXREaXJlY3RvcnlNYXBwaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4ke21vZHVsZS5hcnRpZmFjdElkfTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIG1hcHBpbmcgcGF0dGVybiBmb3IgYWxsIG1vZHVsZSBiYXNlLWRpcmVjdG9yaWVzIGluY2x1ZGVkIGluIHRoaXMgYXNzZW1ibHkuCi0gICAgICAgICAgICBOT1RFOiBUaGlzIGZpZWxkIGlzIG9ubHkgdXNlZCBpZiBpbmNsdWRlTW9kdWxlRGlyZWN0b3J5ID09IHRydWUuCi0gICAgICAgICAgICBEZWZhdWx0IGlzIHRoZSBtb2R1bGUncyAke2FydGlmYWN0SWR9IGluIDIuMi1iZXRhLTEsIGFuZCAke21vZHVsZS5hcnRpZmFjdElkfSBpbiBzdWJzZXF1ZW50IHZlcnNpb25zLiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLQotICAgIDxjbGFzcz4KLSAgICAgIDxuYW1lPk1vZHVsZUJpbmFyaWVzPC9uYW1lPgotICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICBDb250YWlucyBjb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIGluY2x1ZGluZyB0aGUgYmluYXJ5IGZpbGVzIG9mIGEKLSAgICAgICAgcHJvamVjdCBtb2R1bGUgaW4gYW4gYXNzZW1ibHkuCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPm91dHB1dERpcmVjdG9yeTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgcmVsYXRpdmUgdG8gdGhlIHJvb3QKLSAgICAgICAgICAgIG9mIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGUgYXNzZW1ibHkuIEZvciBleGFtcGxlLAotICAgICAgICAgICAgImxvZyIgd2lsbCBwdXQgdGhlIHNwZWNpZmllZCBmaWxlcyBpbiB0aGUgbG9nIGRpcmVjdG9yeSwKLSAgICAgICAgICAgIGRpcmVjdGx5IGJlbmVhdGggdGhlIHJvb3Qgb2YgdGhlIGFyY2hpdmUuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmluY2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7aW5jbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBhcnRpZmFjdCBjb29yZGluYXRlcyB0byBpbmNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtpbmNsdWRlcyZndDsgcmVwcmVzZW50cyBhbGwgdmFsaWQgdmFsdWVzLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBBcnRpZmFjdCBjb29yZGluYXRlcyBtYXkgYmUgZ2l2ZW4gaW4gc2ltcGxlIGdyb3VwSWQ6YXJ0aWZhY3RJZCBmb3JtLAotICAgICAgICAgICAgb3IgdGhleSBtYXkgYmUgZnVsbHkgcXVhbGlmaWVkIGluIHRoZSBmb3JtIGdyb3VwSWQ6YXJ0aWZhY3RJZDp0eXBlWzpjbGFzc2lmaWVyXTp2ZXJzaW9uLgotICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQsIGFzIGluICo6bWF2ZW4tKgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgV2hlbiAmbHQ7ZXhjbHVkZSZndDsgc3ViZWxlbWVudHMgYXJlIHByZXNlbnQsIHRoZXkgZGVmaW5lIGEgc2V0IG9mCi0gICAgICAgICAgICBkZXBlbmRlbmN5IGFydGlmYWN0IGNvb3JkaW5hdGVzIHRvIGV4Y2x1ZGUuIElmIG5vbmUgaXMgcHJlc2VudCwgdGhlbgotICAgICAgICAgICAgJmx0O2V4Y2x1ZGVzJmd0OyByZXByZXNlbnRzIG5vIGV4Y2x1c2lvbnMuCi0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFydGlmYWN0IGNvb3JkaW5hdGVzIG1heSBiZSBnaXZlbiBpbiBzaW1wbGUgZ3JvdXBJZDphcnRpZmFjdElkIGZvcm0sCi0gICAgICAgICAgICBvciB0aGV5IG1heSBiZSBmdWxseSBxdWFsaWZpZWQgaW4gdGhlIGZvcm0gZ3JvdXBJZDphcnRpZmFjdElkOnR5cGVbOmNsYXNzaWZpZXJdOnZlcnNpb24uCi0gICAgICAgICAgICBBZGRpdGlvbmFsbHksIHdpbGRjYXJkcyBjYW4gYmUgdXNlZCwgYXMgaW4gKjptYXZlbi0qCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZmlsZU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDY0NDwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZmlsZSBtb2RlIG9mIHRoZSBmaWxlcyBpbmNsdWRlZC4KLSAgICAgICAgICAgIFRISVMgSVMgQU4gT0NUQUwgVkFMVUUuCi0gICAgICAgICAgICBGb3JtYXQ6IChVc2VyKShHcm91cCkoT3RoZXIpIHdoZXJlIGVhY2ggY29tcG9uZW50IGlzIGEgc3VtIG9mIFJlYWQgPSA0LAotICAgICAgICAgICAgV3JpdGUgPSAyLCBhbmQgRXhlY3V0ZSA9IDEuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlIDA2NDQKLSAgICAgICAgICAgIHRyYW5zbGF0ZXMgdG8gVXNlciByZWFkLXdyaXRlLCBHcm91cCBhbmQgT3RoZXIgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwNjQ0Ci0gICAgICAgICAgICA8YSBocmVmPSJodHRwOi8vd3d3Lm9ubGFtcC5jb20vcHViL2EvYnNkLzIwMDAvMDkvMDYvRnJlZUJTRF9CYXNpY3MuaHRtbCI+KG1vcmUgb24gdW5peC1zdHlsZSBwZXJtaXNzaW9ucyk8L2E+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZGlyZWN0b3J5TW9kZTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDwhLS0gCi0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4wNzU1PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgLS0+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTaW1pbGFyIHRvIGEgVU5JWCBwZXJtaXNzaW9uLCBzZXRzIHRoZSBkaXJlY3RvcnkgbW9kZSBvZiB0aGUgZGlyZWN0b3JpZXMKLSAgICAgICAgICAgIGluY2x1ZGVkLiAKLSAgICAgICAgICAgIFRISVMgSVMgQU4gT0NUQUwgVkFMVUUuCi0gICAgICAgICAgICBGb3JtYXQ6IChVc2VyKShHcm91cCkoT3RoZXIpIHdoZXJlIGVhY2ggY29tcG9uZW50IGlzIGEgc3VtIG9mCi0gICAgICAgICAgICBSZWFkID0gNCwgV3JpdGUgPSAyLCBhbmQgRXhlY3V0ZSA9IDEuICBGb3IgZXhhbXBsZSwgdGhlIHZhbHVlCi0gICAgICAgICAgICAwNzU1IHRyYW5zbGF0ZXMgdG8gVXNlciByZWFkLXdyaXRlLCBHcm91cCBhbmQgT3RoZXIgcmVhZC1vbmx5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyAwNzU1LgotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmxhbXAuY29tL3B1Yi9hL2JzZC8yMDAwLzA5LzA2L0ZyZWVCU0RfQmFzaWNzLmh0bWwiPihtb3JlIG9uIHVuaXgtc3R5bGUgcGVybWlzc2lvbnMpPC9hPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmF0dGFjaG1lbnRDbGFzc2lmaWVyPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgIFdoZW4gc3BlY2lmaWVkLCB0aGUgYXR0YWNobWVudENsYXNzaWZpZXIgd2lsbCBjYXVzZSB0aGUgYXNzZW1ibGVyIHRvIGxvb2sgYXQgYXJ0aWZhY3RzCi0gICAgICAgICAgYXR0YWNoZWQgdG8gdGhlIG1vZHVsZSBpbnN0ZWFkIG9mIHRoZSBtYWluIHByb2plY3QgYXJ0aWZhY3QuIElmIGl0IGNhbiBmaW5kIGFuIGF0dGFjaGVkCi0gICAgICAgICAgYXJ0aWZhY3QgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBjbGFzc2lmaWVyLCBpdCB3aWxsIHVzZSBpdDsgb3RoZXJ3aXNlLCBpdCB3aWxsIHRocm93IGFuCi0gICAgICAgICAgZXhjZXB0aW9uLiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+aW5jbHVkZURlcGVuZGVuY2llczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+Ym9vbGVhbjwvdHlwZT4KLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPnRydWU8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgSWYgc2V0IHRvIHRydWUsIHRoZSBwbHVnaW4gd2lsbCBpbmNsdWRlIHRoZSBkaXJlY3QgYW5kIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIG9mCi0gICAgICAgICAgb2YgdGhlIHByb2plY3QgbW9kdWxlcyBpbmNsdWRlZCBoZXJlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIG9ubHkgaW5jbHVkZSB0aGUgbW9kdWxlCi0gICAgICAgICAgcGFja2FnZXMgb25seS4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+ZGVwZW5kZW5jeVNldHM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPkRlcGVuZGVuY3lTZXQ8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHdoaWNoIGRlcGVuZGVuY2llcyBvZiB0aGUgbW9kdWxlIHRvIGluY2x1ZGUgaW4gdGhlIGFzc2VtYmx5LiBBCi0gICAgICAgICAgICBkZXBlbmRlbmN5U2V0IGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yIG1vcmUgb2YKLSAgICAgICAgICAgICZsdDtkZXBlbmRlbmN5U2V0Jmd0OyBzdWJlbGVtZW50cy4gKFNpbmNlIDIuMi1iZXRhLTEpCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dW5wYWNrPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+dHJ1ZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIElmIHNldCB0byB0cnVlLCB0aGlzIHByb3BlcnR5IHdpbGwgdW5wYWNrIGFsbCBtb2R1bGUgcGFja2FnZXMKLSAgICAgICAgICAgIGludG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgZGlyZWN0b3J5LiBXaGVuIHNldCB0byBmYWxzZQotICAgICAgICAgICAgbW9kdWxlIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQgYXMgYXJjaGl2ZXMgKGphcnMpLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT51bnBhY2tPcHRpb25zPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgQWxsb3dzIHRoZSBzcGVjaWZpY2F0aW9uIG9mIGluY2x1ZGVzIGFuZCBleGNsdWRlcywgYWxvbmcgd2l0aCBmaWx0ZXJpbmcgb3B0aW9ucywgZm9yIGl0ZW1zCi0gICAgICAgICAgdW5wYWNrZWQgZnJvbSBhIG1vZHVsZSBhcnRpZmFjdC4gKFNpbmNlIDIuMi1iZXRhLTEpCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4gCi0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+VW5wYWNrT3B0aW9uczwvdHlwZT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+b3V0cHV0RmlsZU5hbWVNYXBwaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT4ke21vZHVsZS5hcnRpZmFjdElkfS0ke21vZHVsZS52ZXJzaW9ufSR7ZGFzaENsYXNzaWZpZXI/fS4ke21vZHVsZS5leHRlbnNpb259PC9kZWZhdWx0VmFsdWU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgU2V0cyB0aGUgbWFwcGluZyBwYXR0ZXJuIGZvciBhbGwgTk9OLVVOUEFDS0VEIGRlcGVuZGVuY2llcyBpbmNsdWRlZAotICAgICAgICAgICAgaW4gdGhpcyBhc3NlbWJseS4KLSAgICAgICAgICAgIChTaW5jZSAyLjItYmV0YS0yOyAyLjItYmV0YS0xIHVzZXMgJHthcnRpZmFjdElkfS0ke3ZlcnNpb259JHtkYXNoQ2xhc3NpZmllcj99LiR7ZXh0ZW5zaW9ufSBhcyBkZWZhdWx0IHZhbHVlKQotICAgICAgICAgICAgTk9URTogSWYgdGhlIGRlcGVuZGVuY3lTZXQgc3BlY2lmaWVzIHVucGFjayA9PSB0cnVlLCBvdXRwdXRGaWxlTmFtZU1hcHBpbmcgV0lMTCBOT1QgQkUgVVNFRDsgaW4gdGhlc2UgY2FzZXMsCi0gICAgICAgICAgICB1c2Ugb3V0cHV0RGlyZWN0b3J5LgotICAgICAgICAgICAgU2VlIHRoZSBwbHVnaW4gRkFRIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgZW50cmllcyB1c2FibGUgaW4gdGhlIG91dHB1dEZpbGVOYW1lTWFwcGluZyBwYXJhbWV0ZXIuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgIDwvZmllbGRzPgotICAgIDwvY2xhc3M+Ci0gICAgCi0gICAgPGNsYXNzPgotICAgICAgPG5hbWU+UmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgIERlZmluZXMgYSBNYXZlbiByZXBvc2l0b3J5IHRvIGJlIGluY2x1ZGVkIGluIHRoZSBhc3NlbWJseS4gVGhlIGFydGlmYWN0cwotICAgICAgICBhdmFpbGFibGUgdG8gYmUgaW5jbHVkZWQgaW4gYSByZXBvc2l0b3J5IGFyZSB5b3VyIHByb2plY3QncyBkZXBlbmRlbmN5Ci0gICAgICAgIGFydGlmYWN0cy4gVGhlIHJlcG9zaXRvcnkgY3JlYXRlZCBjb250YWlucyB0aGUgbmVlZGVkIG1ldGFkYXRhIGVudHJpZXMKLSAgICAgICAgYW5kIGFsc28gY29udGFpbnMgYm90aCBzaGExIGFuZCBtZDUgY2hlY2tzdW1zLiBUaGlzIGlzIHVzZWZ1bCBmb3IgY3JlYXRpbmcKLSAgICAgICAgYXJjaGl2ZXMgd2hpY2ggd2lsbCBiZSBkZXBsb3llZCB0byBpbnRlcm5hbCByZXBvc2l0b3JpZXMuCi0KLSAgICAgICAgPGJyLz48Yj5OT1RFOjwvYj4gQ3VycmVudGx5LCBvbmx5IGFydGlmYWN0cyBmcm9tIHRoZSBjZW50cmFsIHJlcG9zaXRvcnkKLSAgICAgICAgYXJlIGFsbG93ZWQuCi0gICAgICAgIF1dPgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5vdXRwdXREaXJlY3Rvcnk8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTZXRzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IHJlbGF0aXZlIHRvIHRoZSByb290Ci0gICAgICAgICAgICBvZiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIGFzc2VtYmx5LiBGb3IgZXhhbXBsZSwKLSAgICAgICAgICAgICJsb2ciIHdpbGwgcHV0IHRoZSBzcGVjaWZpZWQgZmlsZXMgaW4gdGhlIGxvZyBkaXJlY3RvcnksCi0gICAgICAgICAgICBkaXJlY3RseSBiZW5lYXRoIHRoZSByb290IG9mIHRoZSBhcmNoaXZlLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2luY2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgYXJ0aWZhY3QgY29vcmRpbmF0ZXMgdG8gaW5jbHVkZS4gSWYgbm9uZSBpcyBwcmVzZW50LCB0aGVuCi0gICAgICAgICAgICAmbHQ7aW5jbHVkZXMmZ3Q7IHJlcHJlc2VudHMgYWxsIHZhbGlkIHZhbHVlcy4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgQXJ0aWZhY3QgY29vcmRpbmF0ZXMgbWF5IGJlIGdpdmVuIGluIHNpbXBsZSBncm91cElkOmFydGlmYWN0SWQgZm9ybSwKLSAgICAgICAgICAgIG9yIHRoZXkgbWF5IGJlIGZ1bGx5IHF1YWxpZmllZCBpbiB0aGUgZm9ybSBncm91cElkOmFydGlmYWN0SWQ6dHlwZVs6Y2xhc3NpZmllcl06dmVyc2lvbi4KLSAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgd2lsZGNhcmRzIGNhbiBiZSB1c2VkLCBhcyBpbiAqOm1hdmVuLSoKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5leGNsdWRlczwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2V4Y2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSBhIHNldCBvZgotICAgICAgICAgICAgZGVwZW5kZW5jeSBhcnRpZmFjdCBjb29yZGluYXRlcyB0byBleGNsdWRlLiBJZiBub25lIGlzIHByZXNlbnQsIHRoZW4KLSAgICAgICAgICAgICZsdDtleGNsdWRlcyZndDsgcmVwcmVzZW50cyBubyBleGNsdXNpb25zLgotICAgICAgICAgICAgCi0gICAgICAgICAgICBBcnRpZmFjdCBjb29yZGluYXRlcyBtYXkgYmUgZ2l2ZW4gaW4gc2ltcGxlIGdyb3VwSWQ6YXJ0aWZhY3RJZCBmb3JtLAotICAgICAgICAgICAgb3IgdGhleSBtYXkgYmUgZnVsbHkgcXVhbGlmaWVkIGluIHRoZSBmb3JtIGdyb3VwSWQ6YXJ0aWZhY3RJZDp0eXBlWzpjbGFzc2lmaWVyXTp2ZXJzaW9uLgotICAgICAgICAgICAgQWRkaXRpb25hbGx5LCB3aWxkY2FyZHMgY2FuIGJlIHVzZWQsIGFzIGluICo6bWF2ZW4tKgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbGVNb2RlPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPCEtLSAKLSAgICAgICAgICA8ZGVmYXVsdFZhbHVlPjA2NDQ8L2RlZmF1bHRWYWx1ZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNpbWlsYXIgdG8gYSBVTklYIHBlcm1pc3Npb24sIHNldHMgdGhlIGZpbGUgbW9kZSBvZiB0aGUgZmlsZXMgaW5jbHVkZWQuCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZiBSZWFkID0gNCwKLSAgICAgICAgICAgIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZSAwNjQ0Ci0gICAgICAgICAgICB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDY0NAotICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vbmxhbXAuY29tL3B1Yi9hL2JzZC8yMDAwLzA5LzA2L0ZyZWVCU0RfQmFzaWNzLmh0bWwiPihtb3JlIG9uIHVuaXgtc3R5bGUgcGVybWlzc2lvbnMpPC9hPgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmRpcmVjdG9yeU1vZGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8IS0tIAotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+MDc1NTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIC0tPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU2ltaWxhciB0byBhIFVOSVggcGVybWlzc2lvbiwgc2V0cyB0aGUgZGlyZWN0b3J5IG1vZGUgb2YgdGhlIGRpcmVjdG9yaWVzCi0gICAgICAgICAgICBpbmNsdWRlZC4gCi0gICAgICAgICAgICBUSElTIElTIEFOIE9DVEFMIFZBTFVFLgotICAgICAgICAgICAgRm9ybWF0OiAoVXNlcikoR3JvdXApKE90aGVyKSB3aGVyZSBlYWNoIGNvbXBvbmVudCBpcyBhIHN1bSBvZgotICAgICAgICAgICAgUmVhZCA9IDQsIFdyaXRlID0gMiwgYW5kIEV4ZWN1dGUgPSAxLiAgRm9yIGV4YW1wbGUsIHRoZSB2YWx1ZQotICAgICAgICAgICAgMDc1NSB0cmFuc2xhdGVzIHRvIFVzZXIgcmVhZC13cml0ZSwgR3JvdXAgYW5kIE90aGVyIHJlYWQtb25seS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMgMDc1NS4KLSAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub25sYW1wLmNvbS9wdWIvYS9ic2QvMjAwMC8wOS8wNi9GcmVlQlNEX0Jhc2ljcy5odG1sIj4obW9yZSBvbiB1bml4LXN0eWxlIHBlcm1pc3Npb25zKTwvYT4KLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5pbmNsdWRlTWV0YWRhdGE8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5mYWxzZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIElmIHNldCB0byB0cnVlLCB0aGlzIHByb3BlcnR5IHdpbGwgdHJpZ2dlciB0aGUgY3JlYXRpb24gb2YgcmVwb3NpdG9yeQotICAgICAgICAgICAgbWV0YWRhdGEgd2hpY2ggd2lsbCBhbGxvdyB0aGUgcmVwb3NpdG9yeSB0byBiZSB1c2VkIGFzIGEgZnVuY3Rpb25hbCByZW1vdGUKLSAgICAgICAgICAgIHJlcG9zaXRvcnkuCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmdyb3VwVmVyc2lvbkFsaWdubWVudHM8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wLjArPC92ZXJzaW9uPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIDwhW0NEQVRBWwotICAgICAgICAgICAgU3BlY2lmaWVzIHRoYXQgeW91IHdhbnQgdG8gYWxpZ24gYSBncm91cCBvZiBhcnRpZmFjdHMgdG8gYSBzcGVjaWZpZWQKLSAgICAgICAgICAgIHZlcnNpb24uIEEgZ3JvdXBWZXJzaW9uQWxpZ25tZW50IGlzIHNwZWNpZmllZCBieSBwcm92aWRpbmcgb25lIG9yCi0gICAgICAgICAgICBtb3JlIG9mICZsdDtncm91cFZlcnNpb25BbGlnbm1lbnQmZ3Q7IHN1YmVsZW1lbnRzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICA8YXNzb2NpYXRpb24+Ci0gICAgICAgICAgICA8dHlwZT5Hcm91cFZlcnNpb25BbGlnbm1lbnQ8L3R5cGU+Ci0gICAgICAgICAgICA8bXVsdGlwbGljaXR5Pio8L211bHRpcGxpY2l0eT4KLSAgICAgICAgICA8L2Fzc29jaWF0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+c2NvcGU8L25hbWU+Ci0gICAgICAgICAgPHZlcnNpb24+MS4xLjArPC92ZXJzaW9uPiAgICAgICAgICAgICAgCi0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+cnVudGltZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxyZXF1aXJlZD50cnVlPC9yZXF1aXJlZD4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBTcGVjaWZpZXMgdGhlIHNjb3BlIGZvciBhcnRpZmFjdHMgaW5jbHVkZWQgaW4gdGhpcyByZXBvc2l0b3J5LiAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLSAgICA8Y2xhc3M+Ci0gICAgICA8bmFtZT5Hcm91cFZlcnNpb25BbGlnbm1lbnQ8L25hbWU+Ci0gICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIEFsbG93cyBhIGdyb3VwIG9mIGFydGlmYWN0cyB0byBiZSBhbGlnbmVkIHRvIGEgc3BlY2lmaWVkIHZlcnNpb24uCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmlkPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIGdyb3VwSWQgb2YgdGhlIGFydGlmYWN0cyBmb3Igd2hpY2ggeW91IHdhbnQgdG8gYWxpZ24gdGhlCi0gICAgICAgICAgICB2ZXJzaW9ucy4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dmVyc2lvbjwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjAuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRoZSB2ZXJzaW9uIHlvdSB3YW50IHRvIGFsaWduIHRoaXMgZ3JvdXAgdG8uCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFdoZW4gJmx0O2V4Y2x1ZGUmZ3Q7IHN1YmVsZW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5IGRlZmluZSB0aGUKLSAgICAgICAgICAgIGFydGlmYWN0SWRzIG9mIHRoZSBhcnRpZmFjdHMgdG8gZXhjbHVkZS4gSWYgbm9uZSBpcyBwcmVzZW50LCB0aGVuCi0gICAgICAgICAgICAmbHQ7ZXhjbHVkZXMmZ3Q7IHJlcHJlc2VudHMgbm8gZXhjbHVzaW9ucy4gQW4gZXhjbHVkZSBpcyBzcGVjaWZpZWQKLSAgICAgICAgICAgIGJ5IHByb3ZpZGluZyBvbmUgb3IgbW9yZSBvZiAmbHQ7ZXhjbHVkZSZndDsgc3ViZWxlbWVudHMuCi0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDxhc3NvY2lhdGlvbj4KLSAgICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICAgIDxtdWx0aXBsaWNpdHk+KjwvbXVsdGlwbGljaXR5PgotICAgICAgICAgIDwvYXNzb2NpYXRpb24+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICA8L2ZpZWxkcz4KLSAgICA8L2NsYXNzPgotICAgIDxjbGFzcz4KLSAgICAgIDxuYW1lPlVucGFja09wdGlvbnM8L25hbWU+Ci0gICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICBTcGVjaWZpZXMgb3B0aW9ucyBmb3IgaW5jbHVkaW5nL2V4Y2x1ZGluZy9maWx0ZXJpbmcgaXRlbXMgZXh0cmFjdGVkIGZyb20gYW4gYXJjaGl2ZS4gKFNpbmNlIDIuMi1iZXRhLTEpCi0gICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgPGZpZWxkcz4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmluY2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNldCBvZiBmaWxlIGFuZC9vciBkaXJlY3RvcnkgcGF0dGVybnMgZm9yIG1hdGNoaW5nIGl0ZW1zIHRvIGJlIGluY2x1ZGVkIGZyb20gYW4gYXJjaGl2ZSBhcyBpdCBpcyB1bnBhY2tlZC4KLSAgICAgICAgICAgIEVhY2ggaXRlbSBpcyBzcGVjaWZpZWQgYXMgJmx0O2luY2x1ZGUmZ3Q7c29tZS9wYXRoJmx0Oy9pbmNsdWRlJmd0OyAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICA8IVtDREFUQVsKLSAgICAgICAgICAgIFNldCBvZiBmaWxlIGFuZC9vciBkaXJlY3RvcnkgcGF0dGVybnMgZm9yIG1hdGNoaW5nIGl0ZW1zIHRvIGJlIGV4Y2x1ZGVkIGZyb20gYW4gYXJjaGl2ZSBhcyBpdCBpcyB1bnBhY2tlZC4KLSAgICAgICAgICAgIEVhY2ggaXRlbSBpcyBzcGVjaWZpZWQgYXMgJmx0O2V4Y2x1ZGUmZ3Q7c29tZS9wYXRoJmx0Oy9leGNsdWRlJmd0OyAoU2luY2UgMi4yLWJldGEtMSkKLSAgICAgICAgICAgIF1dPgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGFzc29jaWF0aW9uPgotICAgICAgICAgICAgPHR5cGU+U3RyaW5nPC90eXBlPgotICAgICAgICAgICAgPG11bHRpcGxpY2l0eT4qPC9tdWx0aXBsaWNpdHk+Ci0gICAgICAgICAgPC9hc3NvY2lhdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmZpbHRlcmVkPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4wKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgV2hldGhlciB0byBmaWx0ZXIgc3ltYm9scyBpbiB0aGUgZmlsZXMgYXMgdGhleSBhcmUgdW5wYWNrZWQgZnJvbSB0aGUgYXJjaGl2ZSwgdXNpbmcKLSAgICAgICAgICBwcm9wZXJ0aWVzIGZyb20gdGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb24uIChTaW5jZSAyLjItYmV0YS0xKQotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPGRlZmF1bHRWYWx1ZT5mYWxzZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDx0eXBlPmJvb2xlYW48L3R5cGU+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5saW5lRW5kaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBTZXRzIHRoZSBsaW5lLWVuZGluZ3Mgb2YgdGhlIGZpbGVzLiAoU2luY2UgMi4yKQotICAgICAgICAgICAgVmFsaWQgdmFsdWVzOgotICAgICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGI+ImtlZXAiPC9iPiAtIFByZXNlcnZlIGFsbCBsaW5lIGVuZGluZ3M8L2xpPgotICAgICAgICAgICAgICA8bGk+PGI+InVuaXgiPC9iPiAtIFVzZSBVbml4LXN0eWxlIGxpbmUgZW5kaW5nczwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Yj4ibGYiPC9iPiAtIFVzZSBhIHNpbmdsZSBsaW5lLWZlZWQgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJkb3MiPC9iPiAtIFVzZSBET1Mtc3R5bGUgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxiPiJjcmxmIjwvYj4gLSBVc2UgQ2FycmFpZ2UtcmV0dXJuLCBsaW5lLWZlZWQgbGluZSBlbmRpbmdzPC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICBdXT4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgICA8ZmllbGQ+Ci0gICAgICAgICAgPG5hbWU+dXNlRGVmYXVsdEV4Y2x1ZGVzPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4yKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5ib29sZWFuPC90eXBlPgotICAgICAgICAgIDxkZWZhdWx0VmFsdWU+dHJ1ZTwvZGVmYXVsdFZhbHVlPgotICAgICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFdoZXRoZXIgc3RhbmRhcmQgZXhjbHVzaW9uIHBhdHRlcm5zLCBzdWNoIGFzIHRob3NlIG1hdGNoaW5nIENWUyBhbmQgU3VidmVyc2lvbgotICAgICAgICAgICAgbWV0YWRhdGEgZmlsZXMsIHNob3VsZCBiZSB1c2VkIHdoZW4gY2FsY3VsYXRpbmcgdGhlIGZpbGVzIGFmZmVjdGVkIGJ5IHRoaXMgc2V0LgotICAgICAgICAgICAgRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuIChTaW5jZSAyLjIpCi0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgICAgPGZpZWxkPgotICAgICAgICAgIDxuYW1lPmVuY29kaW5nPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4zKzwvdmVyc2lvbj4KLSAgICAgICAgICA8dHlwZT5TdHJpbmc8L3R5cGU+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgPCFbQ0RBVEFbCi0gICAgICAgICAgICBBbGxvd3MgdG8gc3BlY2lmeSB0aGUgZW5jb2RpbmcgdG8gdXNlIHdoZW4gdW5wYWNraW5nIGFyY2hpdmVzLCBmb3IgdW5hcmNoaXZlcnMKLSAgICAgICAgICAgIHRoYXQgc3VwcG9ydCBzcGVjaWZ5aW5nIGVuY29kaW5nLiBJZiB1bnNwZWNpZmllZCwgYXJjaGl2ZXIgZGVmYXVsdCB3aWxsIGJlIHVzZWQuCi0gICAgICAgICAgICBBcmNoaXZlciBkZWZhdWx0cyBnZW5lcmFsbHkgcmVwcmVzZW50IHNhbmUgKG1vZGVybikgdmFsdWVzLgotICAgICAgICAgICAgXV0+Ci0gICAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPC9maWVsZD4KLSAgICAgIDwvZmllbGRzPgotICAgIDwvY2xhc3M+Ci0gICAgPGNsYXNzPgotICAgICAgPG5hbWU+Q29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJDb25maWc8L25hbWU+Ci0gICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgIENvbmZpZ3VyZXMgYSBmaWx0ZXIgZm9yIGZpbGVzIGhlYWRlZCBpbnRvIHRoZSBhc3NlbWJseSBhcmNoaXZlLCB0byBlbmFibGUKLSAgICAgICAgYWdncmVnYXRpb24gb2YgdmFyaW91cyB0eXBlcyBvZiBkZXNjcmlwdG9yIGZyYWdtZW50cywgc3VjaCBhcyBjb21wb25lbnRzLnhtbCwKLSAgICAgICAgd2ViLnhtbCwgZXRjLgotICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgIDxmaWVsZHM+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5oYW5kbGVyTmFtZTwvbmFtZT4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEuMCs8L3ZlcnNpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVGhlIGhhbmRsZXIncyBwbGV4dXMgcm9sZS1oaW50LCBmb3IgbG9va3VwIGZyb20gdGhlIGNvbnRhaW5lci4KLSAgICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgIDx0eXBlPlN0cmluZzwvdHlwZT4KLSAgICAgICAgICA8cmVxdWlyZWQ+dHJ1ZTwvcmVxdWlyZWQ+Ci0gICAgICAgIDwvZmllbGQ+Ci0gICAgICAgIDxmaWVsZD4KLSAgICAgICAgICA8bmFtZT5jb25maWd1cmF0aW9uPC9uYW1lPgotICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xKzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBoYW5kbGVyLgotICAgICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgICAgPHR5cGU+RE9NPC90eXBlPgotICAgICAgICA8L2ZpZWxkPgotICAgICAgPC9maWVsZHM+Ci0gICAgPC9jbGFzcz4KLSAgPC9jbGFzc2VzPgotPC9tb2RlbD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BsZXh1cy9jb21wb25lbnRzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ3NTA1OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wbGV4dXMvY29tcG9uZW50cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGNvbXBvbmVudC1zZXQ+Ci0gIDxjb21wb25lbnRzPgotICAgIDwhLS0gVW5BcmNoaXZlciAtLT4KLSAgICA8Y29tcG9uZW50PgotICAgICAgPHJvbGU+b3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5VbkFyY2hpdmVyPC9yb2xlPgotICAgICAgPHJvbGUtaGludD5zYXI8L3JvbGUtaGludD4KLSAgICAgIDxpbXBsZW1lbnRhdGlvbj5vcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLnppcC5aaXBVbkFyY2hpdmVyPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxpbnN0YW50aWF0aW9uLXN0cmF0ZWd5PnBlci1sb29rdXA8L2luc3RhbnRpYXRpb24tc3RyYXRlZ3k+Ci0gICAgPC9jb21wb25lbnQ+Ci0gICAgPGNvbXBvbmVudD4KLSAgICAgIDxyb2xlPm9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5yZXNvdXJjZXMuUGxleHVzSW9SZXNvdXJjZUNvbGxlY3Rpb248L3JvbGU+Ci0gICAgICA8cm9sZS1oaW50PnNhcjwvcm9sZS1oaW50PgotICAgICAgPGltcGxlbWVudGF0aW9uPm9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5yZXNvdXJjZXMuUGxleHVzSW9aaXBGaWxlUmVzb3VyY2VDb2xsZWN0aW9uPC9pbXBsZW1lbnRhdGlvbj4KLSAgICAgIDxpbnN0YW50aWF0aW9uLXN0cmF0ZWd5PnBlci1sb29rdXA8L2luc3RhbnRpYXRpb24tc3RyYXRlZ3k+Ci0gICAgPC9jb21wb25lbnQ+Ci0gIDwvY29tcG9uZW50cz4KLTwvY29tcG9uZW50LXNldD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvYmluLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvYmluLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAxYzdiOS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL2Jpbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBTVEFSVCBTTklQUEVUOiBiaW4gLS0+Ci08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgPGlkPmJpbjwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD50YXIuYnoyPC9mb3JtYXQ+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5Plwke3Byb2plY3QuYmFzZWRpcn08L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5cJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX08L2RpcmVjdG9yeT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLmphcjwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5cJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vc2l0ZTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2NzPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KLTwhLS0gRU5EIFNOSVBQRVQ6IGJpbiAtLT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvamFyLXdpdGgtZGVwZW5kZW5jaWVzLnhtbCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvamFyLXdpdGgtZGVwZW5kZW5jaWVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhiYzdjOC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL2phci13aXRoLWRlcGVuZGVuY2llcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBTVEFSVCBTTklQUEVUOiBqYXItd2l0aC1kZXBlbmRlbmNpZXMgLS0+Ci08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgPCEtLSBUT0RPOiBhIGphcmphciBmb3JtYXQgd291bGQgYmUgYmV0dGVyIC0tPgotICA8aWQ+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+dHJ1ZTwvdXNlUHJvamVjdEFydGlmYWN0PgotICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5U2V0PgotICA8L2RlcGVuZGVuY3lTZXRzPgotPC9hc3NlbWJseT4KLTwhLS0gRU5EIFNOSVBQRVQ6IGphci13aXRoLWRlcGVuZGVuY2llcyAtLT4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcHJvamVjdC54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDM3NWVjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvcHJvamVjdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgotPCEtLQotICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBTVEFSVCBTTklQUEVUOiBwcm9qZWN0IC0tPgotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IiAKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIDxpZD5wcm9qZWN0PC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnRhci5iejI8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+XCR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+KiovKi5sb2c8L2V4Y2x1ZGU+Ci0gICAgICAgIDxleGNsdWRlPioqL1wke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8qKjwvZXhjbHVkZT4KLSAgICAgIDwvZXhjbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICA8L2ZpbGVTZXRzPgotPC9hc3NlbWJseT4KLTwhLS0gRU5EIFNOSVBQRVQ6IHByb2plY3QgLS0+CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3NyYy54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3NyYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMmJmODEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvbWFpbi9yZXNvdXJjZXMvYXNzZW1ibGllcy9zcmMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0KLSAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08IS0tIFNUQVJUIFNOSVBQRVQ6IHNyYyAtLT4KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSIgCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktJHttZG9WZXJzaW9ufS54c2QiPgotICA8aWQ+c3JjPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD50YXIuZ3o8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnRhci5iejI8L2Zvcm1hdD4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+XCR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5SRUFETUUqPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5MSUNFTlNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+Tk9USUNFKjwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+cG9tLnhtbDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5Plwke3Byb2plY3QuYmFzZWRpcn0vc3JjPC9kaXJlY3Rvcnk+Ci0gICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KLSAgICA8L2ZpbGVTZXQ+Ci0gIDwvZmlsZVNldHM+Ci08L2Fzc2VtYmx5PgotPCEtLSBFTkQgU05JUFBFVDogc3JjIC0tPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvYWR2YW5jZWQtZGVzY3JpcHRvci10b3BpY3MuYXB0LnZtIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvYWR2YW5jZWQtZGVzY3JpcHRvci10b3BpY3MuYXB0LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDFiM2M0Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2FkdmFuY2VkLWRlc2NyaXB0b3ItdG9waWNzLmFwdC52bQorKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0gIC0tLQotICBBZHZhbmNlZCBBc3NlbWJseS1EZXNjcmlwdG9yIFRvcGljcwotICAtLS0KLSAgSm9obiBDYXNleQotICAtLS0KLSAgMSBEZWNlbWJlciAyMDA2Ci0gIC0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi1BZHZhbmNlZCBBc3NlbWJseS1EZXNjcmlwdG9yIFRvcGljcwotCi0qIFF1aWNrIE5vdGUgb24gQWxsIDw8PGluY2x1ZGVzPj4+IGFuZCA8PDxleGNsdWRlcz4+PiBQYXR0ZXJucwotCi0gIDw8PGV4Y2x1ZGVzPj4+IHRha2UgcHJpb3JpdHkgb3ZlciA8PDxpbmNsdWRlcz4+Pi4KLQotKiBBcmNoaXZlIGZpbGUgcmVzb2x1dGlvbgotCi0gIElmIHR3byBvciBtb3JlIGVsZW1lbnRzIChlLmcuLCBmaWxlLCBmaWxlU2V0KSBzZWxlY3QgZGlmZmVyZW50IHNvdXJjZXMgZm9yCi0gIHRoZSBzYW1lIGZpbGUgZm9yIGFyY2hpdmluZywgb25seSBvbmUgb2YgdGhlIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGFyY2hpdmVkLgotCi0gIEFzIHBlciB2ZXJzaW9uIDIuNS4yIG9mIHRoZSBhc3NlbWJseSBwbHVnaW4sIHRoZSBmaXJzdCBwaGFzZSB0bwotICBhZGQgdGhlIGZpbGUgdG8gdGhlIGFyY2hpdmUgIndpbnMiLiBUaGUgZmlsdGVyaW5nIGlzIGRvbmUgc29sZWx5IGJhc2VkCi0gIG9uIG5hbWUgaW5zaWRlIHRoZSBhcmNoaXZlLCBzbyB0aGUgc2FtZSBzb3VyY2UgZmlsZSBjYW4gYmUgYWRkZWQgdW5kZXIKLSAgZGlmZmVyZW50IG91dHB1dCBuYW1lcy4gVGhlIG9yZGVyIG9mIHRoZSBwaGFzZXMgaXMgYXMgZm9sbG93czoKLSAgMSkgRmlsZUl0ZW0gMikgRmlsZVNldHMgMykgTW9kdWxlU2V0IDQpIERlcGVuZWRlbmN5U2V0IGFuZCA1KSBSZXBvc2l0b3J5IGVsZW1lbnRzLgotCi0gIEVsZW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgd2lsbCBiZSBwcm9jZXNzZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIHRoZQotICBkZXNjcmlwdG9ycy4gSWYgeW91IG5lZWQgdG8gIm92ZXJ3cml0ZSIgYSBmaWxlIGluY2x1ZGVkIGJ5IGEgcHJldmlvdXMgc2V0LAotICB0aGUgb25seSB3YXkgdG8gZG8gdGhpcyBpcyB0byBleGNsdWRlIHRoYXQgZmlsZSBmcm9tIHRoZSBlYXJsaWVyIHNldC4KLQotICBOb3RlIHRoYXQgdGhpcyBiZWhhdmlvdXIgd2FzIHNsaWdodGx5IGRpZmZlcmVudCBpbiBlYXJsaWVyIHZlcnNpb25zIG9mIHRoZQotICBhc3NlbWJseSBwbHVnaW4uCi0KLQotKiBBZHZhbmNlZCBBcnRpZmFjdC1NYXRjaGluZyBpbiA8PDxpbmNsdWRlcz4+PiBhbmQgPDw8ZXhjbHVkZXM+Pj4KLQotICBXaGVuIHVzaW5nIDw8PGRlcGVuZGVuY3lTZXQ+Pj4gb3IgPDw8bW9kdWxlU2V0Pj4+LCB0aGUgPDw8XDxpbmNsdWRlcy9cPj4+PiBhbmQKLSAgPDw8XDxleGNsdWRlcy9cPj4+PiBzZWN0aW9ucyBhY3R1YWxseSBhcHBseSB0byBhcnRpZmFjdHMsIG5vdCBmaWxlbmFtZXMuCi0gIFRoaXMgY2FuIGJlIGEgZ29vZCB0aGluZywgc2luY2UgeW91IGRvbid0IGhhdmUgdG8ga25vdyB0aGUgYXJ0aWZhY3QncwotICBmaWxlbmFtZSBpbiB0aGUgbG9jYWwgcmVwb3NpdG9yeS4gSG93ZXZlciwgZXhwbGljaXRseSBzcGVjaWZ5aW5nIHRoZSBmdWxsCi0gIGFydGlmYWN0IElEIChjb25zaXN0aW5nIG9mIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHR5cGUsIGFuZCBjbGFzc2lmaWVyKQotICBmb3IgZWFjaCBhcnRpZmFjdCB0byBiZSBpbmNsdWRlZCBvciBleGNsdWRlZCBjYW4gbGVhZCB0byB2ZXJ5IGEgdmVyYm9zZQotICBkZXNjcmlwdG9yLiBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4yLCB0aGUgYXNzZW1ibHkgcGx1Z2luIGFkZHJlc3NlcyB0aGUKLSAgY2x1bXNpbmVzcyBvZiBleHBsaWNpdCBhcnRpZmFjdCBpZGVudGlmaWNhdGlvbiB0aHJvdWdoIHRoZSB1c2Ugb2Ygd2lsZGNhcmQKLSAgcGF0dGVybnMuCi0KLSAgVGhlIGZvbGxvd2luZyBlYXN5IHJ1bGVzIHNob3VsZCBiZSBhcHBsaWVkIHdoZW4gc3BlY2lmeWluZyBhcnRpZmFjdC1tYXRjaGluZwotICBwYXR0ZXJuczoKLQotICBbWzFdXSBBcnRpZmFjdHMgYXJlIG1hdGNoZWQgYnkgYSBzZXQgb2YgaWRlbnRpZmllciBzdHJpbmdzLiBJbiB0aGUgZm9sbG93aW5nCi0gICAgICAgIHN0cmluZ3MsIDw8PHR5cGU+Pj4gaXMgPDw8J2phcic+Pj4gYnkgZGVmYXVsdCwgYW5kIDw8PGNsYXNzaWZpZXI+Pj4gaXMKLSAgICAgICAgb21pdHRlZCBpZiBudWxsLgotCi0gICAgICAgICogPDw8Z3JvdXBJZDphcnRpZmFjdElkOnR5cGU6Y2xhc3NpZmllcj4+PgotICAgICAgICAgICggPDw8YXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKT4+PiApCi0KLSAgICAgICAgKiA8PDxncm91cElkOmFydGlmYWN0SWQ+Pj4KLSAgICAgICAgICAoIDw8PEFydGlmYWN0VXRpbHMudmVyc2lvbmxlc3NLZXkoIGFydGlmYWN0ICk+Pj4gKQotCi0gICAgICAgICogPDw8Z3JvdXBJZDphcnRpZmFjdElkOnR5cGU6Y2xhc3NpZmllcjp2ZXJzaW9uPj4+Ci0gICAgICAgICAgKCA8PDxhcnRpZmFjdC5nZXRJZCgpPj4+ICkKLQotICAgICAgICBbXQotCi0gIFtbMl1dIEFueSA8PDwnKic+Pj4gY2hhcmFjdGVyIGluIGFuIGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJuIHdpbGwgcmVzdWx0IGluIHRoZQotICAgICAgICBwYXR0ZXJuIGJlaW5nIHNwbGl0LCBhbmQgdGhlIHN1Yi1wYXR0ZXJucyBiZWluZyBtYXRjaGVkIHdpdGhpbiB0aGUgdGhyZWUKLSAgICAgICAgYXJ0aWZhY3QgaWRlbnRpZmllcnMgbWVudGlvbmVkIGFib3ZlLCB1c2luZyA8PDxTdHJpbmcuaW5kZXhPZiguLik+Pj4uCi0KLSAgW1szXV0gV2hlbiBubyA8PDwnKic+Pj4gaXMgcHJlc2VudCBpbiBhbiBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybiwgdGhlIHBhdHRlcm4KLSAgICAgICAgd2lsbCBvbmx5IG1hdGNoIGlmIHRoZSA8PGVudGlyZT4+IHBhdHRlcm4gZXF1YWxzIG9uZSBvZiB0aGUgdGhyZWUKLSAgICAgICAgYXJ0aWZhY3QgaWRlbnRpZmllcnMgYWJvdmUsIHVzaW5nIHRoZSA8PDxTdHJpbmcuZXF1YWxzKC4uKT4+PiBtZXRob2QuCi0KLSAgW1s0XV0gSW4gY2FzZSB5b3UgbWlzc2VkIGl0IGFib3ZlLCBhcnRpZmFjdC1pZGVudGlmaWNhdGlvbiBmaWVsZHMgYXJlCi0gICAgICAgIHNlcGFyYXRlZCBieSBjb2xvbnMgKDw8PCc6Jz4+PikgaW4gdGhlIG1hdGNoaW5nIHN0cmluZ3MuIFNvLCBhIHdpbGRjYXJkCi0gICAgICAgIHBhdHRlcm4gdGhhdCBtYXRjaGVzIGFueSBhcnRpZmFjdCBvZiB0eXBlIDw8PCd3YXInPj4+IG1pZ2h0IGJlIHNwZWNpZmllZAotICAgICAgICBhcyA8PDwqOndhcj4+Pi4KLQotICBbXQotCi0qKiBFeGFtcGxlOiBJbmNsdWRlIGFsbCBkZXBlbmRlbmNpZXMgb2YgdHlwZSA8PDwnd2FyJz4+PgotCi0gIEluIHRoaXMgZXhhbXBsZSwgd2UnbGwgY29uZmlndXJlIGEgPDw8ZGVwZW5kZW5jeVNldD4+PiBzbyBpdCBvbmx5IGluY2x1ZGVzCi0gIHRob3NlIDw8PHdhcj4+PiBkZXBlbmRlbmNpZXMuCi0KLS0tLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIFsuLi5dCi0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+Kjp3YXI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLSAgWy4uLl0KLTwvYXNzZW1ibHk+Ci0tLS0KLQotKioqIEdPVENIQSEKLQotICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgYW55IDw8PHdhcj4+PiBhcnRpZmFjdHMgdGhhdCBoYXBwZW4gdG8gaGF2ZSBhIGNsYXNzaWZpZXIKLSAgKG5vdCBzdXJlIHdoeSB0aGlzIHBhcnRpY3VsYXIgY2FzZSB3b3VsZCBoYXBwZW4sIGJ1dCBpdCA8aXM+IHBvc3NpYmxlKSB3aWxsIGJlCi0gIDw8c2tpcHBlZD4+LiBJZiB5b3UgPHJlYWxseT4gd2FudCB0byBiZSBjYXJlZnVsIGFib3V0IGNhdGNoaW5nIGFsbCBvZiB0aGUKLSAgPDw8d2FyPj4+IGFydGlmYWN0cyBpbiB5b3VyIHByb2plY3QsIHlvdSBtaWdodCB3YW50IHRvIHVzZSB0aGUgZm9sbG93aW5nCi0gIHBhdHRlcm46Ci0KLS0tLQotKjp3YXI6KgotLS0tCi0KLSoqIEV4YW1wbGU6IEV4Y2x1ZGUgYWxsIHNvdXJjZS1qYXIgZGVwZW5kZW5jaWVzLgotCi0gIEluIHRoaXMgZXhhbXBsZSwgd2UncmUgZGVhbGluZyB3aXRoIHRoZSBmYWN0IHRoYXQgcHJvamVjdCBzb3VyY2VzIGFyZQotICBvZnRlbiBkaXN0cmlidXRlZCB1c2luZyBqYXIgZmlsZXMsIGluIGFkZGl0aW9uIHRvIG5vcm1hbCBiaW5hcmllcy4gV2Ugd2FudCB0bwotICBmaWx0ZXIgb3V0IGFueSBzb3VyY2UtamFyIGZpbGVzICh0aGV5J2xsIGJlIG1hcmtlZCB3aXRoIGEgPDw8c291cmNlcz4+PgotICBjbGFzc2lmaWVyKSBmcm9tIHRoZSBiaW5hcnkgamFycy4KLQotLS0tCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgWy4uLl0KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qOmphcjoqPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+Kjpzb3VyY2VzPC9leGNsdWRlPgotICAgICAgPC9leGNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci0gIFsuLi5dCi08L2Fzc2VtYmx5PgotLS0tCi0KLSogSW5jbHVkaW5nIFN1YnZlcnNpb24gTWV0YWRhdGEgRGlyZWN0b3JpZXMgaW4gYSBGaWxlU2V0Ci0KLSAgRm9yIG1vc3QgdXNlIGNhc2VzLCBpdCdzIGltcG9ydGFudCB0byBhdm9pZCBhZGRpbmcgbWV0YWRhdGEgZmlsZXMgZnJvbSB5b3VyCi0gIHNvdXJjZS1jb250cm9sIHN5c3RlbSwgc3VjaCBhcyBTdWJ2ZXJzaW9uJ3MgPDw8LnN2bj4+PiBkaXJlY3Rvcmllcy4gU3VjaAotICBtZXRhZGF0YSBjYW4gaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIHJlc3VsdGluZyBhc3NlbWJseSB2YXN0bHkuIEJ5IGRlZmF1bHQsCi0gIHRoZSBhc3NlbWJseSBwbHVnaW4gd2lsbCBleGNsdWRlIG1ldGFkYXRhIGZpbGVzIGZvciBtb3N0IGNvbW1vbiBzb3VyY2UtY29udHJvbAotICBzeXN0ZW1zIGZyb20gdGhlIDw8PGZpbGVTZXQ+Pj5zIHNwZWNpZmllZCBpbiB0aGUgZGVzY3JpcHRvci4KLQotICBPbiB0aGUgb3RoZXIgaGFuZCwgd2hhdCBpZiB5b3UgPHdhbnRlZD4gdG8gaW5jbHVkZSBTdWJ2ZXJzaW9uIG1ldGFkYXRhCi0gIGRpcmVjdG9yaWVzPyBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4yLCB0aGUgYXNzZW1ibHkgcGx1Z2luIG9mZmVycyB0aGUKLSAgPDw8dXNlRGVmYXVsdEV4Y2x1ZGVzPj4+IG9wdGlvbiBvbiBhbGwgPDw8ZmlsZVNldD4+PiBlbGVtZW50cywgaW4gb3JkZXIgdG8KLSAgYWNjb21tb2RhdGUgdGhpcyB1c2UgY2FzZS4KLQotKiogRXhhbXBsZTogQnVuZGxlIHByb2plY3Qgc291cmNlcyBmb3IgYSBkZXZlbG9wZXItcXVpY2tzdGFydCBwYWNrCi0KLSAgSW4gdGhpcyBleGFtcGxlLCBsZXQncyBleGFtaW5lIHdoYXQgaGFwcGVucyBpZiB5b3UgaGF2ZSBhIGxhcmdlIHByb2plY3QgaW4KLSAgc291cmNlIGNvbnRyb2wuIFRoaXMgcHJvamVjdCBjb250YWlucyBhIGxhcmdlIG51bWJlciBvZiBzaXphYmxlIGZpbGVzIHRoYXQKLSAgaGF2ZW4ndCBjaGFuZ2VkIHNpbmNlIHRoZSBkYXkgdGhleSB3ZXJlIGFkZGVkLCBpbiB0aGUgZWFybHkgc3RhZ2VzIG9mIHRoZQotICBwcm9qZWN0J3MgbGlmZXRpbWUuIFlvdSB3YW50IHRvIGVuYWJsZSBwb3RlbnRpYWwgZGV2ZWxvcGVycyB0byBnZXQgc3RhcnRlZAotICBxdWlja2x5LCB3aXRob3V0IGNoZWNraW5nIG91dCBodW5kcmVkcyBvZiAxMC1tZWdhYnl0ZSBmaWxlcyBmaXJzdC4KLQotICBUaGUgY29tcHJlc3Npb24gaW5jb3Jwb3JhdGVkIHdpdGggbWFueSBhcmNoaXZpbmcgZm9ybWF0cyBjYW4gb2ZmZXIgYW4KLSAgYWR2YW50YWdlIGhlcmUuIElmIHdlIGNyZWF0ZSBhIHByb2plY3QgYXNzZW1ibHksIGluY2x1ZGluZyBTdWJ2ZXJzaW9uIG1ldGFkYXRhCi0gIGRpcmVjdG9yaWVzLCBkZXZlbG9wZXJzIHNob3VsZCBiZSBhYmxlIHRvIGRvd25sb2FkIHRoZSBhc3NlbWJseSBhcnRpZmFjdCBhbmQKLSAgZXhwYW5kIGl0LCB0aGVuIHNpbXBseSB0eXBlIDw8PHN2biB1cD4+Pi4KLQotLS0tCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgWy4uLl0KLSAgPGZpbGVTZXRzPgotICAgIDxmaWxlU2V0PgotICAgICAgPHVzZURlZmF1bHRFeGNsdWRlcz5mYWxzZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgotICAgICAgPGV4Y2x1ZGVzPgotICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLSAgWy4uLl0KLTwvYXNzZW1ibHk+Ci0tLS0KLQotICA8Tk9URTogWW91J2xsIG5vdGljZSB0aGF0IHdlJ3JlIGV4Y2x1ZGluZyBhbGwgdGFyZ2V0IGRpcmVjdG9yaWVzOyB0aGVzZSBhcmUgYQotICBmb3JtIG9mICJjYWxjdWxhdGVkIiBhbmQgb3RoZXJ3aXNlIHRyYW5zaWVudCBkYXRhLCBhbmQgZ2VuZXJhbGx5IHNob3VsZG4ndCBiZQotICBpbmNsdWRlZCBpbiBhcmNoaXZlcywgdW5sZXNzIHlvdXIgZ29hbCBpcyB0byBjcmVhdGUgcHJvamVjdCBiaW5hcmllcyBvcgotICBzaW1pbGFyLj4KLQotKiBVc2luZyBSZWd1bGFyIEV4cHJlc3Npb25zIHRvIEV4Y2x1ZGUgRmlsZXMKLQotICA8PFNpbmNlOiAyLjItYmV0YS00Pj4KLQotICBTb21ldGltZXMsIHlvdSBtYXkgZmluZCB5b3UgbmVlZCB0byBzcGVjaWZ5IGFuIGV4dHJlbWVseSBmaW5lLWdyYWluZWQgaW5jbHVzaW9uIG9yCi0gIGV4Y2x1c2lvbiBwYXR0ZXJuIGZvciBhIDw8PGZpbGVTZXQ+Pj4uIEluIHRoZXNlIGNhc2VzLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHNwZWNpZnlpbmcKLSAgeW91ciBwYXR0ZXJuIGluIHRoZSBmb3JtIG9mIGEgcmVndWxhciBleHByZXNzaW9uIGJ5IHVzaW5nIHRoZSA8PDwlcmVnZXhbLi4uXT4+PiBzeW50YXguCi0KLSAgPE5vdGU6PiBGb3IgY29tcGxldGVuZXNzLCB0aGUgZGVmYXVsdCBwYXR0ZXJuIHR5cGUgLSBBbnQtc3R5bGUgcGF0dGVybnMgLSBjYW4gYWxzbyBiZQotICBzcGVjaWZpZWQgdXNpbmcgdGhlIG5ldyA8PDwlYW50Wy4uLl0+Pj4gc3ludGF4LiBUaGlzIHdpbGwgYWxsb3cgcm9vbSBmb3IgZnV0dXJlIGV4cGFuc2lvbgotICBvZiA8PDxmaWxlU2V0Pj4+IHBhdHRlcm5zLCBpbmNsdWRpbmcgdGhlIG9wdGlvbiB0byBjaGFuZ2UgdGhlIGRlZmF1bHQgcGF0dGVybiBzeW50YXgKLSAgc29tZWRheS4KLQotKiogRXhhbXBsZTogSW5jbHVkaW5nIGRpcmVjdG9yaWVzIG5hbWVkIDw8PHRhcmdldD4+PiBpbiB0aGUgPDw8c3JjPj4+IGRpcmVjdG9yeQotCi0gIEluIHRoaXMgZXhhbXBsZSwgd2Ugd2FudCB0byBwcm9kdWNlIGEgYnVpbGRhYmxlIHNvdXJjZSBkaXN0cmlidXRpb24gb2YgYQotICBNYXZlbiBwcm9qZWN0IGhpZXJhcmNoeS4gT2J2aW91c2x5LCBlYWNoIHByb2plY3QncyA8PDx0YXJnZXQ+Pj4gZGlyZWN0b3J5IGlzCi0gIGEgdGVtcG9yYXJ5IHdvcmtzcGFjZSBmb3IgdGhlIGJ1aWxkIHByb2Nlc3MsIHNvIHdlIHdhbnQgdG8gZXhjbHVkZSB0aGVzZQotICBkaXJlY3Rvcmllcy4gSG93ZXZlciwgaWYgb25lIG9yIG1vcmUgb2YgdGhlIHByb2plY3RzIGFsc28gaW5jbHVkZXMgYSBzdWJkaXJlY3RvcnkKLSAgbmFtZWQgPDw8dGFyZ2V0Pj4+IGluIHRoZSA8PDxzcmM+Pj4gZGlyZWN0b3J5IHN0cnVjdHVyZSAtIHBlcmhhcHMgYXMgcGFydCBvZgotICBhIEphdmEgcGFja2FnZSBuYW1lIC0gd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGFyZQotICBpbmNsdWRlZCBpbiB0aGUgYXNzZW1ibHkuCi0KLS0tLQotPGFzc2VtYmx5PgotICBbLi4uXQotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPiVyZWdleFsoPyEuKnNyYy8pLip0YXJnZXQuKl08L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICBbLi4uXQotICA8L2ZpbGVTZXRzPgotICBbLi4uXQotPC9hc3NlbWJseT4KLS0tLQotCi0gIFRoZSBhYm92ZSA8PDxmaWxlU2V0Pj4+IHVzZXMgYSBzb21ld2hhdCBvYnNjdXJlIGZlYXR1cmUgb2YgcmVndWxhcgotICBleHByZXNzaW9ucyBjYWxsZWQgPG5lZ2F0aXZlIGxvb2thaGVhZD4sIHdoaWNoIG1lYW5zIG91ciBleGNsdWRlIHBhdHRlcm4KLSAgd2lsbCBvbmx5IG1hdGNoIHBhdGhzIHRoYXQgY29udGFpbiB0aGUgd29yZCA8PDx0YXJnZXQ+Pj4gYnV0IDw8ZG9uJ3Q+PgotICBjb250YWluIDw8PHNyYz4+Pi4gRWZmZWN0aXZlbHksIGFueSA8PDx0YXJnZXQ+Pj4gZGlyZWN0b3J5IHdpdGhpbiB0aGUKLSAgPDw8c3JjPj4+IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgd2lsbCBiZSBwcmVzZXJ2ZWQgaW4gdGhlIGFzc2VtYmx5LgotCi0qIFVzaW5nIFN0cmljdC1GaWx0ZXJpbmcgdG8gQ2F0Y2ggT2Jzb2xldGUgUGF0dGVybnMgb3IgSW5jb3JyZWN0IEJ1aWxkcwotCi0gIEF0IHRpbWVzLCB5b3Ugd2FudCB0byBidWlsZCBpbiBhIHNldCBvZiBzYW5pdHkgY2hlY2tzIHdoZW4gY3JlYXRpbmcgeW91cgotICBhc3NlbWJseSwgdG8gZW5zdXJlIHRoYXQgd2hhdCBnb2VzIGludG8gdGhlIGFzc2VtYmx5IGFydGlmYWN0IGlzIHdoYXQgeW91Ci0gIGludGVuZGVkLiBPbmUgd2F5IHlvdSBjYW4gZG8gdGhpcyBpcyBieSBlbmFibGluZyA8PDx1c2VTdHJpY3RGaWx0ZXJpbmc+Pj4gb24KLSAgeW91ciA8PDxkZXBlbmRlbmN5U2V0cz4+PiwgPDw8bW9kdWxlU2V0cz4+PiwgYW5kIDw8PGZpbGVTZXRzPj4+LgotCi0gIDw8PHVzZVN0cmljdEZpbHRlcmluZz4+PiBpcyBhIGZsYWcgdGhhdCB0ZWxscyB0aGUgYXNzZW1ibHkgcGx1Z2luIHRvIHRyYWNrCi0gIGVhY2ggaW5jbHVkZS9leGNsdWRlIHBhdHRlcm4gdG8gbWFrZSBzdXJlIGl0J3MgdXNlZCBkdXJpbmcgY3JlYXRpb24gb2YgdGhlCi0gIGFzc2VtYmx5LiBUaGlzIHdheSwgaWYgdGhlIGFzc2VtYmx5LWRlc2NyaXB0b3IgYXV0aG9yIGludGVuZGVkIGZvciBhIHBhcnRpY3VsYXIKLSAgZmlsZSBvciBhcnRpZmFjdCB0byBiZSBwcmVzZW50LCBoZSBjYW4gYWRkIGFuIGluY2x1ZGUvZXhjbHVkZSBwYXR0ZXJuIHRvIHRoZQotICBkZXNjcmlwdG9yIHRvIGVuc3VyZSB0aGF0IGZpbGUvYXJ0aWZhY3QgaXMgcHJlc2VudCwgYW5kIHRoZW4gc2V0IHRoZQotICA8PDx1c2VTdHJpY3RGaWx0ZXJpbmc+Pj4gZmxhZy4gSWYgdGhlIHBhdHRlcm4gaXNuJ3QgdXNlZCB0byBtYXRjaCBhdCBsZWFzdCBvbmUKLSAgZmlsZSBkdXJpbmcgYXNzZW1ibHkgY3JlYXRpb24sIHRoZSBidWlsZCB3aWxsIGZhaWwgYW5kIHRoZSB1c2VyIHdpbGwgcmVjZWl2ZSBhCi0gIG1lc3NhZ2Ugbm90aWZ5aW5nIGhpbSBvZiB0aGUgdW51c2VkIHBhdHRlcm5zLgotCi0qKiBFeGFtcGxlOiBFbnN1cmluZyB0aGUgTElDRU5TRS50eHQgZmlsZSBpcyBpbmNsdWRlZCBpbiBhIGphcgotCi0gIEluIHRoaXMgZXhhbXBsZSwgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBvdXIgcHJvamVjdCBqYXIgY29udGFpbnMgdGhlCi0gIHByb2plY3QncyBvcGVuIHNvdXJjZSBsaWNlbnNlIGxhbmd1YWdlLCBpbiBvcmRlciB0byBiZSBjb21wbGlhbnQgd2l0aCBvdXIKLSAgc29mdHdhcmUgZm91bmRhdGlvbidzIHBvbGljaWVzLgotCi0tLS0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktJHttZG9WZXJzaW9ufS54c2QiPgotICBbLi4uXQotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8dXNlU3RyaWN0RmlsdGVyaW5nPnRydWU8L3VzZVN0cmljdEZpbHRlcmluZz4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+TUVUQS1JTkY8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+TElDRU5TRS50eHQ8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgICBbLi4uXQotICA8L2ZpbGVTZXRzPgotICBbLi4uXQotPC9hc3NlbWJseT4KLS0tLQotCi0gIElmIGEgZGV2ZWxvcGVyIGluYWR2ZXJ0ZW50bHkgcmVtb3ZlcyB0aGUgTElDRU5TRS50eHQgZnJvbSB0aGUgcHJvamVjdAotICBkaXJlY3RvcnksIHRoZSBhc3NlbWJseSBwbHVnaW4gc2hvdWxkIHJlZnVzZSB0byBidWlsZCB0aGlzIGFzc2VtYmx5LgotCi0qIFVzaW5nIGFuIEFsdGVybmF0aXZlIEFzc2VtYmx5IEJhc2UgRGlyZWN0b3J5Ci0KLSAgSW4gbWFueSBjYXNlcywgYXNzZW1ibGllcyBzaG91bGQgaGF2ZSBhbGwgZmlsZXMgYXJyYW5nZWQgdW5kZXIgb25lIGFzc2VtYmx5Ci0gIGJhc2UgZGlyZWN0b3J5LiBUaGlzIHdheSwgYSB1c2VyIHdobyBleHBhbmRzIHRoZSBhc3NlbWJseSB3aWxsIGhhdmUgYWxsIG9mIHRoZQotICBjb250ZW50cyBjb2xsZWN0ZWQgaW4gYSBuaWNlLCBuZWF0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUsIHJhdGhlciB0aGFuIHNwcmVhZAotICB0aHJvdWdob3V0IHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LiBUaGlzIGlzIGFjaGlldmVkIHVzaW5nIHRoZQotICA8PDxpbmNsdWRlQmFzZURpcmVjdG9yeT4+PiBmbGFnLCBhbmQgdGhpcyBmbGFnIGlzIHNldCB0byA8PDx0cnVlPj4+IGJ5Ci0gIGRlZmF1bHQsIHdoaWNoIHdpbGwgcmVzdWx0IGluIHRoZSBwcm9qZWN0J3MgPDw8YXJ0aWZhY3RJZC12ZXJzaW9uPj4+IGJlaW5nCi0gIHVzZWQgYXMgdGhlIGFzc2VtYmx5IGJhc2UgZGlyZWN0b3J5LgotCi0gIEhvd2V2ZXIsIGluIHNvbWUgc3BlY2lhbCBjYXNlcyB5b3UgbWF5IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IGRpcmVjdG9yeSBuYW1lCi0gIGZvciB0aGUgcm9vdCBvZiB5b3VyIGFzc2VtYmx5LiBTdGFydGluZyBpbiB0aGUgMi4yIHZlcnNpb24gb2YgdGhlIGFzc2VtYmx5Ci0gIHBsdWdpbiwgdGhpcyB1c2UgY2FzZSBpcyBhZGRyZXNzZWQgdXNpbmcgdGhlIDw8PGJhc2VEaXJlY3Rvcnk+Pj4gZWxlbWVudCBvZgotICB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvci4gV2l0aCB0aGlzIGVsZW1lbnQsIHlvdSBjYW4gdXNlIFBPTSBleHByZXNzaW9ucyBhbmQKLSAgc3RhdGljIHN0cmluZ3MgdG8gc3BlY2lmeSB0aGUgbmFtZSBvZiB0aGUgYXNzZW1ibHkgcm9vdCBkaXJlY3RvcnkuCi0KLSoqIEV4YW1wbGU6IEVjbGlwc2Utc3R5bGUgaW52YXJpYWJsZSBkaXJlY3RvcnkgbmFtZSBmb3IgdGhlIE1hdmVuIGFzc2VtYmx5Ci0KLSAgSW4gdGhpcyBleGFtcGxlLCBsZXQncyBleHBsb3JlIHdoYXQgd291bGQgaGFwcGVuIGlmIHdlIHdhbnRlZCBNYXZlbiB0byB1c2UgdGhlCi0gIEVjbGlwc2UgYXBwcm9hY2ggZm9yIG5hbWluZyB0aGUgcm9vdCBkaXJlY3RvcnkgaW4gaXRzIGRpc3RyaWJ1dGlvbiBhc3NlbWJsaWVzLgotICBUaGlzIHdheSwgaW5zdGVhZCBvZiBleHBhbmRpbmcgdGhlIGRpc3RyaWJ1dGlvbiB0byBmaW5kIGEgbmV3Ci0gIDw8PG1hdmVuLTIuMC40Pj4+IGRpcmVjdG9yeSwgeW91J2QgZmluZCBhIDw8PG1hdmVuPj4+IGRpcmVjdG9yeS4gQWRkaXRpb25hbGx5LAotICBjb25zaWRlciB0aGF0IHRoZSBkaXN0cmlidXRpb24gYXNzZW1ibHkgaXMgY3VycmVudGx5IGJ1aWx0IGZyb20gdGhlCi0gIDw8PG1hdmVuLWNvcmU+Pj4gcHJvamVjdCwgd2hpY2ggbWVhbnMgd2Ugc2hvdWxkbid0IHVzZSB0aGUgPDw8YXJ0aWZhY3RJZD4+PiBhcwotICBwYXJ0IG9mIHRoZSBhc3NlbWJseSByb290IGRpcmVjdG9yeS4KLQotLS0tCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgWy4uLl0KLSAgPGJhc2VEaXJlY3Rvcnk+bWF2ZW48L2Jhc2VEaXJlY3Rvcnk+Ci0gIFsuLi5dCi08L2Fzc2VtYmx5PgotLS0tCi0KLSAgTm93LCBpbWFnaW5lIHRoYXQgdGhlIGRpc3RyaWJ1dGlvbiBhc3NlbWJseSB3ZXJlIGNyZWF0ZWQgaW4gdGhlIHRvcC1sZXZlbAotICA8PDxtYXZlbj4+PiBwcm9qZWN0LiBOb3csIHdlIDxjYW4+IHVzZSB0aGUgPDw8YXJ0aWZhY3RJZD4+PiwgYW5kIHByb2JhYmx5Ci0gIHNob3VsZCwganVzdCB0byBtaW5pbWl6ZSB0aGUgbWFpbnRlbmFuY2Ugb2YgdGhlc2UgZmlsZXMuCi0KLS0tLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIFsuLi5dCi0gIDxiYXNlRGlyZWN0b3J5PiR7YXJ0aWZhY3RJZH08L2Jhc2VEaXJlY3Rvcnk+Ci0gIFsuLi5dCi08L2Fzc2VtYmx5PgotLS0tCi0KLSogQWR2YW5jZWQgTW9kdWxlU2V0IFRvcGljcwotCi0gIE9uZSBvZiB0aGUgbW9zdCBjb21wbGV4IHNlY3Rpb25zIG9mIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIGlzIHRoZQotICA8PDxtb2R1bGVTZXRzPj4+IHNlY3Rpb24uIEluIGZhY3QsIHNvIG1hbnkgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbiBtYWRlIHRvIHRoaXMKLSAgc2VjdGlvbiB0aGF0IHdlIGZlZWwgaXQgd2FycmFudHMgaXRzIG93biA8IkFkdmFuY2VkIFRvcGljcyI+IHBhZ2UuCi0KLSAgKiBHbyB0byB7e3suL2FkdmFuY2VkLW1vZHVsZS1zZXQtdG9waWNzLmh0bWx9QWR2YW5jZWQgTW9kdWxlLVNldCBUb3BpY3N9fS4KLQotICBbXQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvYWR2YW5jZWQtbW9kdWxlLXNldC10b3BpY3MuYXB0LnZtIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvYWR2YW5jZWQtbW9kdWxlLXNldC10b3BpY3MuYXB0LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmE5MzZjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2FkdmFuY2VkLW1vZHVsZS1zZXQtdG9waWNzLmFwdC52bQorKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0gIC0tLQotICBBZHZhbmNlZCBNb2R1bGUtU2V0IFRvcGljcwotICAtLS0KLSAgSm9obiBDYXNleQotICAtLS0KLSAgMSBEZWNlbWJlciAyMDA2Ci0gIC0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi1BZHZhbmNlZCBNb2R1bGUtU2V0IFRvcGljcwotCi0qIFF1aWNrIE5vdGUKLQotICBTb21lIG9mIHRoZSB0b3BpY3MgaW4gdGhpcyBkb2N1bWVudCByZWZlciB0byBtb3JlIGdlbmVyYWwgdG9waWNzIG9yCi0gIGltcHJvdmVtZW50cyBpbiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciBhcyBhIHdob2xlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCi0gIHRoZSB7e3suL2FkdmFuY2VkLWRlc2NyaXB0b3ItdG9waWNzLmh0bWx9QWR2YW5jZWQgQXNzZW1ibHktRGVzY3JpcHRvciBUb3BpY3N9fQotICBwYWdlLgotCi0qIEluY2x1ZGluZyBhbmQgRXhjbHVkaW5nIE1vZHVsZXMgdXNpbmcgYSBNb2R1bGVTZXQKLQotICBBcyB5b3UgYXJlIG5vIGRvdWJ0IGF3YXJlLCBNYXZlbiAyLjAgaW50cm9kdWNlcyBhZHZhbmNlZCBoYW5kbGluZyBvZgotICBtdWx0aW1vZHVsZSBidWlsZHMuIFRoZXNlIGFyZSBidWlsZHMgd2hpY2ggY29udGFpbiBtdWx0aXBsZSwgb2Z0ZW4KLSAgaW50ZXJyZWxhdGVkIHByb2plY3RzLiBJbiB0aGVzZSBidWlsZHMsIHByb2plY3QgaGllcmFyY2h5IGlzIGVzdGFibGlzaGVkCi0gIHRocm91Z2ggdXNlIG9mIHRoZSA8PDxtb2R1bGVzPj4+IHNlY3Rpb24gb2YgdGhlIFBPTSwgd2hlcmUgcGFyZW50IFBPTXMgc3BlY2lmeQotICB0aGVpciBjaGlsZHJlbiBpbiBhIDw8PG1vZHVsZXM+Pj4gc2VjdGlvbi4gT3RoZXIgcmVsYXRpb25zaGlwcywgbGlrZQotICBpbnRlcmRlcGVuZGVuY3ksIGFsc28gZXhpc3Qgd2l0aGluIG11bHRpbW9kdWxlIGJ1aWxkczsgaG93ZXZlciwgdGhlc2UgYXJlCi0gIGJleW9uZCB0aGUgc2NvcGUgb2YgdGhpcyBkb2N1bWVudC4KLQotICBXaGVuIGNvbnN0cnVjdGluZyBhbiBhc3NlbWJseSBmcm9tIGFueSBwYXJlbnQtbGV2ZWwgcHJvamVjdCBpbiBhIG11bHRpbW9kdWxlCi0gIGJ1aWxkLCBpdCdzIHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhpcyBwYXJlbnQtUE9NJ3MgZGVzY2VuZGVudCBtb2R1bGVzLCBhbmQKLSAgaW5jbHVkZSB0aGVtIGluIHNvbWUgZm9ybSB3aXRoaW4gdGhlIHJlc3VsdGluZyBhc3NlbWJseSBhcnRpZmFjdC4gQnkgZGVmYXVsdCwKLSAgdGhlIGVudGlyZSBtb2R1bGUgaGllcmFyY2h5IGJlbG93IHRoZSBjdXJyZW50IHByb2plY3QgaXMgYXZhaWxhYmxlIGZvcgotICBpbmNsdXNpb24gb3IgZXhjbHVzaW9uLiBBbHNvLCBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybnMgZm9yIG1vZHVsZXMgYXJlIG1hdGNoZWQKLSAgdXNpbmcgdGhlIGFydGlmYWN0LW1hdGNoaW5nIHJ1bGVzIGV4cGxhaW5lZCBpbiB0aGUgPDxBZHZhbmNlZAotICBBc3NlbWJseS1EZXNjcmlwdG9yIFRvcGljcz4+IGRvY3VtZW50LgotCi0gIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgZGVzY3JpYmUgaG93IHRvIHNlbGVjdCBjZXJ0YWluIG1vZHVsZXMgaW4gdGhlIHByb2plY3QKLSAgaGllcmFyY2h5IHVzaW5nIGJhc2ljIGFydGlmYWN0IGluY2x1ZGVzL2V4Y2x1ZGVzLiBJdCBkb2VzIDw8bm90Pj4gZGVzY3JpYmUKLSAgd2hhdCB0byBkbyB3aXRoIHRoZSBzZWxlY3RlZCBtb2R1bGVzOyB0byBsZWFybiBhYm91dCB0aGUgYWN0aW9ucyBhdmFpbGFibGUgZm9yCi0gIHNlbGVjdGVkIG1vZHVsZXMsIHNlZSB7e3tJbmNsdWRpbmdfTW9kdWxlX1NvdXJjZXN9aW5jbHVkaW5nIG1vZHVsZSBzb3VyY2VzfX0gCi0gIGFuZCB7e3tJbmNsdWRpbmdfTW9kdWxlX0JpbmFyaWVzfWluY2x1ZGluZyBtb2R1bGUgYmluYXJpZXN9fSAKLSAgYmVsb3cuIEZvciBvdGhlciwgbW9yZSBhZHZhbmNlZCBtb2R1bGUtaGFuZGxpbmcgb3B0aW9ucywgcmVhZCBvbiEKLQotKiogRXhhbXBsZTogU2VsZWN0IG9uZSBmcm9tIGEgc2V0IG9mIGNoaWxkIHByb2plY3RzCi0KLSAgR2l2ZW4gdGhlIGZvbGxvd2luZyBwcm9qZWN0IHN0cnVjdHVyZSwgYW5kIGFsbCBhcHByb3ByaWF0ZSBtb2R1bGUgcmVmZXJlbmNlcwotICBpbiB0aGUgcGFyZW50IFBPTToKLQotLS0tCi0rIHBhcmVudCAoZ3JvdXBJZDogb3JnLnRlc3QsIGFydGlmYWN0SWQ6IHBhcmVudCkKLSAgfAotICArIGNoaWxkMSAoZ3JvdXBJZDogb3JnLnRlc3QsIGFydGlmYWN0SWQ6IGNoaWxkMSkKLSAgfAotICArIGNoaWxkMiAoZ3JvdXBJZDogb3JnLnRlc3QsIGFydGlmYWN0SWQ6IGNoaWxkMikKLS0tLQotCi0gIFdlIGNhbiBzZWxlY3QgPDxqdXN0Pj4gdGhlIGNoaWxkMSBtb2R1bGUgdXNpbmcgdGhlIGZvbGxvd2luZyA8PDxtb2R1bGVTZXQ+Pj46Ci0KLS0tLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIFsuLi5dCi0gIDxtb2R1bGVTZXRzPgotICAgIFsuLi5dCi0gICAgPG1vZHVsZVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+b3JnLnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotICBbLi4uXQotPC9hc3NlbWJseT4KLS0tLQotCi0gIDxOT1RFOiBJdCdzIGltcG9ydGFudCB0byByZW1lbWJlciB0aGF0LCBpZiB0aGUgY2hpbGQxIHByb2plY3QgaXRzZWxmIGhhZAotICBjaGlsZHJlbiwgdGhvc2UgY2hpbGRyZW4gd291bGQgbm90IGJlIGluY2x1ZGVkIGp1c3QgYmVjYXVzZSB0aGUgY2hpbGQxIHByb2plY3QKLSAgd2FzIGluY2x1ZGVkLiBFYWNoIG1vZHVsZSBpcyBtYXRjaGVkIHNlcGFyYXRlbHkuPgotCi1+fiBbamRjYXNleV0gVE9ETzogQW1lbmQgdGhpcyBvbmNlIHdlJ3ZlIGhhbmRsZWQgdGhlIGNhc2Ugd2hlcmUgeW91IHdhbnQgdG8gcHJvY2Vzcwotfn4gdGhlIGVudGlyZSBpbmhlcml0YW5jZS9kZXBlbmRlbmN5IHRyYWlsLiBXZSdsbCBuZWVkIGEgZmxhZyB0byBzYXkgIkluY2x1ZGUKLX5+IG15IGFuY2VzdHJ5IHdoZW4gbWF0Y2hpbmcgZm9yIGluY2x1ZGVzL2V4Y2x1ZGVzIiwgYW5kIGhhdmUgdGhhdCBhcHBseQotfn4gYXBwcm9wcmlhdGVseSB0byB0aGUgdHJhbnNpdGl2ZSBkZXBlbmRlbmN5IHRyYWlsIGluIGEgZGVwZW5kZW5jeVNldCwgb3IgYQotfn4gbW9kdWxlIGhpZXJhcmNoeSBpbiBhIG1vZHVsZVNldC4KLQotKiBRdWljayBOb3RlIG9uIDw8PG91dHB1dEZpbGVOYW1lTWFwcGluZz4+PiB3aXRoaW4gTW9kdWxlU2V0cwotCi0gIFdoZW4gdXNlZCBmcm9tIHdpdGhpbiBhIDw8PG1vZHVsZVNldD4+PiwgYWxsIDw8PG91dHB1dEZpbGVOYW1lTWFwcGluZz4+PgotICBjb25maWd1cmF0aW9ucyB3aXRoIGV4cHJlc3Npb25zIGxpa2UgPDw8JFx7YXJ0aWZhY3RJZFx9Pj4+IDxleHRyYWN0IGluZm9ybWF0aW9uCi0gIGZyb20gdGhlIGFydGlmYWN0IGluIHF1ZXN0aW9uLj4KLQotKiogRXhhbXBsZTogU2V0dGluZyA8PDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+Pj4gZnJvbSA8PDxtb2R1bGVTZXQvYmluYXJpZXM+Pj4KLQotICBHaXZlbiBhIG1vZHVsZSB3aXRoIHRoZSBmb2xsb3dpbmc6Ci0KLS0tLQotR3JvdXAgSWQ6IG9yZy50ZXN0Ci1BcnRpZmFjdCBJZDogcHJvamVjdAotVmVyc2lvbjogMS4wLjEKLVR5cGU6IGphcgotLS0tCi0KLSAgVGhlIGZvbGxvd2luZyA8PDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+Pj46Ci0KLS0tLQotJHttb2R1bGUuZ3JvdXBJZH0tJHttb2R1bGUuYXJ0aWZhY3RJZH0tJHttb2R1bGUudmVyc2lvbn0uJHttb2R1bGUuZXh0ZW5zaW9ufQotLS0tCi0KLSAgV2lsbCByZXN1bHQgaW4gYSBmaWxlIGNhbGxlZCA8PDxvcmcudGVzdC1wcm9qZWN0LTEuMC5qYXI+Pj4gYmVpbmcgY3JlYXRlZAotICB3aXRoaW4gdGhlIGFzc2VtYmx5LgotCi0gIDxOT1RFOiBUaGUgZXhwcmVzc2lvbiA8PDwkXHttb2R1bGUuZXh0ZW5zaW9uXH0+Pj4gaXMgbWFwcGVkIHRvIHRoZSBmaWxlIGV4dGVuc2lvbgotICBzdXBwbGllZCBieSB0aGUgQXJ0aWZhY3RIYW5kbGVyIGZvciB0aGUgdHlwZSA8PDxqYXI+Pj4uIEl0J3MgaW1wb3J0YW50IHRvCi0gIHJlbWVtYmVyIHRoYXQgdGhlIGZpbGUgZXh0ZW5zaW9uIDw8bmVlZCBub3QgYmUgLmphcj4+Lj4KLQotKiB7SW5jbHVkaW5nIE1vZHVsZSBTb3VyY2VzfQotCi0gIE9uY2UgeW91J3ZlIHNlbGVjdGVkIGNlcnRhaW4gbW9kdWxlcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYXNzZW1ibHksIHlvdSBoYXZlCi0gIHRvIGRldGVybWluZSB3aGF0IHlvdSB3YW50IGluY2x1ZGVkIGZyb20gZWFjaCBtb2R1bGUuIFRoaXMgdXN1YWxseSBkZXBlbmRzIG9uCi0gIHRoZSBwdXJwb3NlIG9mIHRoZSBhc3NlbWJseS4gRm9yIGluc3RhbmNlLCBpZiB5b3UncmUgYnVpbGRpbmcgYSBiaW5hcnkKLSAgYXNzZW1ibHksIGZvciB1c2UgaW4gYSBydW50aW1lIGNvbnRleHQsIHlvdSBwcm9iYWJseSB3YW50IHRvIGluY2x1ZGUgbW9kdWxlCi0gIGJpbmFyaWVzIG9ubHkgKHNlZSB0aGUge3tJbmNsdWRpbmdfTW9kdWxlX0JpbmFyaWVzfX0gc2VjdGlvbiBiZWxvdykuIEhvd2V2ZXIsCi0gIGlmIHlvdXIgYXNzZW1ibHkgaXMgbWVhbnQgdG8gaW5jbHVkZSBwcm9qZWN0IHNvdXJjZXMsIGVpdGhlciBhcyBhIHJlZmVyZW5jZSBvcgotICB0byBhbGxvdyB1c2VycyB0byBidWlsZCB5b3VyIHByb2plY3QgKG9yIGZvciBzb21lIG90aGVyIHJlYXNvbiBhbHRvZ2V0aGVyKSwKLSAgdGhlbiB5b3UncmUgcHJvYmFibHkgaW50ZXJlc3RlZCBpbiB0aGUgPDw8c291cmNlcz4+PiBzZWN0aW9uIG9mIHRoZQotICA8PDxtb2R1bGVTZXQ+Pj4uCi0KLSAgUHJvY2Vzc2luZyBtb2R1bGUgc291cmNlcyBpcyBhIGZpbGVTZXQtYmFzZWQgYWN0aXZpdHkuIFRoYXQgaXMsIHNvdXJjZXMgYXJlCi0gIGluY2x1ZGVkIG9yIGV4Y2x1ZGVkIGJhc2VkIG9uIGZpbGUtbWF0Y2hpbmcgcGF0dGVybnMsIG9yIGV4cGxpY2l0Ci0gIDw8PGZpbGVTZXQ+Pj4gc3Vic2VjdGlvbnMuIDw8Rm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb25seT4+LCB0aGUKLSAgPDw8XDxzb3VyY2VzL1w+Pj4+IHNlY3Rpb24gaXRzZWxmIHN1cHBvcnRzIDw8PGluY2x1ZGVzPj4+IGFuZCA8PDxleGNsdWRlcz4+PgotICB0aGF0IGNhbiBoZWxwIGRldGVybWluZSB3aGljaCBmaWxlcyBmcm9tIGEgbW9kdWxlJ3MgZGlyZWN0b3J5IHNob3VsZCBiZQotICBwcm9jZXNzZWQuIFN0YXJ0aW5nIGluIHZlcnNpb24gMi4yIG9mIHRoZSBhc3NlbWJseSBwbHVnaW4sIHRoZQotICA8PDxcPHNvdXJjZXMvXD4+Pj4gc2VjdGlvbiBzdXBwb3J0cyBhIDw8PFw8ZmlsZVNldHMvXD4+Pj4gc3Vic2VjdGlvbiwgd2hpY2ggaXMKLSAgdGhlIHByZWZlcnJlZCB3YXkgb2Ygc2VsZWN0aW5nIG1vZHVsZS1zb3VyY2UgZmlsZXMgZm9yIHByb2Nlc3NpbmcuCi0KLSoqIEV4YW1wbGU6IGluY2x1ZGluZyB0aGUgPDw8c3JjPj4+IGRpcmVjdG9yeSBmcm9tIGVhY2ggc2VsZWN0ZWQgbW9kdWxlCi0KLSAgSW4gdGhpcyBleGFtcGxlLCB3ZSdsbCBleHBsb3JlIGhvdyB0byBpbmNsdWRlIHRoZSA8PDxzcmM+Pj4gZGlyZWN0b3J5IDw8b25seT4+Ci0gIGZvciBlYWNoIG1vZHVsZSBzZWxlY3RlZCBieSB0aGUgbW9kdWxlU2V0LiBUaGlzIGlzIHVzZWZ1bCB0byBwcm92aWRlIGEgc291cmNlCi0gIHJlZmVyZW5jZSBmb3IgeW91ciBwcm9qZWN0IHRvIHVzZXJzLgotCi0tLS0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktJHttZG9WZXJzaW9ufS54c2QiPgotICBbLi4uXQotICA8bW9kdWxlU2V0cz4KLSAgICBbLi4uXQotICAgIDxtb2R1bGVTZXQ+Ci0gICAgICBbLi4uXQotICAgICAgPHNvdXJjZXM+Ci0gICAgICAgIDxmaWxlU2V0cz4KLSAgICAgICAgICA8ZmlsZVNldD4KLSAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8L2ZpbGVTZXRzPgotICAgICAgPC9zb3VyY2VzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgotLS0tCi0KLSoqIEV4YW1wbGU6IEluY2x1ZGluZyBhIGJ1aWxkYWJsZSBwcm9qZWN0IGRpcmVjdG9yeSBmb3IgZWFjaCBzZWxlY3RlZCBtb2R1bGUKLQotICBJbiB0aGlzIGV4YW1wbGUsIHdlJ2xsIGV4cGxvcmUgaG93IHRvIGluY2x1ZGUgYW4gZW50aXJlIGJ1aWxkYWJsZSBwcm9qZWN0Ci0gIGRpcmVjdG9yeSwgZm9yIGVhY2ggc2VsZWN0ZWQgbW9kdWxlLCB3aXRoaW4geW91ciBhc3NlbWJseS4gVGhpcyBpcyB1c2VmdWwgdG8KLSAgZ2l2ZSB5b3VyIHVzZXJzIHRoZSBjaGFuY2UgdG8gdGlua2VyIHdpdGggeW91ciBwcm9qZWN0LCB0aGVuIGJ1aWxkIGl0IG9uIHRoZWlyCi0gIG93bi4KLQotLS0tCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgWy4uLl0KLSAgPG1vZHVsZVNldHM+Ci0gICAgWy4uLl0KLSAgICA8bW9kdWxlU2V0PgotICAgICAgWy4uLl0KLSAgICAgIDxzb3VyY2VzPgotICAgICAgICA8ZmlsZVNldHM+Ci0gICAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgICAgICAgIDxleGNsdWRlPnRhcmdldC8qKjwvZXhjbHVkZT4KLSAgICAgICAgICAgIDwvZXhjbHVkZXM+Ci0gICAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8L2ZpbGVTZXRzPgotICAgICAgPC9zb3VyY2VzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgotLS0tCi0KLSAgPE5PVEU6IFdlIGV4Y2x1ZGUgdGhlIHRhcmdldCBkaXJlY3RvcnksIHNpbmNlIHRoaXMgaXMgYXNzdW1lZCB0byBiZSB0ZW1wb3JhcnkKLSAgc3RvcmFnZSBmb3IgZmlsZXMgcHJvZHVjZWQgZHVyaW5nIHRoZSBjb3Vyc2Ugb2YgYSBNYXZlbiBidWlsZC4gUGVybWFuZW50Ci0gIHByb2plY3QgZmlsZXMgYXJlIG5vdCBtZWFudCB0byByZXNpZGUgaGVyZS4uLj4KLQotKiogQ29uc29saWRhdGluZyBBbGwgTW9kdWxlIFNvdXJjZXMgaW50byBhIFNpbmdsZSBEaXJlY3RvcnkgU3RydWN0dXJlCi0KLSAgTm9ybWFsbHksIGVhY2ggbW9kdWxlIHByb2Nlc3NlZCBieSB0aGUgYXNzZW1ibHkgcGx1Z2luIGlzIHBsYWNlZCB3aXRoaW4gaXRzCi0gIG93biBkaXJlY3Rvcnkgc3RydWN0dXJlIGluc2lkZSB0aGUgYXNzZW1ibHkgcm9vdCBkaXJlY3RvcnkuIEZvciBtb2R1bGUKLSAgc291cmNlcywgdGhlIGRlZmF1bHQgbmFtZSBvZiB0aGlzIG1vZHVsZS1zcGVjaWZpYyBkaXJlY3RvcnkgaXMgdGhlIG1vZHVsZSdzCi0gIDw8PGFydGlmYWN0SWQ+Pj4uCi0KLSAgSG93ZXZlciwgaW4gc29tZSBjYXNlcyB5b3UgbWF5IHdhbnQgdG8gY29uc29saWRhdGUgbW9kdWxlIHNvdXJjZXMgaW50byB0aGUKLSAgc2FtZSBkaXJlY3Rvcnkgc3RydWN0dXJlLCBiYXNlZCBpbiB0aGUgYXNzZW1ibHkgcm9vdCBkaXJlY3RvcnkuIFRvIGRvIHRoaXMsCi0gIHNpbXBseSBzZXQgdGhlIDw8PGluY2x1ZGVNb2R1bGVEaXJlY3Rvcnk+Pj4gZmxhZyB0byA8PDxmYWxzZT4+Pi4KLQotKioqIEV4YW1wbGU6IENvcHkgYWxsIG1vZHVsZSBzb3VyY2VzIGludG8gYSBzaW5nbGUgPDw8c3JjPj4+IGRpcmVjdG9yeQotCi0gIFdoZW4gcHJvdmlkaW5nIGEgc291cmNlIHJlZmVyZW5jZSB0byB1c2VycywgeW91IG1heSB3YW50IHRvIHByb2R1Y2UgYSBzaW5nbGUsCi0gIGNvbnNvbGlkYXRlZCBzb3VyY2UgZGlyZWN0b3J5IGNvbnRhaW5pbmcgYWxsIG9mIHRoZSBzb3VyY2UgZmlsZXMgZnJvbSB5b3VyCi0gIG11bHRpbW9kdWxlIGhpZXJhcmNoeS4KLQotLS0tCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgWy4uLl0KLSAgPG1vZHVsZVNldHM+Ci0gICAgWy4uLl0KLSAgICA8bW9kdWxlU2V0PgotICAgICAgWy4uLl0KLSAgICAgIDxzb3VyY2VzPgotICAgICAgICA8aW5jbHVkZU1vZHVsZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZU1vZHVsZURpcmVjdG9yeT4KLSAgICAgICAgPGZpbGVTZXRzPgotICAgICAgICAgIDxmaWxlU2V0PgotICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5zcmM8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgICAgICAgPGluY2x1ZGU+c3JjLyoqPC9pbmNsdWRlPgotICAgICAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgICAgICA8L2ZpbGVTZXQ+Ci0gICAgICAgIDwvZmlsZVNldHM+Ci0gICAgICA8L3NvdXJjZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+Ci0tLS0KLQotKiogRXhjbHVkaW5nIE1vZHVsZXMgb2YgTW9kdWxlcyBmcm9tIERpcmVjdCBBc3NlbWJseSBQcm9jZXNzaW5nCi0KLSAgV2hlbiBkZWFsaW5nIHdpdGggcHJvamVjdCBzb3VyY2VzIGluIGEgY29tcGxleCBtdWx0aW1vZHVsZSBidWlsZCBjb25zaXN0aW5nIG9mCi0gIHNldmVyYWwgbGF5ZXJzIG9mIG1vZHVsZSBncm91cGluZ3MsIGl0J3Mgc29tZXRpbWVzIGRlc2lyYWJsZSB0byBwcm9jZXNzIG9ubHkKLSAgdGhlIHRvcCBsYXllciBvZiBtb2R1bGVzLCBhbmQgcHJvdmlkZSA8PDxmaWxlU2V0Pj4+IHNwZWNpZmljYXRpb25zIHRvIGhhbmRsZQotICBzdWItbW9kdWxlcy4gVGhpcyBjYW4gbWFrZSBpdCBtdWNoIGVhc2llciB0byBwcmVzZXJ2ZSB0aGUgcHJvamVjdC1kaXJlY3RvcnkKLSAgc3RydWN0dXJlLCBzaW5jZSBpdCBkb2Vzbid0IGZvcmNlIGFsbCBtb2R1bGVzIC0gcmVnYXJkbGVzcyBvZiB0aGVpciBsb2NhdGlvbgotICB3aXRoaW4gdGhlIHByb2plY3QgaGllcmFyY2h5IC0gdGhyb3VnaCBhIGZsYXQgbW9kdWxlLXByb2Nlc3NpbmcgbWVjaGFuaXNtLgotICBQcm9jZXNzaW5nIG9ubHkgdGhlIGZpcnN0IGxldmVsIG9mIG1vZHVsZXMgaXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmb3IKLSAgdGhlIDw8PHNvdXJjZXM+Pj4gc2VjdGlvbiBvZiBhIDw8PG1vZHVsZVNldD4+Pi4KLQotICBUbyBleHBsaWNpdGx5IHByb2Nlc3MgbW9kdWxlcyBvZiBtb2R1bGVzIC0gc3ViLW1vZHVsZXMsIHRoYXQgaXMgLSBzaW1wbHkgdXNlCi0gIHRoZSA8PDxleGNsdWRlU3ViTW9kdWxlRGlyZWN0b3JpZXM+Pj4gZmxhZywgc2V0IHRvIDw8PGZhbHNlPj4+LgotCi0qKiogRXhhbXBsZTogUHJvdmlkaW5nIGEgc2hhbGxvdyBzb3VyY2UtZGlyZWN0b3J5IHN0cnVjdHVyZSBmb3IgcmVmZXJlbmNlCi0KLSAgQ29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgeW91IHdhbnQgdG8gcHJlc2VydmUgdGhlIGNvbnRleHQgb2YgYWxsIHNvdXJjZSBmaWxlcwotICB3aXRoaW4geW91ciBwcm9qZWN0IGhpZXJhcmNoeSwgYWNjb3JkaW5nIHRvIHRoZSBwcm9qZWN0IGluIHdoaWNoIHRoZXkgYmVsb25nLgotICBBdCB0aGUgc2FtZSB0aW1lLCB5b3Ugd2FudCB0byBhdm9pZCBjb25mdXNpbmcgdXNlcnMgd2l0aCBhIGNvbXBsZXggbmVzdGluZyBvZgotICBwcm9qZWN0cyB3aXRoaW4gcHJvamVjdHMsIGFuZCBwcmVzZW50IGEgc2ltcGxlIGxpc3Qgb2YgcHJvamVjdHMgdG8gYnJvd3NlLgotCi0gIElmIHlvdXIgcHJvamVjdCBoaWVyYXJjaHkgbG9va3MgbGlrZSB0aGlzOgotCi0tLS0KLSsgYXBwbGljYXRpb24KLSAgfAotICArIHNyYwotICB8Ci0gICsgcHJvamVjdDEKLSAgfCB8Ci0gIHwgKyBzcmMKLSAgfCB8Ci0gIHwgKyBwcm9qZWN0MS1jaGlsZDEKLSAgfCB8IHwKLSAgfCB8ICsgc3JjCi0gIHwgfAotICB8ICsgcHJvamVjdDEtY2hpbGQyCi0gIHwgfCB8Ci0gIHwgfCArIHNyYwotICB8Ci0gICsgcHJvamVjdDIKLSAgICB8Ci0gICAgKyBzcmMKLSAgICB8Ci0gICAgKyBwcm9qZWN0Mi1jaGlsZDEKLSAgICAgIHwKLSAgICAgICsgc3JjCi0tLS0KLQotICBZb3UgbWF5IHdhbnQgaXQgdG8gbG9vayBsaWtlIHRoaXMgaW4gdGhlIHJlc3VsdGluZyBhc3NlbWJseToKLQotLS0tCi0rIGFwcGxpY2F0aW9uCi18IHwKLXwgKyBzcmMKLXwKLSsgcHJvamVjdDEKLXwgfAotfCArIHNyYwotfAotKyBwcm9qZWN0MS1jaGlsZDEKLXwgfAotfCArIHNyYwotfAotKyBwcm9qZWN0MS1jaGlsZDIKLXwgfAotfCArIHNyYwotfAotKyBwcm9qZWN0MgotfCB8Ci18ICsgc3JjCi18Ci0rIHByb2plY3QyLWNoaWxkMQotICB8Ci0gICsgc3JjCi0tLS0KLQotICBUbyBhY2NvbXBsaXNoIHRoaXMgcmVzdHJ1Y3R1cmluZywgc2ltcGx5IHVzZSB0aGUKLSAgPDw8ZXhjbHVkZVN1Yk1vZHVsZURpcmVjdG9yaWVzPj4+IGZsYWcsIGFzIGZvbGxvd3M6Ci0KLS0tLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIFsuLi5dCi0gIDxtb2R1bGVTZXRzPgotICAgIFsuLi5dCi0gICAgPG1vZHVsZVNldD4KLSAgICAgIFsuLi5dCi0gICAgICA8c291cmNlcz4KLSAgICAgICAgPGV4Y2x1ZGVTdWJNb2R1bGVEaXJlY3Rvcmllcz5mYWxzZTwvZXhjbHVkZVN1Yk1vZHVsZURpcmVjdG9yaWVzPgotICAgICAgICA8ZmlsZVNldHM+Ci0gICAgICAgICAgPGZpbGVTZXQ+Ci0gICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgIDxpbmNsdWRlPnNyYy8qKjwvaW5jbHVkZT4KLSAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgPC9maWxlU2V0PgotICAgICAgICA8L2ZpbGVTZXRzPgotICAgICAgPC9zb3VyY2VzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgotLS0tCi0KLSoge0luY2x1ZGluZyBNb2R1bGUgQmluYXJpZXN9Ci0KLSAgKldBUk5JTkchKiBVc2luZyB0aGUgPDw8YmluYXJpZXM+Pj4gc2VjdGlvbiBvZiBhIDw8PG1vZHVsZVNldD4+PiBkZWZpbml0aW9uCi0gIGludm9sdmVzIHNvbWUgdHJpY2t5IGNvbnNpZGVyYXRpb25zIHRoYXQgYXJlIGEgcmVzdWx0IG9mIHRoZSB3YXkgTWF2ZW4KLSAgc29ydHMgYW5kIGV4ZWN1dGVzIHByb2plY3QgYnVpbGRzIHdpdGhpbiBhIG11bHRpbW9kdWxlIGNvbnRleHQuIFBsZWFzZQotICByZWFkIHt7ey4vZmFxLmh0bWwjbW9kdWxlLWJpbmFyaWVzfXRoaXMgRkFRIGVudHJ5fX0gaWYgeW91IGRlY2lkZSB0byB1c2UgdGhlbS4KLQotICBJbiBjYXNlcyB3aGVyZSB5b3VyIGFzc2VtYmx5IGFydGlmYWN0IGlzIG1lYW50IHRvIGJlIHVzZWQgaW4gYSBydW50aW1lCi0gIGNvbnRleHQsIHlvdSdsbCBtb3N0IGxpa2VseSB3YW50IHRvIGluY2x1ZGUgdGhlIGJpbmFyaWVzIGZyb20gYW55IG1vZHVsZXMKLSAgcHJvY2Vzc2VkIGJ5IHRoZSBhc3NlbWJseSBwbHVnaW4uIFRoaXMgY2FuIGJlIGFzIHNpbXBsZSBhcyBhZGRpbmcgdGhlIG1vZHVsZSdzCi0gIGphciBhcnRpZmFjdCB0byB5b3VyIGFzc2VtYmx5IGFyY2hpdmU7IG9yLCBpdCBjYW4gaW52b2x2ZSBzZWxlY3RpdmVseQotICBpbmNsdWRpbmcgdGhlIGRlcGVuZGVuY2llcyBvZiB0aGF0IG1vZHVsZSBpbiBhZGRpdGlvbiB0byB0aGUgbW9kdWxlJ3Mgb3duIGphci4KLQotICBBdCBhbnkgcmF0ZSwgcHJvY2Vzc2luZyBtb2R1bGUgYmluYXJpZXMgaXMgYW4gYXJ0aWZhY3QtYmFzZWQgYWN0aXZpdHkuCi0gIEFjY29yZGluZ2x5LCBzZWxlY3Rpb24gb2YgdGhlIGFwcHJvcHJpYXRlIGFydGlmYWN0cyBmb3IgYSBnaXZlbiBtb2R1bGUgZm9sbG93cwotICB0aGUgYXJ0aWZhY3QgaW5jbHVzaW9uIHJ1bGVzIGV4cGxhaW5lZCBpbiB0aGUgPDxBZHZhbmNlZCBBc3NlbWJseS1EZXNjcmlwdG9yCi0gIFRvcGljcz4+IGRvY3VtZW50LgotCi0gIE9uY2UgeW91J3ZlIHNlbGVjdGVkIDx3aGljaD4gYXJ0aWZhY3RzIHNob3VsZCBiZSBwcm9jZXNzZWQgZm9yIGEgcGFydGljdWxhcgotICBtb2R1bGUsIHlvdSBoYXZlIHNldmVyYWwgb3B0aW9ucyBmb3IgPGhvdz4gdG8gcHJvY2VzcyB0aGVtLiBJbiBpdHMgc2ltcGxlc3QKLSAgZm9ybSwgdGhlIDw8PGJpbmFyaWVzPj4+IHNlY3Rpb24gb2YgYSA8PDxtb2R1bGVTZXQ+Pj4gaGFzIG1hbnkgb2YgdGhlIHNhbWUKLSAgY2hhcmFjdGVyaXN0aWNzIGFzIGEgPDw8ZGVwZW5kZW5jeVNldD4+Pi4gVGhhdCBpcywgeW91IGhhdmUgdGhlIG9wdGlvbiB0bwotICBzcGVjaWZ5IGFuIDw8PG91dHB1dERpcmVjdG9yeT4+PiwgYW5kIHlvdSBjYW4gY2hvb3NlIHdoZXRoZXIgdG8gdW5wYWNrIHRoZQotICBhcnRpZmFjdChzKSAtIHRoZSBkZWZhdWx0IGFjdGlvbiB3aWxsIHVucGFjayB0aGVtLgotCi0qKiBQcm9jZXNzaW5nIGEgTW9kdWxlJ3MgQXR0YWNobWVudCBBcnRpZmFjdHMKLQotICBTb21ldGltZXMgaXQncyBpbXBvcnRhbnQgdG8gaGF2ZSB0aGUgb3B0aW9uIHRvIGFkZCBhcnRpZmFjdHMgZnJvbSBhIG1vZHVsZQotICB0aGF0IGFyZSBub3QgdGhlIG1haW4gcHJvamVjdCBhcnRpZmFjdC4gU3VjaCBhcnRpZmFjdHMgbWlnaHQgaW5jbHVkZSBqYXZhZG9jcywKLSAgcHJvamVjdCBzb3VyY2VzLCBvciBldmVuIG90aGVyIGFzc2VtYmx5IGFydGlmYWN0cy4KLQotKioqIEV4YW1wbGU6IEluY2x1ZGluZyBvdGhlciBhc3NlbWJsaWVzIHdpdGhpbiB0aGUgY3VycmVudCBhc3NlbWJseQotCi0gIFN1cHBvc2Ugd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHByb2plY3Qgc3RydWN0dXJlOgotCi0tLS0KLSsgYXBwbGljYXRpb24KLSAgfAotICArIGFwcC1kYgotICB8Ci0gICsgYXBwLXdlYgotICB8Ci0gICsgYXBwLXNpdGUKLS0tLQotCi0gIEZ1cnRoZXIsIHN1cHBvc2UgdGhhdCB0aGUgYXNzZW1ibHkgcGx1Z2luIGlzIGN1cnJlbnRseSBleGVjdXRpbmcgYXQgdGhlCi0gIDw8PGFwcGxpY2F0aW9uPj4+IGxldmVsLCBidXQgdGhhdCBhbm90aGVyIGFzc2VtYmx5IGFyY2hpdmUgaGFzIGJlZW4gY3JlYXRlZAotICBwcmV2aW91c2x5IGZvciB0aGUgPDw8YXBwLXNpdGU+Pj4gcHJvamVjdC4gVGhpcyBvdGhlciBhc3NlbWJseSBhcmNoaXZlIGlzIGEKLSAgemlwIGZpbGUgY29udGFpbmluZyB0aGUgcHJvamVjdCB3ZWJzaXRlLiBXZSB3YW50IHRvIGluY2x1ZGUgYSBjb3B5IG9mIHRoaXMKLSAgd2Vic2l0ZSBpbiB0aGUgYXBwbGljYXRpb24gZGlzdHJpYnV0aW9uIGFzc2VtYmx5LCB3aGljaCB3ZSBhcmUgY3JlYXRpbmcgbm93LgotCi0gIEZpbmFsbHksIHN1cHBvc2UgdGhhdCB0aGUgd2Vic2l0ZS1hdHRhY2htZW50IGhhcyBhIGNsYXNzaWZpZXIgb2YgPDw8c2l0ZT4+PgotICB0YWtlbiBmcm9tIHRoZSBhc3NlbWJseUlkLgotCi0gIFNpbmNlIHRoZSB6aXBmaWxlIGNvbnRhaW5pbmcgdGhlIHdlYnNpdGUgcHJvZHVjZWQgYnkgPDw8YXBwLXNpdGU+Pj4gaXMgYW4KLSAgYXR0YWNoZWQgYXJ0aWZhY3QgaW4gdGhhdCBtb2R1bGUsIHdlJ2xsIG5lZWQgdG8gZXh0cmFjdCB0aGF0IGFydGlmYWN0IGluc3RlYWQKLSAgb2YgdGhlIG1haW4gcHJvamVjdCBhcnRpZmFjdC4KLQotLS0tCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgWy4uLl0KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+KjphcHAtc2l0ZTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8YmluYXJpZXM+Ci0gICAgICAgIDxhdHRhY2htZW50Q2xhc3NpZmllcj5zaXRlPC9hdHRhY2htZW50Q2xhc3NpZmllcj4KLSAgICAgICAgPG91dHB1dERpcmVjdG9yeT5kb2M8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz53ZWJzaXRlLiR7bW9kdWxlLmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KLSAgICAgIDwvYmluYXJpZXM+Ci0gICAgPC9tb2R1bGVTZXQ+Ci0gICAgWy4uLl0KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KLS0tLQotCi0qKiBFeGNsdWRpbmcgTW9kdWxlIERlcGVuZGVuY2llcwotCi0gIEp1c3QgbGlrZSBhbnkgYmluYXJ5LCBtb2R1bGVzIHVzdWFsbHkgaGF2ZSBydW50aW1lIGRlcGVuZGVuY2llcywgd2l0aG91dCB3aGljaAotICB0aGV5IHdpbGwgc2ltcGx5IGZhaWwgdG8gZXhlY3V0ZS4gQnkgZGVmYXVsdCwgbW9kdWxlIGRlcGVuZGVuY2llcyBhcmUgaW5jbHVkZWQKLSAgd2hlbiB0aGUgbW9kdWxlIGl0c2VsZiBpcyBpbmNsdWRlZC4gSG93ZXZlciwgYXMgd2Ugc2F3IGluIHRoZSBhYm92ZSBleGFtcGxlLAotICB0aGVyZSBhcmUgdGltZXMgd2hlbiB0aGlzIG1heSBub3QgYmUgYXBwcm9wcmlhdGUuCi0KLSAgSW4gdGhlIGFib3ZlIGV4YW1wbGUsIHRoZSBtb2R1bGUgYmluYXJ5IGluY2x1ZGVkIHdhcyBhbiBhc3NlbWJseSBhcnRpZmFjdCB0aGF0Ci0gIGNvbnRhaW5lZCB0aGUgd2Vic2l0ZSBmb3IgdGhlIGFwcGxpY2F0aW9uLiBPdGhlciBhc3NlbWJsaWVzIG1pZ2h0IGVtYm9keSBhCi0gIGNvbXBsZXRlbHkgc2VsZi1jb250YWluZWQgdmVyc2lvbiBvZiB0aGUgbW9kdWxlJ3MgYmluYXJpZXMsIHdpdGggYWxsCi0gIGRlcGVuZGVuY3kgY2xhc3NlcyB1bnBhY2tlZCBhbmQgaW5saW5lZCB3aXRoaW4gdGhlIGFyY2hpdmUuCi0KLSAgSW4gc2hvcnQsIHNvbWV0aW1lcyB3ZSB3YW50IHRvIHR1cm4gb2ZmIGF1dG9tYXRpYyBkZXBlbmRlbmN5IGluY2x1c2lvbi4gV2UgY2FuCi0gIGFjaGlldmUgdGhpcyBieSBzZXR0aW5nIHRoZSA8PDxpbmNsdWRlRGVwZW5kZW5jaWVzPj4+IGZsYWcgdG8gPDw8ZmFsc2U+Pj4uCi0KLSoqKiBFeGFtcGxlOiBJbmNsdWRpbmcgYSA8PDxqYXItd2l0aC1kZXBlbmRlbmNpZXM+Pj4gbW9kdWxlIGFzc2VtYmx5Ci0KLSAgU3VwcG9zZSB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvamVjdCBzdHJ1Y3R1cmU6Ci0KLS0tLQotKyBhcHBsaWNhdGlvbgotICB8Ci0gICsgYXBwLWRiCi0gIHwKLSAgKyBhcHAtd2ViCi0tLS0KLQotICBGdXJ0aGVyLCBzdXBwb3NlIHRoYXQgdGhlIGFzc2VtYmx5IHBsdWdpbiBpcyBjdXJyZW50bHkgZXhlY3V0aW5nIGF0IHRoZQotICA8PDxhcHAtd2ViPj4+IGxldmVsLCBidXQgdGhhdCBhbm90aGVyIGFzc2VtYmx5IGFyY2hpdmUgaGFzIGJlZW4gY3JlYXRlZAotICBwcmV2aW91c2x5IGZvciB0aGUgPDw8YXBwLWRiPj4+IHByb2plY3QgdXNpbmcgdGhlIGJ1aWx0LWluCi0gIDw8PGphci13aXRoLWRlcGVuZGVuY2llcz4+PiBhc3NlbWJseSBkZXNjcmlwdG9yLiBUaGlzIGFzc2VtYmx5IGFyY2hpdmUKLSAgY29udGFpbnMgYWxsIG9mIHRoZSBtb2R1bGUgZGVwZW5kZW5jaWVzLCBzbyBpdCdzIG5vdCBuZWNlc3NhcnkgdG8gaW5jbHVkZSB0aGlzCi0gIG1vZHVsZSdzIGRlcGVuZGVuY2llcyBpbiB0aGUgY3VycmVudCBhc3NlbWJseS4KLQotLS0tCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgWy4uLl0KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+KjphcHAtZGI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPGJpbmFyaWVzPgotICAgICAgICA8YXR0YWNobWVudENsYXNzaWZpZXI+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9hdHRhY2htZW50Q2xhc3NpZmllcj4KLSAgICAgICAgPG91dHB1dERpcmVjdG9yeT5saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPG91dHB1dEZpbGVOYW1lTWFwcGluZz4ke21vZHVsZS5hcnRpZmFjdElkfS0ke21vZHVsZS52ZXJzaW9ufS0ke21vZHVsZS5jbGFzc2lmaWVyfS4ke21vZHVsZS5leHRlbnNpb259PC9vdXRwdXRGaWxlTmFtZU1hcHBpbmc+Ci0gICAgICA8L2JpbmFyaWVzPgotICAgIDwvbW9kdWxlU2V0PgotICAgIFsuLi5dCi0gIDwvbW9kdWxlU2V0cz4KLTwvYXNzZW1ibHk+Ci0tLS0KLQotICA8Tk9URTogVGhlIDw8PGJpbmFyaWVzPj4+IHNlY3Rpb24gc3RpbGwgYWNjb21tb2RhdGVzIGRpcmVjdCA8PDxcPGluY2x1ZGVzL1w+Pj4+Ci0gIGFuZCA8PDxcPGV4Y2x1ZGVzL1w+Pj4+IHN1YnNlY3Rpb25zLCBmb3Igc3BlY2lmeWluZyB3aGljaCBtb2R1bGUtZGVwZW5kZW5jaWVzCi0gIHRvIGluY2x1ZGUgaW4gdGhlIGFzc2VtYmx5LiBIb3dldmVyLCB0aGVzZSBhcmUgZGVwcmVjYXRlZCwgYW5kIG9ubHkgcHJvdmlkZWQKLSAgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZGVzY3JpcHRvci1yZWZzLmFwdC52bSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2Rlc2NyaXB0b3ItcmVmcy5hcHQudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYzVmZjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZGVzY3JpcHRvci1yZWZzLmFwdC52bQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLSAtLS0tLS0KLSBQcmVkZWZpbmVkIEFzc2VtYmx5IERlc2NyaXB0b3JzCi0gLS0tLS0tCi0gSm9obm55IFIuIFJ1aXogSUlJIDxqcnVpekBleGlzdC5jb20+Ci0gRWR3aW4gUHVuemFsYW4KLSBKb2huIENhc2V5Ci0gLS0tLS0tCi0gMjAxMS0wMi0wNwotIC0tLS0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi1QcmUtZGVmaW5lZCBEZXNjcmlwdG9yIEZpbGVzCi0KLSAgQXMgb2YgdmVyc2lvbiAyLjIsIHRoZXJlIGFyZSBmb3VyIHByZWRlZmluZWQgZGVzY3JpcHRvciBmb3JtYXRzIGF2YWlsYWJsZQotICBmb3IgcmV1c2UsIHBhY2thZ2VkIHdpdGhpbiB0aGUgQXNzZW1ibHkgUGx1Z2luLCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCB0aHJlZS4KLSAgVGhlaXIgZGVzY3JpcHRvcklkcyBhcmU6Ci0gIAotJXt0b2N8ZnJvbURlcHRoPTJ8dG9EZXB0aD0yfQotCi0qIGJpbgotCi0gIFVzZSA8PDxiaW4+Pj4gYXMgdGhlIDw8PGRlc2NyaXB0b3JSZWY+Pj4gb2YgeW91ciBhc3NlbWJseS1wbHVnaW4gY29uZmlndXJhdGlvbgotICBpbiBvcmRlciB0byBjcmVhdGUgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIGFyY2hpdmUgb2YgeW91ciBwcm9qZWN0LgotICBUaGlzIGJ1aWx0LWluIGRlc2NyaXB0b3IgcHJvZHVjZXMgYW4gYXNzZW1ibHkgd2l0aCB0aGUgY2xhc3NpZmllciA8PDxiaW4+Pj4KLSAgaW4gdGhyZWUgYXJjaGl2ZSBmb3JtYXRzOiB0YXIuZ3osIHRhci5iejIsIGFuZCB6aXAuCi0KLSAgVGhlIGFzc2VtYmxlZCBhcmNoaXZlIGNvbnRhaW5zIHRoZSBiaW5hcnkgSkFSIHByb2R1Y2VkIGJ5IHJ1bm5pbmcKLSAgPDw8bXZuIHBhY2thZ2U+Pj4gcGx1cyBhbnkgUkVBRE1FLCBMSUNFTlNFLCBhbmQgTk9USUNFIGZpbGVzIGF2YWlsYWJsZSBpbiB0aGUKLSAgcHJvamVjdCByb290IGRpcmVjdG9yeS4KLQotICBCZWxvdyBpcyB0aGUgPDw8YmluPj4+IGRlc2NyaXB0b3IgZm9ybWF0OgotCi0le3NuaXBwZXR8aWQ9YmlufGZpbGU9dGFyZ2V0L2NsYXNzZXMvYXNzZW1ibGllcy9iaW4ueG1sfQotCi0qIGphci13aXRoLWRlcGVuZGVuY2llcwotCi0gIFVzZSA8PDxqYXItd2l0aC1kZXBlbmRlbmNpZXM+Pj4gYXMgdGhlIDw8PGRlc2NyaXB0b3JSZWY+Pj4gb2YgeW91cgotICBhc3NlbWJseS1wbHVnaW4gY29uZmlndXJhdGlvbiBpbiBvcmRlciB0byBjcmVhdGUgYSBKQVIgd2hpY2ggY29udGFpbnMKLSAgdGhlIGJpbmFyeSBvdXRwdXQgb2YgeW91ciBwcm9qZWN0LCBhbG9uZyBpdHMgdGhlIHVucGFja2VkIGRlcGVuZGVuY2llcy4KLSAgVGhpcyBidWlsdC1pbiBkZXNjcmlwdG9yIHByb2R1Y2VzIGFuIGFzc2VtYmx5IHdpdGggdGhlIGNsYXNzaWZpZXIKLSAgPDw8amFyLXdpdGgtZGVwZW5kZW5jaWVzPj4+IHVzaW5nIHRoZSBKQVIgYXJjaGl2ZSBmb3JtYXQuCi0KLSAgTm90ZSB0aGF0IDw8PGphci13aXRoLWRlcGVuZGVuY2llcz4+PiBwcm92aWRlcyBvbmx5IGJhc2ljIHN1cHBvcnQgZm9yIHViZXItamFycy4gCi0gIEZvciBtb3JlIGNvbnRyb2wsIHVzZSB0aGUKLSAge3t7aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1zaGFkZS1wbHVnaW4vfSBNYXZlbiBTaGFkZSBQbHVnaW59fS4KLQotICBCZWxvdyBpcyB0aGUgPDw8amFyLXdpdGgtZGVwZW5kZW5jaWVzPj4+IGRlc2NyaXB0b3IgZm9ybWF0OgotCi0le3NuaXBwZXR8aWQ9amFyLXdpdGgtZGVwZW5kZW5jaWVzfGZpbGU9dGFyZ2V0L2NsYXNzZXMvYXNzZW1ibGllcy9qYXItd2l0aC1kZXBlbmRlbmNpZXMueG1sfQotCi0qIHNyYwotCi0gIFVzZSA8PDxzcmM+Pj4gYXMgdGhlIDw8PGRlc2NyaXB0b3JSZWY+Pj4gaW4geW91ciBhc3NlbWJseS1wbHVnaW4gY29uZmlndXJhdGlvbgotICB0byBjcmVhdGUgc291cmNlIGFyY2hpdmVzIGZvciB5b3VyIHByb2plY3QuICBUaGUgYXJjaGl2ZSB3aWxsIGNvbnRhaW4gdGhlCi0gIGNvbnRlbnRzIG9mIHlvdXIgcHJvamVjdCdzIDw8PC9zcmM+Pj4gZGlyZWN0b3J5IHN0cnVjdHVyZSwgZm9yIHJlZmVyZW5jZSBieQotICB5b3VyIHVzZXJzLiBUaGUgPDw8c3JjPj4+IGRlc2NyaXB0b3JJZCBwcm9kdWNlcyBhbiBhc3NlbWJseSBhcmNoaXZlIHdpdGggdGhlCi0gIGNsYXNzaWZpZXIgPDw8c3JjPj4+IGluIHRocmVlIGZvcm1hdHM6IHRhci5neiwgdGFyLmJ6MiwgYW5kIHppcC4KLQotICBCZWxvdyBpcyB0aGUgPDw8c3JjPj4+IGRlc2NyaXB0b3IgZm9ybWF0OgotCi0le3NuaXBwZXR8aWQ9c3JjfGZpbGU9dGFyZ2V0L2NsYXNzZXMvYXNzZW1ibGllcy9zcmMueG1sfQotCi0qIHByb2plY3QKLQotICAoU2luY2UgMi4yKQotCi0gIFVzaW5nIHRoZSA8PDxwcm9qZWN0Pj4+IDw8PFw8ZGVzY3JpcHRvclJlZlw+Pj4+IGluIHlvdXIgQXNzZW1ibHkgUGx1Z2luCi0gIGNvbmZpZ3VyYXRpb24gd2lsbCBwcm9kdWNlIGFuIGFzc2VtYmx5IGNvbnRhaW5pbmcgeW91ciBlbnRpcmUgcHJvamVjdCwgbWludXMKLSAgYW55IGJ1aWxkIG91dHB1dCB0aGF0IGxhbmRzIGluIHRoZSA8PDwvdGFyZ2V0Pj4+IGRpcmVjdG9yeS4gVGhlIHJlc3VsdGluZwotICBhc3NlbWJseSBzaG91bGQgYWxsb3cgeW91ciB1c2VycyB0byBidWlsZCB5b3VyIHByb2plY3QgdXNpbmcgTWF2ZW4sIEFudCwgb3IKLSAgd2hhdGV2ZXIgYnVpbGQgc3lzdGVtIHlvdSBoYXZlIGNvbmZpZ3VyZWQgaW4geW91ciBwcm9qZWN0J3Mgbm9ybWFsIFNDTSB3b3JraW5nCi0gIGRpcmVjdG9yeS4gSXQgcHJvZHVjZXMgYXNzZW1ibGllcyB3aXRoIHRoZSBjbGFzc2lmaWVyIDw8PHByb2plY3Q+Pj4gaW4KLSAgdGhyZWUgYXJjaGl2ZSBmb3JtYXRzOiB0YXIuZ3osIHRhci5iejIsIGFuZCB6aXAuCi0KLSAgVGhlIGZvbGxvd2luZyBpcyB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciBmb3IgdGhlIDw8PHByb2plY3Q+Pj4gZGVzY3JpcHRvclJlZjoKLQotJXtzbmlwcGV0fGlkPXByb2plY3R8ZmlsZT10YXJnZXQvY2xhc3Nlcy9hc3NlbWJsaWVzL3Byb2plY3QueG1sfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvaW5kZXguYXB0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Nzg5ZTNkLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLSAgLS0tCi0gIEV4YW1wbGVzCi0gIC0tLQotICBKb2huIENhc2V5Ci0gIC0tLQotICAyMDA4LTExLTAzCi0gIC0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi1FeGFtcGxlcwotCi0qIFRhYmxlIG9mIENvbnRlbnRzCi0KLSAgQmVsb3csIHlvdSB3aWxsIHNlZSBhIHNlcmllcyBvZiBleGFtcGxlcyBzaG93aW5nIGhvdyB0byB1c2UgdGhlIEFzc2VtYmx5Ci0gIFBsdWdpbiBpbiB2YXJpb3VzIGNvbnRleHRzLgotCi0gICoge3t7Li9zaW5nbGUvaW5kZXguaHRtbH1Xb3JraW5nIHdpdGggU2luZ2xlIFByb2plY3RzfX0KLQotICAgICoge3t7Li9zaW5nbGUvZmlsdGVyaW5nLXNvbWUtZGlzdHJpYnV0aW9uLWZpbGVzLmh0bWx9RmlsdGVyaW5nIFNvbWUgRGlzdHJpYnV0aW9uIEZpbGVzfX0KLQotICAgICoge3t7Li9zaW5nbGUvaW5jbHVkaW5nLWFuZC1leGNsdWRpbmctYXJ0aWZhY3RzLmh0bWx9SW5jbHVkaW5nL0V4Y2x1ZGluZyBBcnRpZmFjdHN9fQotCi0gICAgKiB7e3suL3NpbmdsZS91c2luZy1jb21wb25lbnRzLmh0bWx9VXNpbmcgQ29tcG9uZW50IERlc2NyaXB0b3JzfX0KLQotICAgICoge3t7Li9zaW5nbGUvdXNpbmctcmVwb3NpdG9yaWVzLmh0bWx9VXNpbmcgUmVwb3NpdG9yaWVzfX0KLQotICAgIFtdCi0KLSAgKiB7e3suL211bHRpbW9kdWxlL2luZGV4Lmh0bWx9V29ya2luZyB3aXRoIE11bHRpLU1vZHVsZSBQcm9qZWN0c319Ci0KLSAgICAqIHt7ey4vbXVsdGltb2R1bGUvbW9kdWxlLXNvdXJjZS1pbmNsdXNpb24tc2ltcGxlLmh0bWx9QWRkaW5nIE1vZHVsZSBTb3VyY2VzIHRvIHRoZSBBc3NlbWJseX19Ci0KLSAgICAqIHt7ey4vbXVsdGltb2R1bGUvbW9kdWxlLWJpbmFyeS1pbmNsdXNpb24tc2ltcGxlLmh0bWx9QWRkaW5nIE1vZHVsZSBCaW5hcmllcyB0byB0aGUgQXNzZW1ibHl9fQotCi0gICAgW10KLQotICAqIHt7ey4vc2hhcmluZy1kZXNjcmlwdG9ycy5odG1sfVNoYXJpbmcgQXNzZW1ibHkgRGVzY3JpcHRvcnN9fQotCi0gIFtdCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2FwdC9leGFtcGxlcy9tdWx0aW1vZHVsZS9pbmRleC5hcHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2FwdC9leGFtcGxlcy9tdWx0aW1vZHVsZS9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExOWQwMjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvbXVsdGltb2R1bGUvaW5kZXguYXB0CisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotICAtLS0KLSAgTXVsdGktTW9kdWxlIEV4YW1wbGVzCi0gIC0tLQotICBFZHdpbiBQdW56YWxhbgotICAtLS0KLSAgMjQtSnVseS0yMDA2Ci0gIC0tLQotCi0KLX5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLX5+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotfn4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLX5+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLX5+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLX5+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLX5+IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLX5+Ci1+fiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotfn4KLX5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLX5+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi1+fiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLX5+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotfn4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotfn4gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLX5+IE5PVEU6IEZvciBoZWxwIHdpdGggdGhlIHN5bnRheCBvZiB0aGlzIGZpbGUsIHNlZToKLX5+IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2RveGlhL3JlZmVyZW5jZXMvYXB0LWZvcm1hdC5odG1sCi0KLU11bHRpLU1vZHVsZSBFeGFtcGxlcwotCi0gIE11bHRpbW9kdWxlIFByb2plY3RzIHVzZSBcPG1vZHVsZVNldHNcPiBpbiB0aGVpciBhc3NlbWJsaWVzLgotCi0gIFRoZSBleGFtcGxlcyBiZWxvdyBtYXkgYmUgYWJsZSB0byBoZWxwIHlvdSB3aGVuIGNyZWF0aW5nIGFzc2VtYmxpZXMgZm9yIHlvdXIKLSAgbXVsdGltb2R1bGUgcHJvamVjdC4KLQotICAgICoge3t7Li9tb2R1bGUtc291cmNlLWluY2x1c2lvbi1zaW1wbGUuaHRtbH1BZGRpbmcgTW9kdWxlIFNvdXJjZXMgdG8gdGhlIEFzc2VtYmx5fX0KLQotICAgICoge3t7Li9tb2R1bGUtYmluYXJ5LWluY2x1c2lvbi1zaW1wbGUuaHRtbH1BZGRpbmcgTW9kdWxlIEJpbmFyaWVzIHRvIHRoZSBBc3NlbWJseX19Ci0KLSAgICBbXQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvbXVsdGltb2R1bGUvbW9kdWxlLWJpbmFyeS1pbmNsdXNpb24tc2ltcGxlLmFwdC52bSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL211bHRpbW9kdWxlL21vZHVsZS1iaW5hcnktaW5jbHVzaW9uLXNpbXBsZS5hcHQudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Mzc1ODkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvbXVsdGltb2R1bGUvbW9kdWxlLWJpbmFyeS1pbmNsdXNpb24tc2ltcGxlLmFwdC52bQorKysgL2Rldi9udWxsCkBAIC0xLDI0NCArMCwwIEBACi0gLS0tLS0tCi0gIEluY2x1ZGluZyBNb2R1bGUgQmluYXJpZXMKLSAtLS0tLS0KLSAgSm9obiBDYXNleQotIC0tLS0tLQotICAwNS1NYXktMjAwNgotIC0tLS0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi1JbmNsdWRpbmcgTW9kdWxlIEJpbmFyaWVzCi0KLSogV2FybmluZwotCi0gIDw8V2FybmluZzo+PiBVc2luZyB0aGUgPDw8YmluYXJpZXM+Pj4gc2VjdGlvbiBvZiBhIDw8PG1vZHVsZVNldD4+PiBkZWZpbml0aW9uCi0gIGludm9sdmVzIHNvbWUgdHJpY2t5IGNvbnNpZGVyYXRpb25zIHRoYXQgYXJlIGEgcmVzdWx0IG9mIHRoZSB3YXkgTWF2ZW4KLSAgc29ydHMgYW5kIGV4ZWN1dGVzIHByb2plY3QgYnVpbGRzIHdpdGhpbiBhIG11bHRpbW9kdWxlIGNvbnRleHQuIFBsZWFzZQotICByZWFkIHt7ey4uLy4uL2ZhcS5odG1sI21vZHVsZS1iaW5hcmllc310aGlzIEZBUSBlbnRyeX19IGlmIHlvdSBkZWNpZGUgdG8gdXNlIHRoZW0uCi0gIAotICA8PE5PVEU6Pj4gVGhlIG5ldyAoc2luY2UgMi4yKSA8PDx1c2VBbGxSZWFjdG9yUHJvamVjdHM+Pj4gZmxhZyBpbiB0aGUgPDw8bW9kdWxlU2V0Pj4+IHNlY3Rpb24KLSAgYWxsb3dzIHlvdSB0byBjb25zdW1lIG1vZHVsZSBiaW5hcmllcyBmcm9tIGNoaWxkIG1vZHVsZXMgaW4gYSBtdWx0aW1vZHVsZSBidWlsZC4gVGhpcwotICBpcyBhbiBpbXBvcnRhbnQgdG8gcmVzb2x2ZSB0aGUgY29uZmxpY3QgYmV0d2VlbiBNYXZlbidzIGJ1aWxkIG9yZGVyaW5nIGFuZCB0aGUgb2xkCi0gIGFwcHJvYWNoIHRvIG1vZHVsZSBiaW5hcmllcywgd2hlcmUgdGhlIGFzc2VtYmx5IHdhcyBidWlsZCBmcm9tIHRoZSBwYXJlbnQgUE9NLgotICBQbGVhc2UgcmVhZCB0aGUgRkFRIGVudHJ5IGFib3ZlIGZvciBtb3JlIGluZm9ybWF0aW9uLCBhbmQgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiAKLSAgYmVsb3cgKGNhcmVmdWxseSEpIHRvIHNlZSB0aGUgbmV3IGFwcHJvYWNoIGluIGFjdGlvbi4KLSAgCi0qIEludHJvZHVjdGlvbgotCi0gIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byBjcmVhdGUgYW4gYXNzZW1ibHkgdXNpbmcgdGhlIHBhcmVudCBQT00gb2YgYQotICBtdWx0aW1vZHVsZSBidWlsZC4gQXQgdGltZXMsIHlvdSBtYXkgd2FudCB0byBlbnN1cmUgdGhhdCB0aGlzIGFzc2VtYmx5IGFsc28KLSAgaW5jbHVkZXMgb25lIG9yIG1vcmUgb2YgdGhlIG1vZHVsZSBiaW5hcmllcy4KLQotICBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbmNsdWRlIHRoZSBhcnRpZmFjdCBhbmQgZGVwZW5kZW5jaWVzIG9mIGEKLSAgbW9kdWxlLCB1bmRlciB0aGUgZGlyZWN0b3J5IDw8PG1vZHVsZXMvXDxtb2R1bGUtbmFtZVw+Pj4+LgotCi0qIFRoZSBBc3NlbWJseSBEZXNjcmlwdG9yCi0KLSAgRmlyc3QsIGxldCdzIHdyaXRlIGFuIGFzc2VtYmx5IGRlc2NyaXB0b3IgdG8gY3JlYXRlIHRoaXMgYXNzZW1ibHkuIEZvciB0aGUKLSAgc2FrZSBvZiBjbGFyaXR5LCB0aGlzIGRlc2NyaXB0b3Igd2lsbCBiZSBhcyBzaW1wbGUgYXMgcG9zc2libGUsIG9ubHkKLSAgZGVtb25zdHJhdGluZyB0aGUgZmVhdHVyZXMgZGVzY3JpYmVkIGJ5IHRoaXMgZXhhbXBsZS4KLQotKy0tLSsKLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktJHttZG9WZXJzaW9ufS54c2QiPgotICA8aWQ+YmluPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5kaXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgotICA8bW9kdWxlU2V0cz4KLSAgICA8bW9kdWxlU2V0PgotICAgIAotICAgICAgPCEtLSBFbmFibGUgYWNjZXNzIHRvIGFsbCBwcm9qZWN0cyBpbiB0aGUgY3VycmVudCBtdWx0aW1vZHVsZSBidWlsZCEgLS0+Ci0gICAgICA8dXNlQWxsUmVhY3RvclByb2plY3RzPnRydWU8L3VzZUFsbFJlYWN0b3JQcm9qZWN0cz4KLSAgICAgIAotICAgICAgPCEtLSBOb3csIHNlbGVjdCB3aGljaCBwcm9qZWN0cyB0byBpbmNsdWRlIGluIHRoaXMgbW9kdWxlLXNldC4gLS0+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPm9yZy50ZXN0OmNoaWxkMTwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8YmluYXJpZXM+Ci0gICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+bW9kdWxlcy8ke3Byb2plY3QuYXJ0aWZhY3RJZH08L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgPHVucGFjaz5mYWxzZTwvdW5wYWNrPgotICAgICAgPC9iaW5hcmllcz4KLSAgICA8L21vZHVsZVNldD4KLSAgPC9tb2R1bGVTZXRzPgotPC9hc3NlbWJseT4KLSstLS0rCi0KLSAgVGhpcyBkZXNjcmlwdG9yIHN0YXRlcyB0aGF0IHRoZSBhc3NlbWJseSBpZCBzaG91bGQgYmUgPDw8YmluPj4+LCB0aGF0IHRoZQotICBvdXRwdXQgZm9ybWF0IGlzIGEgZGlyZWN0b3J5LCBhbmQgdGhhdCB0aGUgY29udGVudHMgb2YgdGhlIGFzc2VtYmx5IHNob3VsZAotICA8PG5vdD4+IGJlIGNvbnRhaW5lZCB3aXRoaW4gYSBkaXJlY3RvcnkgbmFtZWQgYWZ0ZXIgdGhlIGZpbmFsTmFtZSBvZiB0aGUKLSAgdG9wLWxldmVsIHByb2plY3QuCi0KLSAgRnVydGhlcm1vcmUsIGl0IHN0YXRlcyB0aGF0IHdlIHdpc2ggdG8gaW5jbHVkZSB0aGUgYXJ0aWZhY3QgZmlsZXMgZm9yIHRoZSBtb2R1bGUKLSAgd2l0aCBhIGdyb3VwSWQgb2YgPDw8b3JnLnRlc3Q+Pj4gYW5kIGFuIGFydGlmYWN0SWQgb2YgPDw8Y2hpbGQxPj4+LCBhbG9uZyB3aXRoCi0gIGl0cyBkZXBlbmRlbmN5IGFydGlmYWN0cy4gVGhlc2UgYXJ0aWZhY3RzIHNob3VsZCBiZSBjb250YWluZWQgd2l0aGluIHRoZQotICBkaXJlY3Rvcnkgc3RydWN0dXJlIDw8PG1vZHVsZXMvY2hpbGQxPj4+IGZvciB0aGlzIG1vZHVsZSwgc2luY2UgdGhlCi0gIG91dHB1dERpcmVjdG9yeSBleHByZXNzaW9uIHdpbGwgYmUgaW50ZXJwb2xhdGVkIG9uIGEgbW9kdWxlLWJ5LW1vZHVsZSBiYXNpcy4KLSAgCi0gIDw8RmluYWxseT4+LCBub3RpY2UgdGhlIDw8bmV3Pj4gPDw8dXNlQWxsUmVhY3RvclByb2plY3RzPj4+IGZsYWcuIFRoaXMgZW5hYmxlcwotICBhY2Nlc3MgdG8gYWxsIHByb2plY3RzIGluIHRoZSBjdXJyZW50IHJlYWN0b3IgKG11bHRpbW9kdWxlIGJ1aWxkKSwgZXZlbiBmcm9tIAotICBhIGNoaWxkIG1vZHVsZS4gVXNpbmcgdGhpcyBmbGFnLCBpdCdzIG5vdyBwb3NzaWJsZSB0byB1c2UgYSBjaGlsZCBtb2R1bGUgLSBzb3J0ZWQKLSAgdG8gdGhlIGVuZCBvZiB0aGUgbXVsdGltb2R1bGUgYnVpbGQgcHJvY2VzcyB1c2luZyBhcHByb3ByaWF0ZSBkZXBlbmRlbmN5IAotICBkZWNsYXJhdGlvbnMgLSB0byBnZW5lcmF0ZSBhbiBhc3NlbWJseSBjb250YWluaW5nIG1vZHVsZSBiaW5hcmllcy4KLQotKiBUaGUgUE9NCi0KLSAgTm93LCBsZXQncyByZXZpZXcgdGhlIFBPTSBjb25maWd1cmF0aW9uIG5lY2Vzc2FyeSB0byBlbmFibGUgdGhlIGJ1aWxkaW5nIG9mCi0gIHRoaXMgYXNzZW1ibHkgdmlhIHRoZSA8PDxhc3NlbWJseTpzaW5nbGU+Pj4gZ29hbC4gRmlyc3QsIGxldCdzIGxvb2sgYXQgdGhlIHBhcmVudCBQT006Ci0KLSstLS0rCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cGFyZW50PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8bmFtZT5QYXJlbnQ8L25hbWU+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5jaGlsZDE8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMjwvbW9kdWxlPgotICAgIDxtb2R1bGU+Y2hpbGQzPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5kaXN0cmlidXRpb248L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvcnM+Ci0gICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgPC9wbHVnaW5zPgotICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLSstLS0rCi0KLSAgPDxOT1RFOj4+IFRoZSBsYXN0IG1vZHVsZSAtIDw8PGRpc3RyaWJ1dGlvbj4+PiAtIGlzIHRoZSBjaGlsZCBpbiB3aGljaCB0aGUgYXNzZW1ibHkgd2lsbCBiZSBjcmVhdGVkLgotICAKLSAgVGhhdCBQT00gbG9va3MgbGlrZSB0aGlzOgotICAKLSstLS0rCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAKLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcudGVzdDwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLSAgCi0gIDxhcnRpZmFjdElkPmRpc3RyaWJ1dGlvbjwvYXJ0aWZhY3RJZD4KLQotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotCi0gIDxuYW1lPkRpc3RyaWJ1dGlvbjwvbmFtZT4KLSAgCi0gIDwhLS0gTk9URTogVGhlc2UgZGVwZW5kZW5jeSBkZWNsYXJhdGlvbnMgYXJlIG9ubHkgcmVxdWlyZWQgdG8gc29ydCB0aGlzIHByb2plY3QgdG8gdGhlIAotICAgICAgIGVuZCBvZiB0aGUgbGluZSBpbiB0aGUgbXVsdGltb2R1bGUgYnVpbGQuIAotICAgICAgIAotICAgICAgIFNpbmNlIHdlIG9ubHkgaW5jbHVkZSB0aGUgY2hpbGQxIG1vZHVsZSBpbiBvdXIgYXNzZW1ibHksIHdlIG9ubHkgbmVlZCB0byBlbnN1cmUgdGhpcwotICAgICAgIGRpc3RyaWJ1dGlvbiBwcm9qZWN0IGJ1aWxkcyBBRlRFUiB0aGF0IG9uZS4uLgotICAtLT4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy50ZXN0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y2hpbGQxPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmRpc3Ryby1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9iaW4ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci08L3Byb2plY3Q+Ci0rLS0tKwotCi0gIFRoaXMgUE9NIGRpcmVjdHMgdGhlIEFzc2VtYmx5IFBsdWdpbiB0byBleGVjdXRlIHRoZSA8PDxzaW5nbGU+Pj4gZ29hbCB3aGVuIHRoZSBidWlsZCByZWFjaGVzIHRoZSAKLSAgPDw8cGFja2FnZT4+PiBwaGFzZSwgYW5kIHRlbGxzIGl0IHRvIHVzZSB0aGUgPDw8YmluLnhtbD4+PiBhc3NlbWJseSBkZXNjcmlwdG9yIHdoZW4gZXhlY3V0aW5nLgotCi0qIEV4ZWN1dGUhCi0KLSAgVG8gYnVpbGQgdGhlIGFzc2VtYmx5LCB3ZSBpc3N1ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6Ci0KLSstLS0rCi1tdm4gY2xlYW4gcGFja2FnZQotKy0tLSsKLQotICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgKG5vcm1hbGx5LCA8PDx0YXJnZXQ+Pj4pLCBpcwotICByZW1vdmVkIGJlZm9yZSBidWlsZGluZyB0aGUgYXNzZW1ibHkgZGlyZWN0b3J5LgotCi0gIDw8Tm90ZTo+PiBCZWNhdXNlIG9mIGEgcXVpcmsgaW4gTWF2ZW4gMi4wJ3MgZXhlY3V0aW9uIG1vZGVsIHJlbGF0aW5nIHRvCi0gIGFnZ3JlZ2F0b3IgZ29hbHMgYW5kIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHksIHdlIG5lZWQgdG8gZXhwbGljaXRseSBleGVjdXRlCi0gIHRoZSBwYWNrYWdlIHBoYXNlIGFoZWFkIG9mIHRoZSBhc3NlbWJseSBpbnZvY2F0aW9uLCB0byBlbnN1cmUgYWxsIG1vZHVsZXMgaGF2ZQotICBiZWVuIGJ1aWx0LgotCi0qIEV4YW1pbmluZyB0aGUgT3V0cHV0Ci0KLSAgV2hlbiB0aGUgTWF2ZW4gZXhlY3V0aW9uIGNvbXBsZXRlcywgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIHNob3VsZAotICBiZSBsZWZ0LiBSZW1lbWJlciwgb3VyIGFzc2VtYmx5IGZvcm1hdCB3YXMgPDw8ZGlyPj4+LCB3aGljaCBpcyB3aHkgdGhlIG91dHB1dAotICBpcyBhIGRpcmVjdG9yeSBhbmQgbm90IGFuIGFyY2hpdmUgb2Ygc29tZSBzb3J0LgotICAKLSAgSGVyZSBhcmUgdGhlIGRpcmVjdG9yeSBjb250ZW50czoKLQotKy0tLSsKLXRhcmdldC9kaXN0cmlidXRpb24vZGlzdHJpYnV0aW9uLTEuMC1iaW4KLWAtLSBtb2R1bGVzCi0gICAgYC0tIGNoaWxkMQotICAgICAgICB8LS0gY2hpbGQxLTEuMC5qYXIKLSAgICAgICAgYC0tIGp1bml0LTMuOC4xLmphcgotKy0tLSsKLQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvbXVsdGltb2R1bGUvbW9kdWxlLXNvdXJjZS1pbmNsdXNpb24tc2ltcGxlLmFwdC52bSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL211bHRpbW9kdWxlL21vZHVsZS1zb3VyY2UtaW5jbHVzaW9uLXNpbXBsZS5hcHQudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNzgzNDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvbXVsdGltb2R1bGUvbW9kdWxlLXNvdXJjZS1pbmNsdXNpb24tc2ltcGxlLmFwdC52bQorKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0gLS0tLS0tCi0gIEluY2x1ZGluZyBNb2R1bGUgU291cmNlcwotIC0tLS0tLQotICBKb2huIENhc2V5Ci0gLS0tLS0tCi0gIDA1LU1heS0yMDA2Ci0gLS0tLS0tCi0KLX5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLX5+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotfn4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLX5+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLX5+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLX5+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLX5+IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLX5+Ci1+fiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotfn4KLX5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLX5+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi1+fiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLX5+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotfn4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotfn4gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLX5+IE5PVEU6IEZvciBoZWxwIHdpdGggdGhlIHN5bnRheCBvZiB0aGlzIGZpbGUsIHNlZToKLX5+IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2RveGlhL3JlZmVyZW5jZXMvYXB0LWZvcm1hdC5odG1sCi0KLUluY2x1ZGluZyBNb2R1bGUgU291cmNlcwotCi0qIEludHJvZHVjdGlvbgotCi0gIEl0IGlzIGNvbW1vbiBwcmFjdGljZSB0byBjcmVhdGUgYW4gYXNzZW1ibHkgdXNpbmcgdGhlIHBhcmVudCBQT00gb2YgYQotICBtdWx0aW1vZHVsZSBidWlsZC4gQXQgdGltZXMsIHlvdSBtYXkgd2FudCB0byBlbnN1cmUgdGhhdCB0aGlzIGFzc2VtYmx5IGFsc28KLSAgaW5jbHVkZXMgdGhlIHNvdXJjZSBjb2RlIGZyb20gb25lIG9yIG1vcmUgb2YgdGhlIG1vZHVsZXMgaW4gdGhpcyBidWlsZC4KLQotICBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBpbmNsdWRlIHRoZSBwcm9qZWN0IHNvdXJjZXMgZnJvbSBhIG1vZHVsZSBpbgotICB0aGUgcHJvamVjdCBhc3NlbWJseSwgdW5kZXIgdGhlIGRpcmVjdG9yeSA8PDxzb3VyY2VzL1w8bW9kdWxlLW5hbWVcPj4+Pi4KLQotKiBUaGUgQXNzZW1ibHkgRGVzY3JpcHRvcgotCi0gIEZpcnN0LCBsZXQncyB3cml0ZSBhbiBhc3NlbWJseSBkZXNjcmlwdG9yIHRvIGNyZWF0ZSB0aGlzIGFzc2VtYmx5LiBGb3IgdGhlCi0gIHNha2Ugb2YgY2xhcml0eSwgdGhpcyBkZXNjcmlwdG9yIHdpbGwgYmUgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLCBvbmx5Ci0gIGRlbW9uc3RyYXRpbmcgdGhlIGZlYXR1cmVzIGRlc2NyaWJlZCBieSB0aGlzIGV4YW1wbGUuCi0KLSstLS0rCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgPGlkPnNyYzwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+ZGlyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KLSAgPG1vZHVsZVNldHM+Ci0gICAgPG1vZHVsZVNldD4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+b3JnLnRlc3Q6Y2hpbGQxPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDxzb3VyY2VzPgotICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PnNvdXJjZXMvJHthcnRpZmFjdElkfTwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPC9zb3VyY2VzPgotICAgIDwvbW9kdWxlU2V0PgotICA8L21vZHVsZVNldHM+Ci08L2Fzc2VtYmx5PgotKy0tLSsKLQotICBUaGlzIGRlc2NyaXB0b3Igc3RhdGVzIHRoYXQgdGhlIGFzc2VtYmx5IGlkIHNob3VsZCBiZSA8PDxzcmM+Pj4sIHRoYXQgdGhlCi0gIG91dHB1dCBmb3JtYXQgaXMgYSBkaXJlY3RvcnksIGFuZCB0aGF0IHRoZSBjb250ZW50cyBvZiB0aGUgYXNzZW1ibHkgc2hvdWxkCi0gIDw8bm90Pj4gYmUgY29udGFpbmVkIHdpdGhpbiBhIGRpcmVjdG9yeSBuYW1lZCBhZnRlciB0aGUgZmluYWxOYW1lIG9mIHRoZQotICB0b3AtbGV2ZWwgcHJvamVjdC4KLQotICBGdXJ0aGVybW9yZSwgaXQgc3RhdGVzIHRoYXQgd2Ugd2lzaCB0byBpbmNsdWRlIHRoZSBzb3VyY2UgZmlsZXMgZm9yIHRoZSBtb2R1bGUKLSAgd2l0aCBhIGdyb3VwSWQgb2YgPDw8b3JnLnRlc3Q+Pj4gYW5kIGFuIGFydGlmYWN0SWQgb2YgPDw8Y2hpbGQxPj4+LiBUaGVzZQotICBzb3VyY2VzIHNob3VsZCBiZSBjb250YWluZWQgd2l0aGluIHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlCi0gIDw8PHNvdXJjZXMvY2hpbGQxPj4+IGZvciB0aGlzIG1vZHVsZSwgc2luY2UgdGhlIG91dHB1dERpcmVjdG9yeSBleHByZXNzaW9uCi0gIHdpbGwgYmUgaW50ZXJwb2xhdGVkIG9uIGEgbW9kdWxlLWJ5LW1vZHVsZSBiYXNpcy4KLQotKiBUaGUgUE9NCi0KLSAgTm93LCBsZXQncyByZXZpZXcgdGhlIFBPTSBjb25maWd1cmF0aW9uIG5lY2Vzc2FyeSB0byBlbmFibGUgdGhlIGJ1aWxkaW5nIG9mCi0gIHRoaXMgYXNzZW1ibHkgdmlhIHRoZSA8YXNzZW1ibHk6ZGlyZWN0b3J5PiBnb2FsOgotCi0rLS0tKwotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLnRlc3Q8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotCi0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0KLSAgPG5hbWU+UGFyZW50PC9uYW1lPgotCi0gIDxtb2R1bGVzPgotICAgIDxtb2R1bGU+Y2hpbGQxPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5jaGlsZDI8L21vZHVsZT4KLSAgICA8bW9kdWxlPmNoaWxkMzwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9zcmMueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLTwvcHJvamVjdD4KLSstLS0rCi0KLSAgVGhpcyBQT00gc2ltcGx5IGRpcmVjdHMgdGhlIEFzc2VtYmx5IFBsdWdpbiB0byB1c2UgdGhlIDw8PHNyYy54bWw+Pj4KLSAgYXNzZW1ibHkgZGVzY3JpcHRvciB3aGVuIGV4ZWN1dGluZy4KLQotKiBFeGVjdXRlIQotCi0gIFRvIGJ1aWxkIHRoZSBhc3NlbWJseSwgd2UgaXNzdWUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi0rLS0tKwotbXZuIGNsZWFuIGFzc2VtYmx5OmRpcmVjdG9yeQotKy0tLSsKLQotICBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBkaXJlY3RvcnkgKG5vcm1hbGx5LCA8PDx0YXJnZXQ+Pj4pLCBpcwotICByZW1vdmVkIGJlZm9yZSBidWlsZGluZyB0aGUgYXNzZW1ibHkgZGlyZWN0b3J5LgotCi0qIEV4YW1pbmluZyB0aGUgT3V0cHV0Ci0KLSAgV2hlbiB0aGUgTWF2ZW4gZXhlY3V0aW9uIGNvbXBsZXRlcywgdGhlIGZvbGxvd2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIHNob3VsZAotICBiZSBsZWZ0OgotCi0rLS0tKwotdGFyZ2V0L3BhcmVudC0xLjAtc3JjLwotYC0tIHNvdXJjZXMKLSAgICBgLS0gY2hpbGQxCi0gICAgICAgIHwtLSBwb20ueG1sCi0gICAgICAgIGAtLSBzcmMKLSAgICAgICAgICAgIHwtLSBtYWluCi0gICAgICAgICAgICB8ICAgYC0tIGphdmEKLSAgICAgICAgICAgIHwgICAgICAgYC0tIG9yZwotICAgICAgICAgICAgfCAgICAgICAgICAgYC0tIHRlc3QKLSAgICAgICAgICAgIHwgICAgICAgICAgICAgICBgLS0gQXBwLmphdmEKLSAgICAgICAgICAgIGAtLSB0ZXN0Ci0gICAgICAgICAgICAgICAgYC0tIGphdmEKLSAgICAgICAgICAgICAgICAgICAgYC0tIG9yZwotICAgICAgICAgICAgICAgICAgICAgICAgYC0tIHRlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLS0gQXBwVGVzdC5qYXZhCi0rLS0tKwotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2FwdC9leGFtcGxlcy9zaGFyaW5nLWRlc2NyaXB0b3JzLmFwdC52bSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NoYXJpbmctZGVzY3JpcHRvcnMuYXB0LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZmE1ZmZhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NoYXJpbmctZGVzY3JpcHRvcnMuYXB0LnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLSAtLS0tLS0KLSBTaGFyaW5nIEFzc2VtYmx5IERlc2NyaXB0b3JzCi0gLS0tLS0tCi0gRGVubmlzIEx1bmRiZXJnCi0gLS0tLS0tCi0gMjAxMC0xMS0wOAotIC0tLS0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi1TaGFyaW5nIEFzc2VtYmx5IERlc2NyaXB0b3JzCi0KLSAgU28geW91IGhhdmUgY3JlYXRlZCBhbiBhc3NlbWJseSBkZXNjcmlwdG9yIHRoYXQgeW91IGZlZWwgaXMgc28gZ29vZCB0aGF0IHlvdQotICB3YW50IHRvIHNoYXJlIGl0IGJldHdlZW4gc2V2ZXJhbCBvZiB5b3VyIHByb2plY3RzLiBUaGUgc2ltcGxlc3Qgd2F5IHRvIHNvbHZlCi0gIHRoaXMgcHJvYmxlbSBpcyB0byBjcmVhdGUgYSBzZXBhcmF0ZSBwcm9qZWN0IGZvciB5b3VyIGFzc2VtYmx5IGRlc2NyaXB0b3IuCi0gIExldCdzIGNhbGwgdGhlIHByb2plY3QgPG15LWFzc2VtYmx5LWRlc2NyaXB0b3I+LgotCi0gIDw8Tm90ZTo+PiBUaGlzIGV4YW1wbGUgaGFzIGJlZW4gdXBkYXRlZCBmb3IgdmVyc2lvbiAyLjIuIFRoZSBwcmV2aW91cyB2ZXJzaW9ucwotICBvZiB0aGlzIGV4YW1wbGUgd2VyZSB3cm9uZy4gWW91IG11c3QgZm9sbG93IHRoZSBzdGVwcyBiZWxvdyB0byBtYWtlIHlvdXIKLSAgc2hhcmVkIGFzc2VtYmx5IGRlc2NyaXB0b3JzIHdvcmsgd2l0aCB2ZXJzaW9uIDIuMiBvciBsYXRlci4KLQotKiBUaGUgU2hhcmVkIEFzc2VtYmx5IERlc2NyaXB0b3IgUHJvamVjdAotCi0gIEhlcmUncyB3aGF0IHRoZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZvciB0aGF0IHByb2plY3QgbG9va3MgbGlrZToKLQotKy0tLSsKLW15LWFzc2VtYmx5LWRlc2NyaXB0b3IKLSAgICArLS0gc3JjCi0gICAgfCAgIGAtLSBtYWluCi0gICAgfCAgICAgICBgLS0gcmVzb3VyY2VzCi0gICAgfCAgICAgICAgICAgYC0tIGFzc2VtYmxpZXMKLSAgICB8ICAgICAgICAgICAgICAgYC0tIG15YXNzZW1ibHkueG1sCi0gICAgYC0tIHBvbS54bWwKLSstLS0rCi0KLSAgVGhlcmUgYXJlIGp1c3QgdHdvIGZpbGVzIGluIHRoaXMgcHJvamVjdDogeW91ciBhc3NlbWJseSBkZXNjcmlwdG9yCi0gIDw8PG15YXNzZW1ibHkueG1sPj4+IGFuZCBhIDw8PHBvbS54bWw+Pj4uCi0KLSAgPDxOb3RlOj4+IFlvdXIgYXNzZW1ibHkgZGVzY3JpcHRvcnMgbXVzdCBiZSBpbiB0aGUgZGlyZWN0b3J5Ci0gIDw8PC9zcmMvbWFpbi9yZXNvdXJjZXMvYXNzZW1ibGllcz4+PiB0byBiZSBhdmFpbGFibGUgdG8gdGhlIEFzc2VtYmx5IFBsdWdpbi4gCi0KLSAgRmlyc3QgbGV0J3MgY2hlY2sgb3V0IHRoZSBQT00gZm9yIHRoZSBTaGFyZWQgQXNzZW1ibHkgRGVzY3JpcHRvciBQcm9qZWN0LiBJdAotICBpcyBxdWl0ZSBzaW1wbGU6Ci0KLSstLS0rCi08cHJvamVjdD4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8Z3JvdXBJZD55b3VyLmdyb3VwLmlkPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teS1hc3NlbWJseS1kZXNjcmlwdG9yPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPlNoYXJlZCBBc3NlbWJseSBEZXNjcmlwdG9yPC9uYW1lPgotPC9wcm9qZWN0PgotKy0tLSsKLQotICBOZXh0IGxldCdzIGxvb2sgYXQgb3VyIHNoYXJlZCBhc3NlbWJseSBkZXNjcmlwdG9yLiBUaGlzIGlzIGp1c3QgYW4gZXhhbXBsZS4KLSAgUmVwbGFjZSBpdCB3aXRoIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIHlvdSB3YW50IHRvIHNoYXJlLgotCi0rLS0tKwotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIDxpZD5teS1hc3NlbWJseS1kZXNjcmlwdG9yLWlkPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZVNldHM+Ci0gICAgPGZpbGVTZXQ+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPnBvbS54bWw8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgICAgPHVzZURlZmF1bHRFeGNsdWRlcz50cnVlPC91c2VEZWZhdWx0RXhjbHVkZXM+Ci0gICAgPC9maWxlU2V0PgotICAgIDxmaWxlU2V0PgotICAgICAgPGRpcmVjdG9yeT5zcmM8L2RpcmVjdG9yeT4KLSAgICAgIDx1c2VEZWZhdWx0RXhjbHVkZXM+dHJ1ZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLTwvYXNzZW1ibHk+Ci0rLS0tKwotCi0gIFJ1biAnPDw8bXZuIGluc3RhbGw+Pj4nIG9uIHRoaXMgcHJvamVjdCB0byBpbnN0YWxsIHRoZSBTaGFyZWQgQXNzZW1ibHkKLSAgRGVzY3JpcHRvciBwcm9qZWN0IGludG8geW91ciBsb2NhbCByZXBvc2l0b3J5LgotCi0KLSogVGhlIFByb2plY3QgVXNpbmcgdGhlIFNoYXJlZCBBc3NlbWJseSBEZXNjcmlwdG9yCi0KLSAgSW4gdGhlIHByb2plY3QgdGhhdCB3YW50cyB0byB1c2Ugb3VyIFNoYXJlZCBBc3NlbWJseSBEZXNjcmlwdG9yLCB5b3UgbmVlZCB0bwotICBhZGQgPDw8bXktYXNzZW1ibHktZGVzY3JpcHRvcj4+PiBhcyBhIGRlcGVuZGVuY3kgb24gdGhlIEFzc2VtYmx5IFBsdWdpbi4gVGhpcwotICBtYWtlcyBvdXIgYXNzZW1ibHkgZGVzY3JpcHRvciBhdmFpbGFibGUgZm9yIHRoZSBBc3NlbWJseSBQbHVnaW4gdG8gdXNlLgotCi0gIDw8Tm90ZTo+PiBZb3UgbmVlZCB0byB1c2UgdGhlIGZpbGUgbmFtZSBvZiB5b3VyIGFzc2VtYmx5IGRlc2NyaXB0b3IsIHdpdGhvdXQKLSAgdGhlIHhtbCBmaWxlIGV4dGVuc2lvbiwgaW4gPDw8XDxkZXNjcmlwdG9yUmVmXD4+Pj4uIFlvdSBjYW4gbm90IHVzZSB0aGUgaWQgb2YKLSAgeW91ciBhc3NlbWJseSBkZXNjcmlwdG9yLiBUaGUgYXNzZW1ibHkgZGVzY3JpcHRvciB1c2VkIGluIHRoaXMgZXhhbXBsZSBoYXZlCi0gIHRoZSBmaWxlIG5hbWUgPDw8bXlhc3NlbWJseS54bWw+Pj4sIGJ1dCBpdHMgaWQgaXMKLSAgPDw8bXktYXNzZW1ibHktZGVzY3JpcHRvci1pZD4+Pi4gVGhlcmVmb3Igd2UgdXNlIDw8PG15YXNzZW1ibHk+Pj4gdG8gcmVmZXJlbmNlCi0gIHRoYXQgYXNzZW1ibHkgZGVzY3JpcHRvci4KLQotKy0tLSsKLTxwcm9qZWN0PgotICA8Z3JvdXBJZD55b3VyLmdyb3VwLmlkPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teS1wcm9qZWN0PC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgLi4uCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+eW91ci5ncm91cC5pZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm15LWFzc2VtYmx5LWRlc2NyaXB0b3I8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5tYWtlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8IS0tIFRoaXMgaXMgd2hlcmUgd2UgdXNlIG91ciBzaGFyZWQgYXNzZW1ibHkgZGVzY3JpcHRvciAtLT4KLSAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPm15YXNzZW1ibHk8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgLi4uCi0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotICAuLi4KLTwvcHJvamVjdD4KLSstLS0rCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2FwdC9leGFtcGxlcy9zaW5nbGUvZmlsdGVyaW5nLXNvbWUtZGlzdHJpYnV0aW9uLWZpbGVzLmFwdC52bSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NpbmdsZS9maWx0ZXJpbmctc29tZS1kaXN0cmlidXRpb24tZmlsZXMuYXB0LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMThjYWI2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NpbmdsZS9maWx0ZXJpbmctc29tZS1kaXN0cmlidXRpb24tZmlsZXMuYXB0LnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLSAtLS0tLS0KLSAgRmlsdGVyaW5nIFNvbWUgRGlzdHJpYnV0aW9uIEZpbGVzCi0gLS0tLS0tCi0gIEVkd2luIFB1bnphbGFuCi0gLS0tLS0tCi0gIDI2LUp1bHktMjAwNgotIC0tLS0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi0KLUZpbHRlcmluZyBTb21lIERpc3RyaWJ1dGlvbiBGaWxlcwotCi0qIEludHJvZHVjdGlvbgotCi0gIEZpbGUgZmlsdGVyaW5nIGlzIHVzZWQgdG8gc3Vic3RpdHV0ZSB2YXJpYWJsZSBmaWVsZHMgZnJvbSBpbnNpZGUgYSBmaWxlIHRvCi0gIHRoZWlyIHJlcHJlc2VudGVkIHZhbHVlcy4gRm9yIHRoZSBBc3NlbWJseSBQbHVnaW4sIGFuZCBtb3N0IE1hdmVuIGZpbHRlcmluZwotICBwcm9jZWR1cmVzLCB0aGVzZSB2YXJpYWJsZXMgYXJlIGVuY2xvc2VkIGJldHdlZW4gJFx7IGFuZCBcfS4gRm9yCi0gIGV4YW1wbGUsIGJlZm9yZSBhIGZpbGUgaXMgZmlsdGVyZWQsIGl0IGNvbnRhaW5zIDw8PCRce3Byb2plY3QuYXJ0aWZhY3RJZFx9Pj4+LgotICBCdXQgYWZ0ZXIgZmlsdGVyaW5nIGlzIGNvbXBsZXRlLCBhIG5ldyBmaWxlIGlzIGNyZWF0ZWQgd2l0aCB0aGUgcHJvamVjdCdzCi0gIDw8PGFydGlmYWN0SWQ+Pj4gc3Vic3RpdHV0aW5nIDw8PCRce3Byb2plY3QuYXJ0aWZhY3RJZFx9Pj4+IGFuZCB0aGF0IHRoaXMgbmV3Ci0gIGZpbGUgaXMgdXNlZCBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBvbmUuCi0KLSAgQWx0aG91Z2ggZmlsdGVyaW5nIGNhbiBiZSBkb25lIGR1cmluZyB0aGUgcHJvY2Vzcy1yZXNvdXJjZXMgcGhhc2UsIG5vdCBhbGwKLSAgZmlsZXMgZ29pbmcgaW50byB5b3VyIGRpc3RyaWJ1dGlvbiB3aWxsIGJlIGNvbWluZyBmcm9tIGEgcHJvamVjdCByZXNvdXJjZS4KLSAgVGh1cywgdGhlIEFzc2VtYmx5IFBsdWdpbiBhbGxvd3MgZmlsdGVyaW5nIG9mIGZpbGVzIGJlZm9yZSBjb3B5aW5nIHRoZW0gaW50bwotICB0aGUgY3JlYXRlZCBhc3NlbWJseS4KLQotICBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBmaWx0ZXIgZmlsZXMgYmVmb3JlIGFkZGluZyB0aGVtIGludG8gdGhlCi0gIGFzc2VtYmx5LiBJbiB0aGlzIGV4YW1wbGUsIHdlIG5lZWQgdG8gZmlsdGVyIGRpc3RyaWJ1dGlvbiBmaWxlcyBpbnRvIHRoZQotICBhcmNoaXZlLiBUaGUgZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiBhcmU6Ci0KLSAgICAqIFJFQURNRS50eHQKLQotICAgICogTElDRU5TRS50eHQKLQotICAgICogTk9USUNFLnR4dAotCi0gICAgW10KLQotICBBbGwgdGhlIGFib3ZlIGZpbGVzIGFyZSBpbiB0aGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QgYnV0IG9ubHkgdGhlCi0gIFJFQURNRSBhbmQgdGhlIE5PVElDRSBmaWxlcyBzaG91bGQgYmUgZmlsdGVyZWQuIFRoZSBwcm9wZXJ0eSBmaWxlIHVzZWQgdG8KLSAgZmlsdGVyIHRoZXNlIGFyZSBmaWxlcyBpcyBmb3VuZCBpbiA8PDxzcmMvYXNzZW1ibHkvZmlsdGVyLnByb3BlcnRpZXM+Pj4uCi0KLSAgQSBwcm9wZXJ0eSBmaWxlIGlzIGEgZmlsZSB3aGljaCBjb250YWlucyB0aGUgbmFtZXMgb2YgdGhlIHZhcmlhYmxlcyBhbmQgdGhlaXIKLSAgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUuIFRoZSBmb3JtYXQgb2YgaXRzIGNvbnRlbnRzIGlzIGlkZW50aWNhbCB0byBob3cgSmF2YQotICBQcm9wZXJ0eSBmaWxlcyBhcmUgc2F2ZWQuIEJlbG93IGlzIGFuIGV4YW1wbGUgb2YgYSBwcm9wZXJ0eSBmaWxlOgotCi0rLS0tCi0jIGxpbmVzIGJlZ2lubmluZyB3aXRoIHRoZSAjIHNpZ24gYXJlIGNvbW1lbnRzCi0KLXZhcmlhYmxlMT12YWx1ZTEKLXZhcmlhYmxlMj12YWx1ZTIKLSstLS0KLQotCi0qIFRoZSBBc3NlbWJseSBEZXNjcmlwdG9yCi0KLSAgRmlsdGVyaW5nIGlzIG9ubHkgZW5hYmxlZCBpbnNpZGUgXDxmaWxlc1w+IHNvIHRoYXQncyB3aGF0IHdlIHdpbGwgdXNlLiBUaHVzLAotICBvdXIgYXNzZW1ibHkgZGVzY3JpcHRvciB3aWxsIGJlOgotCi0rLS0tLS0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktJHttZG9WZXJzaW9ufS54c2QiPgotICA8aWQ+ZGlzdHJpYnV0aW9uPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD5qYXI8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZmlsZXM+Ci0gICAgPGZpbGU+Ci0gICAgICA8c291cmNlPlJFQURNRS50eHQ8L3NvdXJjZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGZpbHRlcmVkPnRydWU8L2ZpbHRlcmVkPgotICAgIDwvZmlsZT4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+TElDRU5TRS50eHQ8L3NvdXJjZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgIDwvZmlsZT4KLSAgICA8ZmlsZT4KLSAgICAgIDxzb3VyY2U+Tk9USUNFLnR4dDwvc291cmNlPgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8ZmlsdGVyZWQ+dHJ1ZTwvZmlsdGVyZWQ+Ci0gICAgPC9maWxlPgotICA8L2ZpbGVzPgotPC9hc3NlbWJseT4KLSstLS0tLQotCi0gIFRoZSBhYm92ZSBkZXNjcmlwdG9yIHRlbGxzIHRoZSBBc3NlbWJseSBQbHVnaW4gdG8gZmlsdGVyIGJvdGggdGhlIFJFQURNRS50eHQKLSAgYW5kIHRoZSBOT1RJQ0UudHh0IGZpbGVzIGFuZCB0byBqdXN0IGNvcHkgdGhlIExJQ0VOU0UudHh0IGZpbGUuCi0KLSAgQWx0ZXJuYXRpdmVseSwgaWYgdGhlcmUgYXJlIG1hbnkgLnR4dCBmaWxlcyB0byBpbmNsdWRlIGluc2lkZSBcPGZpbGVzXD4sIHdlIGNhbgotICBzZXR1cCBib3RoIFw8ZmlsZVNldHNcPiBhbmQgXDxmaWxlc1w+IGxpa2Ugc286Ci0KLSstLS0tLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIDxpZD5kaXN0cmlidXRpb248L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PmphcjwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxmaWxlU2V0cz4KLSAgICA8ZmlsZVNldD4KLSAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfTwvZGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT4qLnR4dDwvaW5jbHVkZT4KLSAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8ZXhjbHVkZXM+Ci0gICAgICAgIDxleGNsdWRlPlJFQURNRS50eHQ8L2V4Y2x1ZGU+Ci0gICAgICAgIDxleGNsdWRlPk5PVElDRS50eHQ8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZmlsZVNldD4KLSAgPC9maWxlU2V0cz4KLSAgPGZpbGVzPgotICAgIDxmaWxlPgotICAgICAgPHNvdXJjZT5SRUFETUUudHh0PC9zb3VyY2U+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxmaWx0ZXJlZD50cnVlPC9maWx0ZXJlZD4KLSAgICA8L2ZpbGU+Ci0gICAgPGZpbGU+Ci0gICAgICA8c291cmNlPk5PVElDRS50eHQ8L3NvdXJjZT4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGZpbHRlcmVkPnRydWU8L2ZpbHRlcmVkPgotICAgIDwvZmlsZT4KLSAgPC9maWxlcz4KLTwvYXNzZW1ibHk+Ci0rLS0tLS0KLQotICBUaGUgYWJvdmUgZGVzY3JpcHRvciBhZGRzIGFsbCAudHh0IGZpbGVzIHRvIHRoZSBhc3NlbWJseSBidXQgZmlsdGVycyBSRUFETUUudHh0Ci0gIGFuZCBOT1RJQ0UudHh0IGZpbGVzLgotCi0KLSogVGhlIFBPTQotCi0gIFRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBBc3NlbWJseSBQbHVnaW4gaW5zaWRlIHBvbS54bWwgc2hvdWxkIG5vdCBiZQotICBkaWZmZXJlbnQgZnJvbSB0aGUgb3RoZXJzLCBleGNlcHQgZm9yIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBmaWx0ZXIgZmlsZSwgc286Ci0KLSstLS0tLQotPHByb2plY3Q+Ci0gIFsuLi5dCi0gIDxidWlsZD4KLSAgICBbLi4uXQotICAgIDxwbHVnaW5zPgotICAgICAgWy4uLl0KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZmlsdGVycz4KLSAgICAgICAgICAgIDxmaWx0ZXI+c3JjL2Fzc2VtYmx5L2ZpbHRlci5wcm9wZXJ0aWVzPC9maWx0ZXI+Ci0gICAgICAgICAgPC9maWx0ZXJzPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9kaXN0cmlidXRpb24ueG1sPC9kZXNjcmlwdG9yPgotICAgICAgICAgIDwvZGVzY3JpcHRvcnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgWy4uLl0KLTwvcHJvamVjdD4KLSstLS0tLQotCi0qIEdlbmVyYXRpbmcgVGhlIEFzc2VtYmx5Ci0KLSAgVG8gZ2VuZXJhdGUgdGhlIGRpc3RyaWJ1dGlvbiBhc3NlbWJseSwgd2UgdGhlbiB1c2U6Ci0KLSstLS0tLQotbXZuIGFzc2VtYmx5OmFzc2VtYmx5Ci0rLS0tLS0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NpbmdsZS9pbmNsdWRpbmctYW5kLWV4Y2x1ZGluZy1hcnRpZmFjdHMuYXB0IGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvc2luZ2xlL2luY2x1ZGluZy1hbmQtZXhjbHVkaW5nLWFydGlmYWN0cy5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMTdhZTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvc2luZ2xlL2luY2x1ZGluZy1hbmQtZXhjbHVkaW5nLWFydGlmYWN0cy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0gIC0tLQotICBJbmNsdWRpbmcgYW5kIEV4Y2x1ZGluZyBBcnRpZmFjdHMKLSAgLS0tCi0gIEJhcnJpZSBUcmVsb2FyCi0gIC0tLQotICAzMS1KdWx5LTIwMDYKLSAgLS0tCi0KLX5+IENvcHlyaWdodCAyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLX5+Ci1+fiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLX5+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLX5+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotfn4KLX5+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1+fgotfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotfn4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLX5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotfn4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotfn4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLX5+IE5PVEU6IEZvciBoZWxwIHdpdGggdGhlIHN5bnRheCBvZiB0aGlzIGZpbGUsIHNlZToKLX5+IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2RveGlhL3JlZmVyZW5jZXMvYXB0LWZvcm1hdC5odG1sCi0KLQotSW5jbHVkaW5nIGFuZCBFeGNsdWRpbmcgQXJ0aWZhY3RzCi0KLSAgQ3VycmVudGx5IHRoZSBpbmNsdWRlL2V4Y2x1ZGUgZm9ybWF0IGlzIGJhc2VkIHVwb24gdGhlIGRlcGVuZGVuY3kgY29uZmxpY3QgaWQKLSAgd2hpY2ggaGFzIGEgZm9ybSBvZjogPDw8Z3JvdXBJZDphcnRpZmFjdElkOnR5cGU6Y2xhc3NpZmllcj4+Pi4gQSBzaG9ydGVuZWQKLSAgZm9ybSBvZiB0aGUgZGVwZW5kZW5jeSBjb25mbGljdCBpZCBtYXkgYWxzbyBiZSB1c2VkIDw8PGdyb3VwSWQ6YXJ0aWZhY3RJZD4+Pi4KLQotICBUaGUgY2hlY2sgZm9yIGluY2x1c2lvbi9leGNsdXNpb24gaXMgZG9uZSBiYXNlZCBvbiBlaXRoZXIgdGhlIGRlcGVuZGVuY3kKLSAgY29uZmxpY3QgaWQgb3IgdGhlIHNob3J0ZW5lZCBmb3JtIGFzIGEgPDw8U3RyaW5nLmVxdWFscygpPj4+IHNvIGl0IG11c3QKLSAgYmUgYW4gaWRlbnRpY2FsIG1hdGNoIGZvciBpdCB0byBiZSBpbmNsdWRlZCBvciBleGNsdWRlZC4gQXQgcHJlc2VudCB0aGVyZSBpcwotICBubyBzdXBwb3J0IGZvciByZWd1bGFyIGV4cHJlc3Npb25zLgotCi0gIFRoaXMgZXhhbXBsZSBleGNsdWRlcyB0aGUgbG9nNGogYW5kIGNvbW1vbnMtbGFuZyBqYXIgZmlsZXMgZnJvbSB0aGUgYXNzZW1ibHkuCi0gIFRoaXMgd291bGQgYmUgdXNlZnVsIHdoZW4geW91IGFyZSBidWlsZGluZyBhIHN1cGVyIGRpc3RyaWJ1dGlvbiBhc3NlbWJseSB3aGljaAotICBjb250YWluZWQgc3ViIGRpc3RyaWJ1dGlvbnMgKGkuZS4gb3RoZXIgYWxyZWFkeSBhc3NlbWJsZWQgemlwcyBvciB0YXJzKSB3aGVyZQotICBpbiB5b3VyIHBvbSB5b3UgYXJlIGRlcGVuZWRlbnQgdXBvbiB0aG9zZSBkaXN0cmlidXRpb25zLiAgQnV0IGJlY2F1c2UgdGhlCi0gIGRpc3RyaWJ1dGlvbnMgdHJhbnNpdGl2ZWx5IGRlcGVuZCB1cG9uIHRoZSBwcm9qZWN0J3MgZGVwZW5kZW5jaWVzIHRoZSBhc3NlbWJseQotICBhbHNvIGluY2x1ZGVzIHRoZSBqYXIgZmlsZXMgKHdoaWNoIGFyZSBhbHJlYWR5IGluIHRoZSBhc3NlbWJsaWVzIGFuZCBkb24ndAotICBuZWVkIHRvIGJlIGR1cGxpY2F0ZWQpCi0KLSAgWW91ciBwb20gbWlnaHQgaW5jbHVkZSBzb21ldGhpbmcgbGlrZToKLQotLS0tLS0KLSAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPllPVVIgR1JPVVA8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5ZT1VSIEFSVElGQUNUPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+WU9VUiBWRVJTSU9OPC92ZXJzaW9uPgotICAgICAgICAgICAgPGNsYXNzaWZpZXI+YmluPC9jbGFzc2lmaWVyPgotICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0tLS0tLQotCi0gIEFuZCB0aGVuIGluIHlvdXIgYXNzZW1ibHkgeW91IGV4Y2x1ZGUgYWxsIHRoZSBqYXIgZGVwZW5kZW5jaWVzIHB1bGxlZCBpbgotICBmcm9tIHRoZSBiaW5hcnkgYXNzZW1ibHkuIEluIHRoaXMgZXhhbXBsZSB0aGUgY29tbW9ucy1sYW5nIGFuZCBsb2c0aiBqYXJzCi0gIGFyZSBpbmNsdWRlZCB1bm5lY2Vzc2FyaWx5IChhcyB0aGV5IGFyZSBpbiB0aGUgYmluLnppcCBmaWxlIGFscmVhZHkpCi0KLS0tLS0tCi0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIC4uLi4KLSAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgPGV4Y2x1ZGU+Y29tbW9ucy1sYW5nOmNvbW1vbnMtbGFuZzwvZXhjbHVkZT4KLSAgICAgICAgPGV4Y2x1ZGU+bG9nNGo6bG9nNGo8L2V4Y2x1ZGU+Ci0gICAgICA8L2V4Y2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgICAuLi4uCi0gIDwvZGVwZW5kZW5jeVNldHM+Ci0tLS0tLQotCi0qIFdoYXQgYWJvdXQgeW91ciBQcm9qZWN0J3MgQXJ0aWZhY3RzPwotCi0gIHt7e2h0dHA6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvTUFTU0VNQkxZLTE5N31NQVNTRU1CTFktMTk3fX0gYWRkZWQgPDw8dXNlUHJvamVjdEFydGlmYWN0Pj4+Ci0gIGFuZCA8PDx1c2VQcm9qZWN0QXR0YWNobWVudHM+Pj4gdG8gdGhlIDw8PGRlcGVuZGVuY3lTZXQ+Pj4gY29uZmlndXJhdGlvbi4KLQotICBTZWUge3t7Li4vLi4vYXNzZW1ibHkuaHRtbCNjbGFzc19kZXBlbmRlbmN5U2V0fUFzc2VtYmx5IERlc2NyaXB0b3IgRm9ybWF0fX0gZm9yIHRoZSBkZWZhdWx0IHZhbHVlcyBhbmQgaG93IHRvIGNvbmZpZ3VyZSB0aGVtLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NpbmdsZS9pbmRleC5hcHQgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2FwdC9leGFtcGxlcy9zaW5nbGUvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTEzMzdhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NpbmdsZS9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0gIC0tLQotICBTaW5nbGUgUHJvamVjdCBFeGFtcGxlcwotICAtLS0KLSAgRWR3aW4gUHVuemFsYW4KLSAgLS0tCi0gIDI0LUp1bHktMjAwNgotICAtLS0KLQotfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotfn4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1+fiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotfn4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotfn4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotfn4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotfn4gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotfn4KLX5+ICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1+fgotfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotfn4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLX5+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotfn4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1+fiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi1+fiB1bmRlciB0aGUgTGljZW5zZS4KLQotfn4gTk9URTogRm9yIGhlbHAgd2l0aCB0aGUgc3ludGF4IG9mIHRoaXMgZmlsZSwgc2VlOgotfn4gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZG94aWEvcmVmZXJlbmNlcy9hcHQtZm9ybWF0Lmh0bWwKLQotU2luZ2xlIFByb2plY3QgRXhhbXBsZXMKLQotICBBIFNpbmdsZSBQcm9qZWN0IGlzIGEgcHJvamVjdCB3aG9zZSBhc3NlbWJsaWVzIGRvZXMgbm90IHVzZSBcPG1vZHVsZVNldHNcPi4KLQotICBUaGUgZXhhbXBsZXMgYmVsb3cgbWF5IGhlbHAgeW91IGluIGNyZWF0aW5nIGFzc2VtYmxpZXMgZm9yIHlvdXIgc2luZ2xlCi0gIHByb2plY3RzLgotCi0gICoge3t7Li9maWx0ZXJpbmctc29tZS1kaXN0cmlidXRpb24tZmlsZXMuaHRtbH1GaWx0ZXJpbmcgU29tZSBEaXN0cmlidXRpb24gRmlsZXN9fQotCi0gICoge3t7Li9pbmNsdWRpbmctYW5kLWV4Y2x1ZGluZy1hcnRpZmFjdHMuaHRtbH1JbmNsdWRpbmcvRXhjbHVkaW5nIEFydGlmYWN0c319Ci0KLSAgKiB7e3suL3VzaW5nLWNvbXBvbmVudHMuaHRtbH1Vc2luZyBDb21wb25lbnQgRGVzY3JpcHRvcnN9fQotCi0gICoge3t7Li91c2luZy1yZXBvc2l0b3JpZXMuaHRtbH1Vc2luZyBSZXBvc2l0b3JpZXN9fQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvc2luZ2xlL3VzaW5nLWNvbXBvbmVudHMuYXB0LnZtIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvc2luZ2xlL3VzaW5nLWNvbXBvbmVudHMuYXB0LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQyNTZlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NpbmdsZS91c2luZy1jb21wb25lbnRzLmFwdC52bQorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0gLS0tLS0tCi0gIFVzaW5nIENvbXBvbmVudCBEZXNjcmlwdG9ycwotIC0tLS0tLQotICBFZHdpbiBQdW56YWxhbgotIC0tLS0tLQotICAyNC1KdWx5LTIwMDYKLSAtLS0tLS0KLQotfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotfn4gb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1+fiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotfn4gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotfn4gdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotfn4gIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotfn4gd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotfn4KLX5+ICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi1+fgotfn4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotfn4gc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLX5+ICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotfn4gS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1+fiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi1+fiB1bmRlciB0aGUgTGljZW5zZS4KLQotfn4gTk9URTogRm9yIGhlbHAgd2l0aCB0aGUgc3ludGF4IG9mIHRoaXMgZmlsZSwgc2VlOgotfn4gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZG94aWEvcmVmZXJlbmNlcy9hcHQtZm9ybWF0Lmh0bWwKLQotVXNpbmcgQ29tcG9uZW50IERlc2NyaXB0b3JzCi0KLSogSW50cm9kdWN0aW9uCi0KLSAgU3VwcG9zZSB5b3UgaGF2ZSBhIHByb2plY3Qgd2hpY2ggd2lsbCBiZSBkaXN0cmlidXRlZCBpbiB0d28gZm9ybXM6IG9uZSBmb3IKLSAgdXNlIHdpdGggYXBwc2VydmVyIEEgYW5kIGFub3RoZXIgZm9yIGFwcHNlcnZlciBCLiBBbmQgYXMgY3VzdG9taXphdGlvbiBmb3IKLSAgdGhlc2UgdHdvIHNlcnZlcnMsIHlvdSBuZWVkIHRvIGV4Y2x1ZGUgc29tZSBkZXBlbmRlbmNpZXMgd2hpY2ggYXJlIG5vdCB1c2VkCi0gIGJ5IHRoZSBhcHBzZXJ2ZXIgeW91IHdpbGwgYmUgZGlzdHJpYnV0aW5nLgotCi0gIDw8Tk9URTo+PiA8QWx0aG91Z2ggcHV0dGluZyBcPGV4Y2x1ZGVzXD4gaW5zaWRlIFw8ZGVwZW5kZW5jeVNldHNcPiBtYXkgcHJvdmlkZQotICB0aGUgcmVzdWx0IHdlIHdhbnQsIGl0IGlzIG5vdCByZWNvbW1lbmRlZCBiZWNhdXNlIGlmIGEgbmV3IGFwcHNlcnZlciBiZWNvbWVzCi0gIGF2YWlsYWJsZSwgeW91IHdpbGwgaGF2ZSB0byBtYWludGFpbiB0aGUgZXhjbHVkZXMgb2YgdGhlIG90aGVyIGRpc3RyaWJ1dGlvbnMKLSAgdG8gZXhjbHVkZSBkZXBlbmRlbmNpZXMgbWVhbnQgZm9yIHRoZSBuZXcgYXBwc2VydmVyLj4KLQotICBUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGUgdGhlIHVzZSBvZiBcPGNvbXBvbmVudERlc2NyaXB0b3JzXD4sIG1vcmUgaW5mb3JtYXRpb24KLSAgY2FuIGJlIGZvdW5kIHt7ey4uLy4uL2Fzc2VtYmx5Lmh0bWx9aGVyZX19LgotCi0qIFRoZSBBc3NlbWJseSBEZXNjcmlwdG9ycwotCi0gIEZpcnN0LCBsZXQncyB3cml0ZSB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciBmb3IgYXBwc2VydmVyIEEgZGlzdHJpYnV0aW9uLiBJdAotICBzaG91bGQgbGlrZSB0aGlzOgotCi0rLS0tLS0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktJHttZG9WZXJzaW9ufS54c2QiPgotICA8aWQ+YXBwc2VydmVyQTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vbGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPmFwcGxpY2F0aW9uOmxvZ2dpbmc8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPmFwcGxpY2F0aW9uOmNvcmU8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPmFwcGxpY2F0aW9uOnV0aWxzPC9pbmNsdWRlPgotICAgICAgICA8aW5jbHVkZT5hcHBsaWNhdGlvbjphcHBzZXJ2ZXJBPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgotKy0tLS0tCi0KLSAgVGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IgZm9yIGFwcHNlcnZlciBCIGRpc3RyaWJ1dGlvbiB3b3VsZCB0aGVuIGJlIHNpbWlsYXI6Ci0KLSstLS0tLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIDxpZD5hcHBzZXJ2ZXJCPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8ZGVwZW5kZW5jeVNldHM+Ci0gICAgPGRlcGVuZGVuY3lTZXQ+Ci0gICAgICA8b3V0cHV0RGlyZWN0b3J5Pi9saWI8L291dHB1dERpcmVjdG9yeT4KLSAgICAgIDxpbmNsdWRlcz4KLSAgICAgICAgPGluY2x1ZGU+YXBwbGljYXRpb246bG9nZ2luZzwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+YXBwbGljYXRpb246Y29yZTwvaW5jbHVkZT4KLSAgICAgICAgPGluY2x1ZGU+YXBwbGljYXRpb246dXRpbHM8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPmFwcGxpY2F0aW9uOmFwcHNlcnZlckI8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+Ci0rLS0tLS0KLQotICBGcm9tIHRoZSB0d28gZGVzY3JpcHRvcnMgc2hvd24sIHdlIGNhbiBzYXkgdGhhdCB0aGVyZSBhcmUgdGhyZWUgYXJ0aWZhY3RzCi0gIGNvbW1vbiBmb3IgYm90aCwgdGh1cyB3ZSBzZXBhcmF0ZSB0aGVtIGludG8gYSBjb21tb24gY29tcG9uZW50IGRlc2NyaXB0b3IKLSAgYW5kIHNhdmUgaXQgYXMgPDw8c3JjL2Fzc2VtYmx5L2NvbXBvbmVudC54bWw+Pj4uICBJdHMgY29udGVudHMgd291bGQKLSAgYmU6Ci0KLSstLS0tLQotPGNvbXBvbmVudD4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vbGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPmFwcGxpY2F0aW9uOmxvZ2dpbmc8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPmFwcGxpY2F0aW9uOmNvcmU8L2luY2x1ZGU+Ci0gICAgICAgIDxpbmNsdWRlPmFwcGxpY2F0aW9uOnV0aWxzPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2NvbXBvbmVudD4KLSstLS0tLQotCi0gIFRoZW4gdGhlIGZpbmFsIGFzc2VtYmx5IGRlc2NyaXB0b3IgZm9yIHRoZSBhcHBzZXJ2ZXIgQSB3b3VsZCBiZToKLQotKy0tLS0tCi08YXNzZW1ibHkgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0iCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LyR7bWRvVmVyc2lvbn0gaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LSR7bWRvVmVyc2lvbn0ueHNkIj4KLSAgPGlkPmFwcHNlcnZlckE8L2lkPgotICA8Zm9ybWF0cz4KLSAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgotICA8L2Zvcm1hdHM+Ci0gIDxjb21wb25lbnREZXNjcmlwdG9ycz4KLSAgICA8Y29tcG9uZW50RGVzY3JpcHRvcj5zcmMvYXNzZW1ibHkvY29tcG9uZW50LnhtbDwvY29tcG9uZW50RGVzY3JpcHRvcj4KLSAgPC9jb21wb25lbnREZXNjcmlwdG9ycz4KLSAgPGRlcGVuZGVuY3lTZXRzPgotICAgIDxkZXBlbmRlbmN5U2V0PgotICAgICAgPG91dHB1dERpcmVjdG9yeT4vbGliPC9vdXRwdXREaXJlY3Rvcnk+Ci0gICAgICA8aW5jbHVkZXM+Ci0gICAgICAgIDxpbmNsdWRlPmFwcGxpY2F0aW9uOmFwcHNlcnZlckE8L2luY2x1ZGU+Ci0gICAgICA8L2luY2x1ZGVzPgotICAgIDwvZGVwZW5kZW5jeVNldD4KLSAgPC9kZXBlbmRlbmN5U2V0cz4KLTwvYXNzZW1ibHk+Ci0rLS0tLS0KLQotICBBbmQgdGhlIGNvcnJlc3BvbmRpbmcgYXNzZW1ibHkgZGVzY3JpcHRvciBmb3IgdGhlIGFwcHNlcnZlciBCIHRoZW4gd291bGQgYmU6Ci0KLSstLS0tLQotPGFzc2VtYmx5IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFzc2VtYmx5LXBsdWdpbi9hc3NlbWJseS8ke21kb1ZlcnNpb259IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0ke21kb1ZlcnNpb259LnhzZCI+Ci0gIDxpZD5hcHBzZXJ2ZXJCPC9pZD4KLSAgPGZvcm1hdHM+Ci0gICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KLSAgPC9mb3JtYXRzPgotICA8Y29tcG9uZW50RGVzY3JpcHRvcnM+Ci0gICAgPGNvbXBvbmVudERlc2NyaXB0b3I+c3JjL2Fzc2VtYmx5L2NvbXBvbmVudC54bWw8L2NvbXBvbmVudERlc2NyaXB0b3I+Ci0gIDwvY29tcG9uZW50RGVzY3JpcHRvcnM+Ci0gIDxkZXBlbmRlbmN5U2V0cz4KLSAgICA8ZGVwZW5kZW5jeVNldD4KLSAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L2xpYjwvb3V0cHV0RGlyZWN0b3J5PgotICAgICAgPGluY2x1ZGVzPgotICAgICAgICA8aW5jbHVkZT5hcHBsaWNhdGlvbjphcHBzZXJ2ZXJCPC9pbmNsdWRlPgotICAgICAgPC9pbmNsdWRlcz4KLSAgICA8L2RlcGVuZGVuY3lTZXQ+Ci0gIDwvZGVwZW5kZW5jeVNldHM+Ci08L2Fzc2VtYmx5PgotKy0tLS0tCi0KLSogVGhlIFBPTQotCi0gIE5vdyB3ZSBzaG91bGQgdXBkYXRlIHRoZSBQT00gY29uZmlndXJhdGlvbiBvZiB0aGUgcHJvamVjdCBmb3IgdGhlIEFzc2VtYmx5Ci0gIFBsdWdpbiwgd2hpY2ggc2hvdWxkIGxvb2sgbGlrZToKLQotKy0tLS0tCi08cHJvamVjdD4KLSAgWy4uLl0KLSAgPGJ1aWxkPgotICAgIFsuLi5dCi0gICAgPHBsdWdpbnM+Ci0gICAgICBbLi4uXQotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9hcHBzZXJ2ZXJBLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9hcHBzZXJ2ZXJCLWFzc2VtYmx5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgIFsuLi5dCi08L3Byb2plY3Q+Ci0rLS0tLS0KLQotKiBDcmVhdGluZyBUaGUgRGlzdHJpYnV0aW9ucwotCi0gIFNpbmNlIHdlIGRpZG4ndCBjb25maWd1cmUgdGhlIGFzc2VtYmx5IHBsdWdpbiB0byBhbHdheXMgZ2VuZXJhdGUgdGhlCi0gIGNvbmZpZ3VyZWQgYXNzZW1ibGllcyBkdXJpbmcgdGhlIHByb2plY3QncyBub3JtYWwgYnVpbGQgbGlmZWN5Y2xlLCB3ZSBjcmVhdGUKLSAgdGhlIGRpc3RyaWJ1dGlvbnMgYnk6Ci0KLSstLS0tLQotICBtdm4gYXNzZW1ibHk6c2luZ2xlCi0rLS0tLS0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2V4YW1wbGVzL3NpbmdsZS91c2luZy1yZXBvc2l0b3JpZXMuYXB0LnZtIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvc2luZ2xlL3VzaW5nLXJlcG9zaXRvcmllcy5hcHQudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NGUxNzAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvZXhhbXBsZXMvc2luZ2xlL3VzaW5nLXJlcG9zaXRvcmllcy5hcHQudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMzEgKzAsMCBAQAotIC0tLS0tLQotICBVc2luZyBSZXBvc2l0b3JpZXMKLSAtLS0tLS0KLSAgRWR3aW4gUHVuemFsYW4KLSAtLS0tLS0KLSAgMjYtSnVseS0yMDA2Ci0gLS0tLS0tCi0KLX5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLX5+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotfn4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLX5+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLX5+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLX5+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLX5+IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLX5+Ci1+fiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotfn4KLX5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLX5+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi1+fiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLX5+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotfn4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotfn4gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLX5+IE5PVEU6IEZvciBoZWxwIHdpdGggdGhlIHN5bnRheCBvZiB0aGlzIGZpbGUsIHNlZToKLX5+IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2RveGlhL3JlZmVyZW5jZXMvYXB0LWZvcm1hdC5odG1sCi0KLVVzaW5nIFJlcG9zaXRvcmllcwotCi0qIEludHJvZHVjdGlvbgotCi0gIFRoZSBBc3NlbWJseSBQbHVnaW4gYWxsb3dzIHRoZSBpbmNsdXNpb24gb2YgbmVlZGVkIGFydGlmYWN0cyBmcm9tIHlvdXIgbG9jYWwKLSAgcmVwb3NpdG9yeSB0byB0aGUgZ2VuZXJhdGVkIGFyY2hpdmUuIFRoZXkgYXJlIGNvcGllZCBpbnRvIHRoZSBhc3NlbWJseSBpbiBhCi0gIGRpcmVjdG9yeSBzaW1pbGFyIHRvIHdoYXQncyBpbiB5b3VyIHJlbW90ZSByZXBvc2l0b3J5LCBjb21wbGV0ZSB3aXRoIG1ldGFkYXRhCi0gIGFuZCB0aGUgY2hlY2tzdW1zLgotCi0gIFRoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgdGhlIGNyZWF0aW9uIG9mIHJlcG9zaXRvcnkgYXJ0aWZhY3RzIGluIGFuIGFzc2VtYmx5Ci0gIHNvIHRoYXQgdGhlIGFyY2hpdmUgY2FuIGVhc2lseSBiZSB1c2VkIHRvIHVwZGF0ZSBhbiBpbnRlcm5hbCByZXBvc2l0b3J5IHdpdGgKLSAgdGhlIGFydGlmYWN0cyB1c2VkIGJ5IHlvdXIgcHJvamVjdC4KLQotKiBUaGUgQXNzZW1ibHkgRGVzY3JpcHRvcgotCi0gIEEgZnVuY3Rpb25hbCByZXBvc2l0b3J5IGFyY2hpdmUgZm9yIHlvdXIgcHJvamVjdCBjYW4gYmUgY3JlYXRlZCB3aXRoOgotCi0rLS0tLS0KLTxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvJHttZG9WZXJzaW9ufSBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktJHttZG9WZXJzaW9ufS54c2QiPgotICA8aWQ+cmVwb3NpdG9yeTwvaWQ+Ci0gIDxmb3JtYXRzPgotICAgIDxmb3JtYXQ+amFyPC9mb3JtYXQ+Ci0gIDwvZm9ybWF0cz4KLSAgPHJlcG9zaXRvcmllcz4KLSAgICA8cmVwb3NpdG9yeT4KLSAgICAgIDxpbmNsdWRlTWV0YWRhdGE+dHJ1ZTwvaW5jbHVkZU1ldGFkYXRhPgotICAgICAgPG91dHB1dERpcmVjdG9yeT5tYXZlbjI8L291dHB1dERpcmVjdG9yeT4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gIDwvcmVwb3NpdG9yaWVzPgotPC9hc3NlbWJseT4KLSstLS0tLQotCi0gIFRoZSBhYm92ZSBkZXNjcmlwdG9yIHRlbGxzIHRoZSBBc3NlbWJseSBQbHVnaW4gdG8gY3JlYXRlIGEgcmVwb3NpdG9yeS1saWtlCi0gIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaW5zaWRlIHRoZSA8PDxtYXZlbjI+Pj4gZGlyZWN0b3J5IGZyb20gd2l0aGluIHRoZQotICBnZW5lcmF0ZWQgYXJjaGl2ZS4gU2V0dGluZyA8PDxpbmNsdWRlTWV0YWRhdGE+Pj4gdG8gPDw8dHJ1ZT4+PiB3aWxsIG1ha2UgdGhlCi0gIHBsdWdpbiB0byBhbHNvIGNvcHkgbWV0YWRhdGEgaW5mb3JtYXRpb24gaW50byB0aGUgZ2VuZXJhdGVkIGFyY2hpdmUuCi0KLSogVGhlIFBPTQotCi0gIFRoZSBwb20ueG1sIGZvciB5b3VyIHByb2plY3QgaXMgdmVyeSBzaW1pbGFyIHRvIGhvdyB5b3UgY29uZmlndXJlIHRoZSBBc3NlbWJseQotICBQbHVnaW4gZm9yIG90aGVyIGRpc3RyaWJ1dGlvbiB0eXBlcy4KLQotKy0tLS0tCi08cHJvamVjdD4KLSAgWy4uLl0KLSAgPGJ1aWxkPgotICAgIFsuLi5dCi0gICAgPHBsdWdpbnM+Ci0gICAgICBbLi4uXQotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxkZXNjcmlwdG9ycz4KLSAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9hc3NlbWJseS9yZXBvc2l0b3J5LnhtbDwvZGVzY3JpcHRvcj4KLSAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgIFsuLi5dCi08L3Byb2plY3Q+Ci0rLS0tLS0KLQotKiBHZW5lcmF0aW5nIFRoZSBBc3NlbWJseSBBcmNoaXZlCi0KLSAgVGhlIGFzc2VtYmx5IGFyY2hpdmUgaXMgdGhlbiBjcmVhdGVkIHVzaW5nOgotCi0rLS0tLS0KLW12biBhc3NlbWJseTphc3NlbWJseQotKy0tLS0tCi0KLSAgVGhlIGdlbmVyYXRlZCBhcmNoaXZlIGNhbiBiZSBleHRyYWN0ZWQgdG8gYW4gaW50ZXJuYWwgcmVwb3NpdG9yeSBzbyB1c2VycyBvZgotICB5b3VyIHByb2plY3QgY2FuIGRvd25sb2FkIHRoZSBkZXBlbmRlbmNpZXMgZnJvbSBpdC4KLQotKiBFeGFtaW5pbmcgdGhlIE91dHB1dAotCi0gIFdoZW4gdGhlIE1hdmVuIGV4ZWN1dGlvbiBjb21wbGV0ZXMsIHRoZSBhcmNoaXZlIGNvbnRlbnRzIHNob3VsZCBiZSBzaW1pbGFyIHRvOgotCi0rLS0tLS0KLXRhcmdldC9hcnRpZmFjdElkLXZlcnNpb24tcmVwb3NpdG9yeS5qYXIKLWAtLSBtYXZlbjIKLSAgICB8LS0gZ3JvdXBJZAotICAgIHwgICB8LS0gbWF2ZW4tbWV0YWRhdGEueG1sCi0gICAgfCAgIHwtLSBtYXZlbi1tZXRhZGF0YS54bWwubWQ1Ci0gICAgfCAgIHwtLSBtYXZlbi1tZXRhZGF0YS54bWwuc2hhMQotICAgIHwgICBgLS0gYXJ0aWZhY3RJZAotICAgIHwgICAgICAgfC0tIG1hdmVuLW1ldGFkYXRhLnhtbAotICAgIHwgICAgICAgfC0tIG1hdmVuLW1ldGFkYXRhLnhtbC5tZDUKLSAgICB8ICAgICAgIHwtLSBtYXZlbi1tZXRhZGF0YS54bWwuc2hhMQotICAgIHwgICAgICAgYC0tIHZlcnNpb24KLSAgICB8ICAgICAgICAgICB8LS0gYXJ0aWZhY3RJZC12ZXJzaW9uLmphcgotICAgIHwgICAgICAgICAgIHwtLSBhcnRpZmFjdElkLXZlcnNpb24uamFyLm1kNQotICAgIHwgICAgICAgICAgIHwtLSBhcnRpZmFjdElkLXZlcnNpb24uamFyLnNoYTEKLSAgICB8ICAgICAgICAgICB8LS0gYXJ0aWZhY3RJZC12ZXJzaW9uLnBvbQotICAgIHwgICAgICAgICAgIHwtLSBhcnRpZmFjdElkLXZlcnNpb24ucG9tLm1kNQotICAgIHwgICAgICAgICAgIHwtLSBhcnRpZmFjdElkLXZlcnNpb24ucG9tLnNoYTEKLSAgICB8ICAgICAgICAgICB8LS0gbWF2ZW4tbWV0YWRhdGEueG1sCi0gICAgfCAgICAgICAgICAgfC0tIG1hdmVuLW1ldGFkYXRhLnhtbC5tZDUKLSAgICB8ICAgICAgICAgICBgLS0gbWF2ZW4tbWV0YWRhdGEueG1sLnNoYTEKLSAgICBgLS0gZ3JvdXBJZDIKLSAgICAgICAgYC0tIFsuLi5dCi0rLS0tLS0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2ZlYXR1cmVzLmFwdCBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2ZlYXR1cmVzLmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUyNWI1ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2FwdC9mZWF0dXJlcy5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0gIC0tLQotICBGZWF0dXJlcwotICAtLS0KLSAgSm9obiBDYXNleQotICAtLS0KLSAgMTItTWF5LTIwMDYKLSAgLS0tCi0KLX5+IExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLX5+IG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotfn4gZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLX5+IHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLX5+IHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLX5+ICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLX5+IHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLX5+Ci1+fiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotfn4KLX5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLX5+IHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi1+fiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLX5+IEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotfn4gc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotfn4gdW5kZXIgdGhlIExpY2Vuc2UuCi0KLX5+IE5PVEU6IEZvciBoZWxwIHdpdGggdGhlIHN5bnRheCBvZiB0aGlzIGZpbGUsIHNlZToKLX5+IGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2RveGlhL3JlZmVyZW5jZXMvYXB0LWZvcm1hdC5odG1sCi0KLUZlYXR1cmVzCi0KLSAgVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIHBsdWdpbiBjYW4gYmUgZm91bmQge3t7Li9wcm9qZWN0LXN1bW1hcnkuaHRtbH1oZXJlfX0uCi0KLSAgPE5PVEU6IEZlYXR1cmVzIHdpdGggbm8gdmVyc2lvbiBpbmZvcm1hdGlvbiBoYXZlIGJlZW4gcHJlc2VudCBzaW5jZSB0aGUgZmlyc3QgZmluYWwgcmVsZWFzZSBvZiB0aGUgcGx1Z2luLj4KLQotICAqIEluY2x1c2lvbiBvZiBkZXBlbmRlbmNpZXMsIG1vZHVsZXMgPFsyLjFdPiwgZmlsZS1zZXRzLCBhbmQgaW5kaXZpZHVhbCBmaWxlcwotCi0gICogSW5jbHVzaW9uIG9mIHByb2plY3Qgd2Vic2l0ZSBkb2N1bWVudGF0aW9uIDxbMi4xXT4KLQotICAqIEZsZXhpYmxlIGRpcmVjdG9yeSBzdHJ1Y3R1cmVzIGZvciBhc3NlbWJseSBlbGVtZW50cwotCi0gICogQWxsIGFzc2VtYmx5IGluY2x1c2lvbnMgY29udHJvbGxlZCBieSBpbmNsdWRlL2V4Y2x1ZGUgcGF0dGVybiBzZXRzCi0KLSAgKiBPcHRpb24gdG8gdW5wYWNrIGFydGlmYWN0IGZpbGVzIGludG8gdGhlIGFzc2VtYmx5IDxbZGVwcmVjYXRlZCBpbiAyLjJdPgotCi0gICogUHJvamVjdCBtb2R1bGVzIGNhbiBiZSBpbmNsdWRlZCBhcyBzb3VyY2UgZmlsZXMgb3IgaW4gYmluYXJ5IGZvcm0gPFsyLjFdPgotCi0gICogUmV1c2FibGUgYXNzZW1ibHktZGVzY3JpcHRvciBjb21wb25lbnRzIDxbMi4xXT4KLQotICAqIFN1cHBvcnRlZCBhcmNoaXZlIGZvcm1hdHMgaW5jbHVkZTogemlwLCB0YXIsIHRhci5neiAob3IgdGd6KSwgdGFyLmJ6MiAob3IgdGJ6MiksIGphciwgZGlyLCB3YXIKLSAgIChhbmQgYW55IG90aGVyIGZvcm1hdCB0aGF0IHRoZSBBcmNoaXZlTWFuYWdlciBoYXMgYmVlbiBjb25maWd1cmVkIGZvcikuCi0KLQotICAqIERpcmVjdG9yeS1vbmx5IGFzc2VtYmxpZXMKLQotICAqIEZpbHRlcmluZyBhbmQgbGluZS1lbmRpbmcgY29udmVyc2lvbiBmb3IgZmlsZS1zZXRzIGFuZCBpbmRpdmlkdWFsIGZpbGVzCi0KLSAgKiBEaXJlY3RvcnkgYW5kIGZpbGUgYXR0cmlidXRlcyAoPG1vZGVzPikgPFsyLjFdPgotCi0gICogQXJ0aWZhY3QgZmlsZW5hbWUgbWFwcGluZyB3aXRoIGV4cHJlc3Npb24gc3VwcG9ydCA8WzIuMV0+Ci0KLSAgKiBEZXNjcmlwdG9yIGludGVycG9sYXRpb24gdXNpbmcgY3VycmVudCBwcm9qZWN0IGFuZCBvdGhlciBhc3NlbWJseSBkZXNjcmlwdG9yIGluZm9ybWF0aW9uIDxbMi4xXT4KLQotICAqIEVtYmVkZGVkIE1hdmVuIHJlcG9zaXRvcnkgY3JlYXRpb24gd2l0aCBhcnRpZmFjdCB2ZXJzaW9uIGFsaWdubWVudCA8WzIuMV0+Ci0KLSAgKiBTZWN1cml0eSAvIHNpZ25hdHVyZSBpbmZvcm1hdGlvbiBzdHJpcHBlZCBmcm9tIGVtYmVkZGVkIGFydGlmYWN0cyBwcmlvciB0byBpbmNsdXNpb24gPFsyLjFdPgotCi0gIFtdCi0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2luZGV4LmFwdC52bSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L2luZGV4LmFwdC52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNkOGY5Ny4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjYgKzAsMCBAQAotICAtLS0KLSAgSW50cm9kdWN0aW9uCi0gIC0tLQotICBKb2huIENhc2V5Ci0gIEVkd2luIFB1bnphbGFuCi0gIC0tLQotICAyMDEzLTA3LTIyCi0gIC0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi0ke3Byb2plY3QubmFtZX0KLQotKiBJbnRyb2R1Y3Rpb24KLQotICBUaGUgQXNzZW1ibHkgUGx1Z2luIGZvciBNYXZlbiBpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYWxsb3cgdXNlcnMgdG8KLSAgYWdncmVnYXRlIHRoZSBwcm9qZWN0IG91dHB1dCBhbG9uZyB3aXRoIGl0cyBkZXBlbmRlbmNpZXMsIG1vZHVsZXMsIHNpdGUKLSAgZG9jdW1lbnRhdGlvbiwgYW5kIG90aGVyIGZpbGVzIGludG8gYSBzaW5nbGUgZGlzdHJpYnV0YWJsZSBhcmNoaXZlLgotCi0gIFlvdXIgcHJvamVjdCBjYW4gYnVpbGQgZGlzdHJpYnV0aW9uICJhc3NlbWJsaWVzIiBlYXNpbHksIHVzaW5nIG9uZSBvZiB0aGUKLSAgY29udmVuaWVudCwge3t7Li9kZXNjcmlwdG9yLXJlZnMuaHRtbH1wcmVmYWJyaWNhdGVkIGFzc2VtYmx5IGRlc2NyaXB0b3JzfX0uCi0gIFRoZXNlIGRlc2NyaXB0b3JzIGhhbmRsZSBtYW55IGNvbW1vbiBvcGVyYXRpb25zLCBzdWNoIGFzIHBhY2thZ2luZyBhIHByb2plY3QncwotICBhcnRpZmFjdCBhbG9uZyB3aXRoIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIGludG8gYSAKLSAge3t7Li9kZXNjcmlwdG9yLXJlZnMuaHRtbCNiaW59c2luZ2xlIHppcCBhcmNoaXZlfX0uIAotICBBbHRlcm5hdGl2ZWx5LCB5b3VyIHByb2plY3QgY2FuIHByb3ZpZGUgaXRzIG93biB7e3suL2Fzc2VtYmx5Lmh0bWx9ZGVzY3JpcHRvcn19IAotICBhbmQgYXNzdW1lIGEgbXVjaCBoaWdoZXIgbGV2ZWwgb2YgY29udHJvbCBvdmVyIGhvdyBkZXBlbmRlbmNpZXMsIG1vZHVsZXMsIAotICBmaWxlLXNldHMsIGFuZCBpbmRpdmlkdWFsIGZpbGVzIGFyZSBwYWNrYWdlZCBpbiB0aGUgYXNzZW1ibHkuCi0KLSAgQ3VycmVudGx5IGl0IGNhbiBjcmVhdGUgZGlzdHJpYnV0aW9ucyBpbiB0aGUgZm9sbG93aW5nIGZvcm1hdHM6Ci0KLSAgICAqIHppcAotCi0gICAgKiB0YXIKLQotICAgICogdGFyLmd6IChvciB0Z3opCi0KLSAgICAqIHRhci5iejIgKG9yIHRiejIpCi0KLSAgICAqIGphcgotCi0gICAgKiBkaXIKLQotICAgICogd2FyCi0KLSAgICAqIGFuZCBhbnkgb3RoZXIgZm9ybWF0IHRoYXQgdGhlIEFyY2hpdmVNYW5hZ2VyIGhhcyBiZWVuIGNvbmZpZ3VyZWQgZm9yCi0KLSAgSWYgeW91ciBwcm9qZWN0IHdhbnRzIHRvIHBhY2thZ2UgeW91ciBhcnRpZmFjdCBpbiBhbiB1YmVyLWphciwgdGhlIGFzc2VtYmx5Ci0gIHBsdWdpbiBwcm92aWRlcyBvbmx5IGJhc2ljIHN1cHBvcnQuIEZvciBtb3JlIGNvbnRyb2wsIHVzZSB0aGUKLSAge3t7aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1zaGFkZS1wbHVnaW4vfSBNYXZlbiBTaGFkZSBQbHVnaW59fS4KLQotICBUbyB1c2UgdGhlIEFzc2VtYmx5IFBsdWdpbiBpbiBNYXZlbiwgeW91IHNpbXBseSBuZWVkIHRvOgotCi0gICAgKiBjaG9vc2Ugb3Igd3JpdGUgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3IgdG8gdXNlLAotCi0gICAgKiBjb25maWd1cmUgdGhlIEFzc2VtYmx5IFBsdWdpbiBpbiB5b3VyIHByb2plY3QncyA8PDxwb20ueG1sPj4+LCBhbmQKLQotICAgICogcnVuICJtdm4gYXNzZW1ibHk6c2luZ2xlIiBvbiB5b3VyIHByb2plY3QuCi0KLSAgVG8gd3JpdGUgeW91ciBvd24gY3VzdG9tIGFzc2VtYmx5LCB5b3Ugd2lsbCBuZWVkIHRvIHJlZmVyIHRvIHRoZQotICB7e3suL2Fzc2VtYmx5Lmh0bWx9QXNzZW1ibHkgRGVzY3JpcHRvciBGb3JtYXR9fSByZWZlcmVuY2UuCi0KLSogV2hhdCBpcyBhbiBBc3NlbWJseT8KLQotICBBbiAiYXNzZW1ibHkiIGlzIGEgZ3JvdXAgb2YgZmlsZXMsIGRpcmVjdG9yaWVzLCBhbmQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlCi0gIGFzc2VtYmxlZCBpbnRvIGFuIGFyY2hpdmUgZm9ybWF0IGFuZCBkaXN0cmlidXRlZC4gIEZvciBleGFtcGxlLCBhc3N1bWUgdGhhdAotICBhIE1hdmVuIHByb2plY3QgZGVmaW5lcyBhIHNpbmdsZSBKQVIgYXJ0aWZhY3QgdGhhdCBjb250YWlucyBib3RoIGEgY29uc29sZQotICBhcHBsaWNhdGlvbiBhbmQgYSBTd2luZyBhcHBsaWNhdGlvbi4gIFN1Y2ggYSBwcm9qZWN0IGNvdWxkIGRlZmluZSB0d28KLSAgImFzc2VtYmxpZXMiIHRoYXQgYnVuZGxlIHRoZSBhcHBsaWNhdGlvbiB3aXRoIGEgZGlmZmVyZW50IHNldCBvZiBzdXBwb3J0aW5nCi0gIHNjcmlwdHMgYW5kIGRlcGVuZGVuY3kgc2V0cy4gIE9uZSBhc3NlbWJseSB3b3VsZCBiZSB0aGUgYXNzZW1ibHkgZm9yIHRoZQotICBjb25zb2xlIGFwcGxpY2F0aW9uLCBhbmQgdGhlIG90aGVyIGFzc2VtYmx5IGNvdWxkIGJlIGEgU3dpbmcgYXBwbGljYXRpb24KLSAgYnVuZGxlZCB3aXRoIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHNldCBvZiBkZXBlbmRlbmNpZXMuCi0KLSAgVGhlIEFzc2VtYmx5IFBsdWdpbiBwcm92aWRlcyBhIGRlc2NyaXB0b3IgZm9ybWF0IHdoaWNoIGFsbG93cyB5b3UgdG8gZGVmaW5lCi0gIGFuIGFyYml0cmFyeSBhc3NlbWJseSBvZiBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgZnJvbSBhIHByb2plY3QuICBGb3IgZXhhbXBsZSwKLSAgaWYgeW91ciBNYXZlbiBwcm9qZWN0IGNvbnRhaW5zIHRoZSBkaXJlY3RvcnkgInNyYy9tYWluL2JpbiIsIHlvdSBjYW4KLSAgaW5zdHJ1Y3QgdGhlIEFzc2VtYmx5IFBsdWdpbiB0byBjb3B5IHRoZSBjb250ZW50cyBvZiB0aGlzIGRpcmVjdG9yeSB0byB0aGUKLSAgImJpbiIgZGlyZWN0b3J5IG9mIGFuIGFzc2VtYmx5IGFuZCB0byBjaGFuZ2UgdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBmaWxlcyBpbgotICB0aGUgImJpbiIgZGlyZWN0b3J5IHRvIFVOSVggbW9kZSA3NTUuICBUaGUgcGFyYW1ldGVycyBmb3IgY29uZmlndXJpbmcgdGhpcwotICBiZWhhdmlvciBhcmUgc3VwcGxpZWQgdG8gdGhlIEFzc2VtYmx5IFBsdWdpbiBieSB3YXkgb2YgdGhlCi0gIHt7ey4vYXNzZW1ibHkuaHRtbH1hc3NlbWJseSBkZXNjcmlwdG9yfX0uCi0KLQotKiBHb2FscwotCi0gIFRoZSBtYWluIGdvYWwgaW4gdGhlIGFzc2VtYmx5IHBsdWdpbiBpcyB0aGUge3t7Li9zaW5nbGUtbW9qby5odG1sfXNpbmdsZX19IGdvYWwuIEl0IGlzIHVzZWQgdG8gY3JlYXRlIGFsbCBhc3NlbWJsaWVzLgotICA8PEFsbCBvdGhlciBnb2FscyBhcmUgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuPj4KLQotICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZ29hbHMgdGhhdCBhcmUgYXZhaWxhYmxlIGluIHRoZSBBc3NlbWJseSBQbHVnaW4sCi0gIHNlZSB7e3suL3BsdWdpbi1pbmZvLmh0bWx9dGhlIHBsdWdpbiBkb2N1bWVudGF0aW9uIHBhZ2V9fS4KLQotICBVc2FnZSBvZiB0aGUgPDw8YXNzZW1ibHk6YXNzZW1ibHk+Pj4sIDw8PGFzc2VtYmx5OmF0dGFjaGVkPj4+LAotICA8PDxhc3NlbWJseTpkaXJlY3Rvcnk+Pj4sIGFuZCA8PDxhc3NlbWJseTpkaXJlY3RvcnktaW5saW5lPj4+IGFyZSA8PGRlcHJlY2F0ZWQ+PiwKLSAgc2luY2UgdGhleSB3cmVhayBoYXZvYyB3aXRoIG5vcm1hbCBidWlsZCBwcm9jZXNzZXMgYW5kIHByb21vdGUgbm9uLXN0YW5kYXJkCi0gIGJ1aWxkIHByYWN0aWNlcy4KLQotICBUaGUgPDw8YXNzZW1ibHk6c2luZ2xlLWRpcmVjdG9yeT4+PiBnb2FsIGlzIHJlZHVuZGFudCwgYW5kIGhhcyBiZWVuIDw8ZGVwcmVjYXRlZD4+Ci0gIGluIGZhdm9yIG9mIHRoZSA8PDxkaXI+Pj4gYXNzZW1ibHkgZm9ybWF0LgotCi0gIEZpbmFsbHksIHRoZSA8PDxhc3NlbWJseTp1bnBhY2s+Pj4gZ29hbCBoYXMgYmVlbiA8PGRlcHJlY2F0ZWQ+PiBpbiBmYXZvciBvZiB0aGUgZmFyCi0gIG1vcmUgY29tcHJlaGVuc2l2ZSB7e3todHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWRlcGVuZGVuY3ktcGx1Z2luL31NYXZlbgotICBEZXBlbmRlbmN5IFBsdWdpbn19LgotCi0KLSogQXNzZW1ibHkgYW5kIENvbXBvbmVudCBEZXNjcmlwdG9yIFNjaGVtYXMgKFhTRCkKLQotICAqIHt7e2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMy54c2R9aHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4zLnhzZH19LAotICAgIHt7e2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9jb21wb25lbnQtMS4xLjMueHNkfWh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9jb21wb25lbnQtMS4xLjMueHNkfX0gKGZvciB2ZXJzaW9uIDIuNS40IGFuZCBoaWdoZXIpCi0gICoge3t7aHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4yLnhzZH1odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjIueHNkfX0sCi0gICAge3t7aHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2NvbXBvbmVudC0xLjEuMi54c2R9aHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2NvbXBvbmVudC0xLjEuMi54c2R9fSAoZm9yIHZlcnNpb24gMi4yIGFuZCBoaWdoZXIpCi0KLSAgKiB7e3todHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4xLjEueHNkfWh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMS54c2R9fSwKLSAgICB7e3todHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvY29tcG9uZW50LTEuMS4xLnhzZH1odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvY29tcG9uZW50LTEuMS4xLnhzZH19IChmb3IgdmVyc2lvbiAyLjItYmV0YS00IC0gMi4yLWJldGEtNSkKLQotICAqIHt7e2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2R9aHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZH19LAotICAgIHt7e2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9jb21wb25lbnQtMS4xLjAueHNkfWh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9jb21wb25lbnQtMS4xLjAueHNkfX0gKGZvciB2ZXJzaW9uIDIuMi1iZXRhLTEgLSAyLjItYmV0YS0zKQotCi0gICoge3t7aHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMC4wLnhzZH1odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvYXNzZW1ibHktMS4wLjAueHNkfX0sCi0gICAge3t7aHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2NvbXBvbmVudC0xLjAuMC54c2R9aHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2NvbXBvbmVudC0xLjAuMC54c2R9fSAoZm9yIHZlcnNpb24gMi4xIGFuZCBsb3dlcikKLQotICBbXQotCi0KLSogVXNhZ2UKLQotICBHZW5lcmFsIGluc3RydWN0aW9ucyBvbiBob3cgdG8gdXNlIHRoZSBBc3NlbWJseSBQbHVnaW4gY2FuIGJlIGZvdW5kIG9uIHRoZSB7e3suL3VzYWdlLmh0bWx9dXNhZ2UgcGFnZX19LiBTb21lIG1vcmUKLSAgc3BlY2lmaWMgdXNlIGNhc2VzIGFyZSBkZXNjcmliZWQgaW4gdGhlIGV4YW1wbGVzIGdpdmVuIGJlbG93LiBMYXN0IGJ1dCBub3QgbGVhc3QsIHVzZXJzIG9jY2FzaW9uYWxseSBjb250cmlidXRlCi0gIGFkZGl0aW9uYWwgZXhhbXBsZXMsIHRpcHMgb3IgZXJyYXRhIHRvIHRoZQotICB7e3todHRwOi8vZG9jcy5jb2RlaGF1cy5vcmcvZGlzcGxheS9NQVZFTlVTRVIvQXNzZW1ibHkrUGx1Z2lufXBsdWdpbidzIHdpa2kgcGFnZX19LgotCi0gIEluIGNhc2UgeW91IHN0aWxsIGhhdmUgcXVlc3Rpb25zIHJlZ2FyZGluZyB0aGUgcGx1Z2luJ3MgdXNhZ2UsIHBsZWFzZSBoYXZlIGEgbG9vayBhdCB0aGUge3t7Li9mYXEuaHRtbH1GQVF9fSBhbmQgZmVlbAotICBmcmVlIHRvIGNvbnRhY3QgdGhlIHt7ey4vbWFpbC1saXN0cy5odG1sfXVzZXIgbWFpbGluZyBsaXN0fX0uIFRoZSBwb3N0cyB0byB0aGUgbWFpbGluZyBsaXN0IGFyZSBhcmNoaXZlZCBhbmQgY291bGQKLSAgYWxyZWFkeSBjb250YWluIHRoZSBhbnN3ZXIgdG8geW91ciBxdWVzdGlvbiBhcyBwYXJ0IG9mIGFuIG9sZGVyIHRocmVhZC4gSGVuY2UsIGl0IGlzIGFsc28gd29ydGggYnJvd3Npbmcvc2VhcmNoaW5nCi0gIHRoZSB7e3suL21haWwtbGlzdHMuaHRtbH1tYWlsIGFyY2hpdmV9fS4KLQotICBJZiB5b3UgZmVlbCBsaWtlIHRoZSBwbHVnaW4gaXMgbWlzc2luZyBhIGZlYXR1cmUgb3IgaGFzIGEgZGVmZWN0LCB5b3UgY2FuIGZpbGwgYSBmZWF0dXJlIHJlcXVlc3Qgb3IgYnVnIHJlcG9ydCBpbiBvdXIKLSAge3t7Li9pc3N1ZS10cmFja2luZy5odG1sfWlzc3VlIHRyYWNrZXJ9fS4gV2hlbiBjcmVhdGluZyBhIG5ldyBpc3N1ZSwgcGxlYXNlIHByb3ZpZGUgYSBjb21wcmVoZW5zaXZlIGRlc2NyaXB0aW9uIG9mIHlvdXIKLSAgY29uY2Vybi4gRXNwZWNpYWxseSBmb3IgZml4aW5nIGJ1Z3MgaXQgaXMgY3J1Y2lhbCB0aGF0IHRoZSBkZXZlbG9wZXJzIGNhbiByZXByb2R1Y2UgeW91ciBwcm9ibGVtLiBGb3IgdGhpcyByZWFzb24sCi0gIGVudGlyZSBkZWJ1ZyBsb2dzLCBQT01zIG9yIG1vc3QgcHJlZmVyYWJseSBsaXR0bGUgZGVtbyBwcm9qZWN0cyBhdHRhY2hlZCB0byB0aGUgaXNzdWUgYXJlIHZlcnkgbXVjaCBhcHByZWNpYXRlZC4KLSAgT2YgY291cnNlLCBwYXRjaGVzIGFyZSB3ZWxjb21lLCB0b28uIENvbnRyaWJ1dG9ycyBjYW4gY2hlY2sgb3V0IHRoZSBwcm9qZWN0IGZyb20gb3VyCi0gIHt7ey4vc291cmNlLXJlcG9zaXRvcnkuaHRtbH1zb3VyY2UgcmVwb3NpdG9yeX19IGFuZCB3aWxsIGZpbmQgc3VwcGxlbWVudGFyeSBpbmZvcm1hdGlvbiBpbiB0aGUKLSAge3t7aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvZ3VpZGVzL2RldmVsb3BtZW50L2d1aWRlLWhlbHBpbmcuaHRtbH1ndWlkZSB0byBoZWxwaW5nIHdpdGggTWF2ZW59fS4KLQotCi0qIEV4YW1wbGVzCi0KLSAgVG8gcHJvdmlkZSB5b3Ugd2l0aCBiZXR0ZXIgdW5kZXJzdGFuZGluZyBvbiBzb21lIHVzYWdlcyBvZiB0aGUgQXNzZW1ibHkKLSAgUGx1Z2luLCB5b3UgY2FuIHRha2UgYSBsb29rIGludG8gdGhlIGV4YW1wbGVzIHdoaWNoIGNhbiBiZSBmb3VuZAotICB7e3suL2V4YW1wbGVzL2luZGV4Lmh0bWx9aGVyZX19LgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0LnZtIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0LnZtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTQxM2RmLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvYXB0L3VzYWdlLmFwdC52bQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0gLS0tLS0tCi0gVXNhZ2UKLSAtLS0tLS0KLSBKb2huIENhc2V5Ci0gLS0tLS0tCi0gMjAxMS0wMi0wNwotIC0tLS0tLQotCi1+fiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi1+fiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLX5+IGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi1+fiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi1+fiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi1+fiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi1+fiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci1+fgotfn4gICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLX5+Ci1+fiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1+fiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotfn4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1+fiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLX5+IHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLX5+IHVuZGVyIHRoZSBMaWNlbnNlLgotCi1+fiBOT1RFOiBGb3IgaGVscCB3aXRoIHRoZSBzeW50YXggb2YgdGhpcyBmaWxlLCBzZWU6Ci1+fiBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9kb3hpYS9yZWZlcmVuY2VzL2FwdC1mb3JtYXQuaHRtbAotCi1Vc2FnZQotCi0gIFRvIGhhbmRsZSBmaWx0ZXJpbmcgdGhpcyB2ZXJzaW9uIG9mIE1hdmVuIEFzc2VtYmx5IFBsdWdpbiB1c2VzCi0gIHt7e2h0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3NoYXJlZC9tYXZlbi1maWx0ZXJpbmcvaW5kZXguaHRtbH1NYXZlbiBGaWx0ZXJpbmd9fSAke21hdmVuRmlsdGVyaW5nVmVyc2lvbn0uCi0KLSAgVG8gaGFuZGxlIGFyY2hpdmluZyB0aGlzIHZlcnNpb24gb2YgTWF2ZW4gQXNzZW1ibHkgUGx1Z2luIHVzZXMKLSAge3t7aHR0cDovL21hdmVuLmFwYWNoZS5vcmcvc2hhcmVkL21hdmVuLWFyY2hpdmVyL2luZGV4Lmh0bWx9TWF2ZW4gQXJjaGl2ZXJ9fSAke21hdmVuQXJjaGl2ZXJWZXJzaW9ufS4KLQotICBUaGlzIGRvY3VtZW50IGlzIGludGVuZGVkIHRvIHByb3ZpZGUgaW5zdHJ1Y3Rpb25zIGZvciB1c2luZyB0aGUKLSAgbWF2ZW4tYXNzZW1ibHktcGx1Z2luLiBJbiBvcmRlciBmb3IgdGhpcyBkaXNjdXNzaW9uIHRvIGJlIHVzZWZ1bCwgaXQncwotICBjcml0aWNhbCB0byBjb3ZlciB0d28gdG9waWNzOiBjb25maWd1cmF0aW9uIG9mIHRoZSBwbHVnaW4gLSBib3RoIGluc2lkZSB0aGUKLSAgUE9NIGFuZCwgd2hlcmUgcG9zc2libGUsIGZyb20gdGhlIGNvbW1hbmQgbGluZSAtIGFuZCB0aGUgZGlmZmVyZW50IGV4ZWN1dGlvbgotICBzdHlsZXMuIEZvciB0aGUgc2FrZSBvZiBjbGFyaXR5LCB3ZSdsbCBjb3ZlciBjb25maWd1cmF0aW9uIGJlZm9yZSBleGVjdXRpb24uCi0KLQotKiBEZXByZWNhdGlvbiBub3RpY2UKLQotICBBbGwgZ29hbHMgZXhjZXB0IDw8PGFzc2VtYmx5OnNpbmdsZT4+PiBoYXZlIGJlZW4gPDxkZXByZWNhdGVkPj4uIFNlZSB0aGUKLSAge3t7Li9pbmRleC5odG1sfWludHJvZHVjdGlvbiBwYWdlfX0gZm9yIG1vcmUgZGV0YWlscy4KLQotCi0qIENvbmZpZ3VyYXRpb24KLQotICBHZXR0aW5nIHN0YXJ0ZWQgd2l0aCB0aGUgQXNzZW1ibHkgUGx1Z2luIGlzIHByZXR0eSBzaW1wbGUuIElmIHlvdSB3YW50IHRvIHVzZQotICBvbmUgb2YgdGhlIHByZWZhYnJpY2F0ZWQgYXNzZW1ibHkgZGVzY3JpcHRvcnMsIHlvdSBjb25maWd1cmUgd2hpY2ggZGVzY3JpcHRvcgotICB0byB1c2Ugd2l0aCB0aGUgXDw8PDxkZXNjcmlwdG9yUmVmc1w+Pj4+L1w8PDw8ZGVzY3JpcHRvclJlZlw+Pj4+IHBhcmFtZXRlci4KLSAgSWYgeW91IHdhbnQgdG8gdXNlIGEgY3VzdG9tIGFzc2VtYmx5IGRlc2NyaXB0b3IsIHlvdSBjb25maWd1cmUgdGhlIHBhdGggdG8geW91cgotICBkZXNjcmlwdG9yIHVzaW5nIHRoZSBcPDw8PGRlc2NyaXB0b3JzXD4+Pj4vXDw8PDxkZXNjcmlwdG9yXD4+Pj4gcGFyYW1ldGVyLgotCi0gIE5vdGUgdGhhdCBhIHNpbmdsZSBpbnZvY2F0aW9uIG9mIHRoZSBBc3NlbWJseSBQbHVnaW4gY2FuIGFjdHVhbGx5Ci0gIHByb2R1Y2UgYXNzZW1ibGllcyBmcm9tIG11bHRpcGxlIGRlc2NyaXB0b3JzLCBhbGxvd2luZyB5b3UgbWF4aW11bSBmbGV4aWJpbGl0eQotICB0byBjdXN0b21pemUgdGhlIHN1aXRlIG9mIGJpbmFyaWVzIHlvdXIgcHJvamVjdCBwcm9kdWNlcy4gV2hlbiB0aGUgYXNzZW1ibHkgaXMKLSAgY3JlYXRlZCBpdCB3aWxsIHVzZSB0aGUgYXNzZW1ibHlJZCBhcyB0aGUgYXJ0aWZhY3QncyBjbGFzc2lmaWVyIGFuZCB3aWxsIGF0dGFjaAotICB0aGUgY3JlYXRlZCBhc3NlbWJseSB0byB0aGUgcHJvamVjdCBzbyB0aGF0IGl0IHdpbGwgYmUgdXBsb2FkZWQgaW50byB0aGUgcmVwb3NpdG9yeQotICBvbiB0aGUgaW5zdGFsbCBhbmQgZGVwbG95IGdvYWxzLgotCi0gIEZvciBleGFtcGxlLCBpbWFnaW5lIHRoYXQgb3VyIHByb2plY3QgcHJvZHVjZXMgYSBKQVIuIElmIHdlIHdhbnQgdG8gY3JlYXRlIGFuCi0gIGFzc2VtYmx5IGJpbmFyeSB0aGF0IGluY2x1ZGVzIG91ciBwcm9qZWN0J3MgZGVwZW5kZW5jaWVzLCB3ZSBjYW4gdGFrZQotICBhZHZhbnRhZ2Ugb2Ygb25lIG9mIHRoZSBBc3NlbWJseSBQbHVnaW4ncyBwcmVmYWJyaWNhdGVkIGRlc2NyaXB0b3JzLiBZb3UKLSAgY29uZmlndXJlIGl0IGFzIGZvbGxvd3MgaW4geW91ciBwcm9qZWN0J3MgPDw8cG9tLnhtbD4+PjoKLSAgCi0rLS0tKwotPHByb2plY3Q+Ci0gIFsuLi5dCi0gIDxidWlsZD4KLSAgICBbLi4uXQotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPCEtLSBOT1RFOiBXZSBkb24ndCBuZWVkIGEgZ3JvdXBJZCBzcGVjaWZpY2F0aW9uIGJlY2F1c2UgdGhlIGdyb3VwIGlzCi0gICAgICAgICAgICAgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zIC4uLndoaWNoIGlzIGFzc3VtZWQgYnkgZGVmYXVsdC4KLSAgICAgICAgIC0tPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgWy4uLl0KLTwvcHJvamVjdD4KLSstLS0rCi0KLSAgTm90ZSB0aGF0IHRoZSBBc3NlbWJseSBQbHVnaW4gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IG11bHRpcGxlCi0gIDw8PGRlc2NyaXB0b3JSZWZzPj4+IGF0IG9uY2UsIHRvIHByb2R1Y2UgbXVsdGlwbGUgdHlwZXMgb2YgYXNzZW1ibGllcyBpbiBhCi0gIHNpbmdsZSBpbnZvY2F0aW9uLgotICAKLSAgQWx0ZXJuYXRpdmVseSwgd2UndmUgY3JlYXRlZCBhIGN1c3RvbSBhc3NlbWJseSBkZXNjcmlwdG9yIGNhbGxlZAotICA8PDxzcmMueG1sPj4+IGluIHRoZSA8PDxzcmMvYXNzZW1ibHk+Pj4gZGlyZWN0b3J5IChzZWUgdGhlCi0gIHt7e1Jlc291cmNlc31SZXNvdXJjZXN9fSBzZWN0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uKS4gV2UgY2FuIHRlbGwgdGhlCi0gIEFzc2VtYmx5IFBsdWdpbiB0byB1c2UgdGhhdCBpbnN0ZWFkOgotICAKLSstLS0rCi08cHJvamVjdD4KLSAgWy4uLl0KLSAgPGJ1aWxkPgotICAgIFsuLi5dCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL2Fzc2VtYmx5L3NyYy54bWw8L2Rlc2NyaXB0b3I+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9ycz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICBbLi4uXQotPC9wcm9qZWN0PgotKy0tLSsKLQotICBBZ2Fpbiwgbm90ZSB0aGF0IHdlIGNvdWxkIHNwZWNpZnkgbXVsdGlwbGUgY3VzdG9tIGFzc2VtYmx5IGRlc2NyaXB0b3JzIGhlcmUuCi0gIEFkZGl0aW9uYWxseSwgaXQncyBwb3NzaWJsZSB0byBzcGVjaWZ5IGEgbWl4dHVyZSBvZiA8PDxkZXNjcmlwdG9ycz4+PiBhbmQKLSAgPDw8ZGVzY3JpcHRvclJlZnM+Pj4gd2l0aGluIHRoZSBzYW1lIGNvbmZpZ3VyYXRpb24uCi0gIAotICA8PE5vdGU6Pj4gTWFueSBvdGhlciBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBmb3IgdGhlIHZhcmlvdXMgZ29hbHMKLSAgaW4gdGhlIEFzc2VtYmx5IFBsdWdpbi4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0aGUKLSAge3t7Li9leGFtcGxlcy9pbmRleC5odG1sfWV4YW1wbGVzIHNlY3Rpb259fSBvciB0aGUge3t7Li9wbHVnaW4taW5mby5odG1sfXBsdWdpbgotICBwYXJhbWV0ZXIgZG9jdW1lbnRhdGlvbn19LgotCi0KLSogRXhlY3V0aW9uOiBCdWlsZGluZyBhbiBBc3NlbWJseQotCi0gIE9uY2UgeW91J3ZlIGNvbmZpZ3VyZWQgdGhlIHZhcmlvdXMgPDw8ZGVzY3JpcHRvcnM+Pj4gYW5kIDw8PGRlc2NyaXB0b3JSZWZzPj4+Ci0gIGZvciB0aGUgYXNzZW1ibGllcyB5b3Ugd2FudCB0aGUgcHJvamVjdCB0byBwcm9kdWNlLCBpdCdzIHRpbWUgdG8gYnVpbGQgdGhlbS4KLSAgCi0gIEluIG1vc3QgY2FzZXMsIHlvdSdsbCB3YW50IHRvIG1ha2Ugc3VyZSB5b3VyIGFzc2VtYmxpZXMgYXJlIGNyZWF0ZWQgYXMgcGFydAotICBvZiB5b3VyIG5vcm1hbCBidWlsZCBwcm9jZXNzLiBUaGlzIGVuc3VyZXMgdGhlIGFzc2VtYmx5IGFyY2hpdmVzIGFyZSBtYWRlIAotICBhdmFpbGFibGUgZm9yIGluc3RhbGxhdGlvbiBhbmQgZGVwbG95bWVudCwgYW5kIHRoYXQgdGhleSBhcmUgY3JlYXRlZCBkdXJpbmcKLSAgdGhlIHJlbGVhc2Ugb2YgeW91ciBwcm9qZWN0LiBUaGlzIGlzIGhhbmRsZWQgYnkgdGhlIDw8PGFzc2VtYmx5OnNpbmdsZT4+PiBnb2FsLgotCi0gIFRvIGJpbmQgdGhlIDw8PHNpbmdsZT4+PiBnb2FsIHRvIGEgcHJvamVjdCdzIGJ1aWxkIGxpZmVjeWNsZSwgeW91IGNhbiBhZGQKLSAgdGhpcyBjb25maWd1cmF0aW9uIChhc3N1bWluZyB5b3UncmUgdXNpbmcgdGhlIDw8PGphci13aXRoLWRlcGVuZGVuY2llcz4+PgotICBwcmVmYWJyaWNhdGVkIGRlc2NyaXB0b3IpOgotICAKLSstLS0rCi08cHJvamVjdD4KLSAgWy4uLl0KLSAgPGJ1aWxkPgotICAgIFsuLi5dCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgotICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+amFyLXdpdGgtZGVwZW5kZW5jaWVzPC9kZXNjcmlwdG9yUmVmPgotICAgICAgICAgIDwvZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5tYWtlLWFzc2VtYmx5PC9pZD4gPCEtLSB0aGlzIGlzIHVzZWQgZm9yIGluaGVyaXRhbmNlIG1lcmdlcyAtLT4KLSAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4gPCEtLSBiaW5kIHRvIHRoZSBwYWNrYWdpbmcgcGhhc2UgLS0+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgWy4uLl0KLTwvcHJvamVjdD4KLSstLS0rCi0KLSAgVGhlbiwgdG8gY3JlYXRlIGEgcHJvamVjdCBhc3NlbWJseSwgc2ltcGxlIGV4ZWN1dGUgdGhlIG5vcm1hbCA8PDxwYWNrYWdlPj4+Ci0gIHBoYXNlIGZyb20gdGhlIGRlZmF1bHQgbGlmZWN5Y2xlOgotICAKLSstLS0rCi1tdm4gcGFja2FnZQotKy0tLSsKLQotICBXaGVuIHRoaXMgYnVpbGQgY29tcGxldGVzLCB5b3Ugc2hvdWxkIHNlZSBhIGZpbGUgaW4gdGhlIDw8PHRhcmdldD4+PiBkaXJlY3Rvcnkgd2l0aAotICBhIG5hbWUgc2ltaWxhciB0byB0aGUgZm9sbG93aW5nOgotICAKLSstLS0rCi10YXJnZXQvc2FtcGxlLTEuMC1TTkFQU0hPVC1qYXItd2l0aC1kZXBlbmRlbmNpZXMuamFyCi0rLS0tKwotCi0gIE5vdGljZSB0aGUgYXJ0aWZhY3QgY2xhc3NpZmllciwgYmV0d2VlbiB0aGUgZW5kIG9mIHRoZSB2ZXJzaW9uIGFuZCB0aGUKLSAgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGV4dGVuc2lvbiwgPDw8amFyLXdpdGgtZGVwZW5kZW5jaWVzPj4+LiBUaGlzIGlzIHRoZQotICA8PDxpZD4+PiBvZiB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciB1c2VkIHRvIGNyZWF0ZSB0aGlzIGFydGlmYWN0LgotICAKLSoqIEdPVENIQSEKLQotICBJbiBtb3N0IGNhc2VzLCB0aGUgPDw8c2luZ2xlPj4+IGdvYWwgc2hvdWxkIGJlIGJvdW5kIHRvIHRoZSA8PDxwYWNrYWdlPj4+IHBoYXNlCi0gIG9mIHRoZSBidWlsZC4gSG93ZXZlciwgaWYgeW91ciBhc3NlbWJseSBkb2Vzbid0IHJlcXVpcmUgYmluYXJpZXMsIG9yIGlmIHlvdSBuZWVkCi0gIHRvIHVzZSBvbmUgYXNzZW1ibHkgYXMgaW5wdXQgZm9yIGFub3RoZXIsIHlvdSBtYXkgbmVlZCB0byBjaGFuZ2UgdGhpcy4gV2hpbGUgaXQncwotICBwb3NzaWJsZSB0byBhc3NpZ24gdGhlIDw8PHNpbmdsZT4+PiBnb2FsIHRvIGFueSBwaGFzZSBvZiB0aGUgYnVpbGQgbGlmZWN5Y2xlLCB5b3Ugc2hvdWxkCi0gIGJlIGNhcmVmdWwgdG8gbWFrZSBzdXJlIHRoZSByZXNvdXJjZXMgaW5jbHVkZWQgaW4geW91ciBhc3NlbWJseSBleGlzdCBiZWZvcmUgdGhhdAotICBhc3NlbWJseSBpcyBjcmVhdGVkLgotCi0KLSogQWR2YW5jZWQgQ29uZmlndXJhdGlvbgotCi0qKiBDcmVhdGluZyBhbiBFeGVjdXRhYmxlIEpBUgotCi0gIEFzIHlvdSd2ZSBubyBkb3VidCBub3RpY2VkLCB0aGUgQXNzZW1ibHkgUGx1Z2luIGNhbiBiZSBhIHZlcnkgdXNlZnVsIHdheSB0bwotICBjcmVhdGUgYSBzZWxmLWNvbnRhaW5lZCBiaW5hcnkgYXJ0aWZhY3QgZm9yIHlvdXIgcHJvamVjdCwgYW1vbmcgbWFueSBvdGhlcgotICB0aGluZ3MuIEhvd2V2ZXIsIG9uY2UgeW91J3ZlIGNyZWF0ZWQgdGhpcyBzZWxmLWNvbnRhaW5lZCBKQVIsIHlvdSB3aWxsCi0gIHByb2JhYmx5IHdhbnQgdGhlIGFiaWxpdHkgdG8gZXhlY3V0ZSBpdCB1c2luZyB0aGUgPDw8LWphcj4+PiBKVk0gc3dpdGNoLgotICAKLSAgVG8gYWNjb21tb2RhdGUgdGhpcywgdGhlIEFzc2VtYmx5IFBsdWdpbiBzdXBwb3J0cyBjb25maWd1cmF0aW9uIG9mIGFuCi0gIDw8PFw8YXJjaGl2ZVw+Pj4+IGVsZW1lbnQgd2hpY2ggaXMgaGFuZGxlZCBieSA8PDxtYXZlbi1hcmNoaXZlcj4+PgotICAoc2VlIHt7e1Jlc291cmNlc31SZXNvdXJjZXN9fSkuIFVzaW5nIHRoaXMKLSAgY29uZmlndXJhdGlvbiwgaXQncyBlYXN5IHRvIGNvbmZpZ3VyZSB0aGUgPDw8TWFpbi1DbGFzcz4+PiBhdHRyaWJ1dGUgb2YgdGhlCi0gIEpBUiBtYW5pZmVzdDoKLSAgCi0rLS0tKwotPHByb2plY3Q+Ci0gIFsuLi5dCi0gIDxidWlsZD4KLSAgICBbLi4uXQotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIFsuLi5dCi0gICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLnNhbXBsZS5BcHA8L21haW5DbGFzcz4KLSAgICAgICAgICAgIDwvbWFuaWZlc3Q+Ci0gICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIFsuLi5dCi0gICAgICA8L3BsdWdpbj4KLSAgICAgIFsuLi5dCi08L3Byb2plY3Q+Ci0rLS0tKwotCi0gIElmIHdlIGFkZCB0aGlzIGNvbmZpZ3VyYXRpb24gdG8gdGhlIDw8PHNpbmdsZT4+PiBnb2FsIGV4YW1wbGUgYWJvdmUgYW5kCi0gIHJlYnVpbGQsIHdlIHdpbGwgc2VlIGFuIGVudHJ5IGxpa2UgdGhpcyBpbiB0aGUgPDw8TUVUQS1JTkYvTUFOSUZFU1QuTUY+Pj4gZmlsZSBvZgotICB0aGUgcmVzdWx0aW5nIEpBUjoKLSAgCi0rLS0tKwotWy4uLl0KLU1haW4tQ2xhc3M6IG9yZy5zYW1wbGUuQXBwCi0rLS0tKwotCi0gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGFkdmFuY2VkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBBc3NlbWJseSBQbHVnaW4sIHNlZQotICB0aGUge3t7UmVzb3VyY2VzfVJlc291cmNlc319IHNlY3Rpb24uCi0gIAotKiogR09UQ0hBIQotCi0gIEF0IHRoaXMgcG9pbnQsIG9ubHkgdGhlIDw8PGphcj4+PiBhbmQgPDw8d2FyPj4+IGFzc2VtYmx5IGZvcm1hdHMgc3VwcG9ydCB0aGUgPDw8XDxhcmNoaXZlXD4+Pj4KLSAgY29uZmlndXJhdGlvbiBlbGVtZW50LgotCi0KLSoge1Jlc291cmNlc30KLQotICBbWzFdXSBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB3cml0aW5nIHlvdXIgb3duIGFzc2VtYmx5IGRlc2NyaXB0b3IsIHJlYWQgdGhlIAotICAgICAgICB7e3suL2Fzc2VtYmx5Lmh0bWx9QXNzZW1ibHkgRGVzY3JpcHRvcn19Ci0gICAgICAgIAotICBbWzJdXSBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCA8PDxtYXZlbi1hcmNoaXZlcj4+PiwgbG9vawotICAgICAgICB7e3todHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9zaGFyZWQvbWF2ZW4tYXJjaGl2ZXIvaW5kZXguaHRtbH1oZXJlfX0uCi0gICAgICAgIAotICBbWzNdXSBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBhZHZhbmNlZCA8PDxtYXZlbi1hc3NlbWJseS1wbHVnaW4+Pj4KLSAgICAgICAgY29uZmlndXJhdGlvbiwgc2VlIHRoZSB7e3suL2V4YW1wbGVzL2luZGV4Lmh0bWx9ZXhhbXBsZXN9fS4KLSAgCi0gIFtdCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2ZtbC9mYXEuZm1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9mbWwvZmFxLmZtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyM2QxYy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL2ZtbC9mYXEuZm1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi0KLTxmYXFzIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9GTUwvMS4wLjEiCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvRk1MLzEuMC4xIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9mbWwtMS4wLjEueHNkIgotICBpZD0iRkFRIiB0aXRsZT0iRnJlcXVlbnRseSBBc2tlZCBRdWVzdGlvbnMiPgotICA8cGFydCBpZD0iR2VuZXJhbCI+Ci0gICAgPGZhcSBpZD0iZ2V0dGluZy1zdGFydGVkIj4KLSAgICAgIDxxdWVzdGlvbj5UaGVyZSBzZWVtIHRvIGJlIGEgbGFyZ2UgbnVtYmVyIG9mIG1vam9zIGF2YWlsYWJsZSBpbiB0aGUgYXNzZW1ibHkgcGx1Z2luLiBXaGljaCBnb2FsIHNob3VsZCBJIHVzZSB0byBidWlsZCBteSBhc3NlbWJseT88L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLSAgICAgICAgPHA+WW91IHNob3VsZCB1c2UgdGhlIDxjb2RlPnNpbmdsZTwvY29kZT4gbW9qby4gQWxsIG1vam9zIGV4Y2VwdCBmb3IgPGNvZGU+c2luZ2xlPC9jb2RlPiBoYXZlIGJlZW4gZGVwcmVjYXRlZC48L3A+Ci0gICAgICA8L2Fuc3dlcj4KLSAgICA8L2ZhcT4KLSAgICA8ZmFxIGlkPSJkZXBsb3kiPgotICAgICAgPHF1ZXN0aW9uPklmIHRoZSBBc3NlbWJseSBQbHVnaW4gaXMgcnVuIGR1cmluZyB0aGUgcGFja2FnZSBwaGFzZSwgZG8gbXkgYXNzZW1ibGllcyBnZXQgZGVwbG95ZWQgZHVyaW5nIHRoZSBkZXBsb3kgcGhhc2U/PC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0gICAgICAgIDxwPlllcy4gVGhlIGFzc2VtYmxpZXMgY3JlYXRlZCBieSB0aGUgQXNzZW1ibHkgUGx1Z2luIGlzIGF0dGFjaGVkIHRvIHlvdXIgcHJvamVjdCBzbyBpdCBnZXRzIGRlcGxveWVkIHRvby48L3A+Ci0gICAgICA8L2Fuc3dlcj4KLSAgICA8L2ZhcT4KLSAgICA8ZmFxIGlkPSJjbGFzc2lmaWVyIj4KLSAgICAgIDxxdWVzdGlvbj5DYW4gSSB1c2UgYW4gYXJ0aWZhY3QgY3JlYXRlZCBieSB0aGUgYXNzZW1ibHkgcGx1Z2luIGFzIGEgZGVwZW5kZW5jeT88L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLSAgICAgICAgPHA+WWVzLiBZb3UgY2FuIHJlZmVyIHRvIGl0IHVzaW5nIHRoZSBpZCBvZiB0aGUgYXNzZW1ibHkgYXMgdGhlIGRlcGVuZGVuY3kgY2xhc3NpZmllci48L3A+Ci0gICAgICA8L2Fuc3dlcj4KLSAgICA8L2ZhcT4KLSAgICA8ZmFxIGlkPSJqYXZhZG9jIj4KLSAgICAgIDxxdWVzdGlvbj5Ib3cgZG8gSSB1c2UgdGhlIEFzc2VtYmx5IFBsdWdpbiB0byBwYWNrYWdlIG15IHByb2plY3QncyBqYXZhZG9jIGZpbGVzPzwvcXVlc3Rpb24+Ci0gICAgICA8YW5zd2VyPgotICAgICAgICA8cD5UaGUgSmF2YWRvYyBQbHVnaW4gY2FuIGdlbmVyYXRlIHRoZSBqYXZhZG9jIGZpbGVzIG9mIHlvdXIgcHJvamVjdHMuIEFsc28sIHRoZSBKYXZhZG9jIFBsdWdpbiBjYW4gcGFja2FnZSB0aGVtITwvcD4KLSAgICAgICAgPHA+UGxlYXNlIHNlZSB0aGUgPGEgaHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1qYXZhZG9jLXBsdWdpbi8iPkphdmFkb2MgUGx1Z2luIERvY3VtZW50YXRpb248L2E+LjwvcD4KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotICAgIDxmYXEgaWQ9ImluaGVyaXQiPgotICAgICAgPHF1ZXN0aW9uPlN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjIgY29uZmlndXJhdGlvbi9leGVjdXRpb25zIGRlZmluZWQgaW4gYSBwYXJlbnQgUE9NIGFyZSBubyBsb25nZXIgaW5oZXJpdGVkLCB3aHk/PC9xdWVzdGlvbj4KLSAgICAgIDxhbnN3ZXI+Ci0gICAgICAgIDxwPkFzIHBhcnQgb2YgdGhlIGRlcHJlY2F0aW9uIG9mIGFsbCBnb2FscyBleGNlcHQgZm9yIHRoZSA8Y29kZT5zaW5nbGU8L2NvZGU+IGdvYWwsIHRoZSBnb2FscyBvZiB0aGUgQXNzZW1ibHkgUGx1Z2luIGFuZCB0aGVpciBjb25maWd1cmF0aW9uL2V4ZWN1dGlvbnMgYXJlIG5vIGxvbmdlciBpbmhlcml0ZWQgYnkgZGVmYXVsdC48L3A+Ci0gICAgICAgIDxwPklmIHlvdSBuZWVkIHRoZSBjb25maWd1cmF0aW9uL2V4ZWN1dGlvbnMgdG8gYmUgaW5oZXJpdGVkIHlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgc2F5IHNvIGJ5IGFkZGluZyBhIGxpbmUgdG8gdGhlIHBsdWdpbiBkZWNsYXJhdGlvbiBpbiB0aGUgcGFyZW50IFBPTTo8L3A+Ci0gICAgICAgIDxwcmU+Ci0gICAgICAgICAgJmx0O3BsdWdpbiZndDsKLSAgICAgICAgICAgICZsdDthcnRpZmFjdElkJmd0O21hdmVuLWFzc2VtYmx5LXBsdWdpbiZsdDsvYXJ0aWZhY3RJZCZndDsKLSAgICAgICAgICAgICZsdDtpbmhlcml0ZWQmZ3Q7dHJ1ZSZsdDsvaW5oZXJpdGVkJmd0OwotICAgICAgICAgICAgLi4uCi0gICAgICAgIDwvcHJlPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0gICAgPGZhcSBpZD0ic2hhcmVkLWRlc2NyaXB0b3ItYnVnIj4KLSAgICAgIDxxdWVzdGlvbj4KLSAgICAgICAgSW4gcHJldmlvdXMgdmVyc2lvbnMgKGJlZm9yZSAyLjIgZmluYWwpLCBJIGZvbGxvd2VkIHRoZSBleGFtcGxlIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciA8YSBocmVmPSIvZXhhbXBsZXMvc2hhcmluZy1kZXNjcmlwdG9ycy5odG1sIj5zaGFyaW5nIGFzc2VtYmx5IGRlc2NyaXB0b3JzPC9hPiwgCi0gICAgICAgIHdoaWNoIHJlY29tbWVuZGVkIHVzaW5nIHRoZSA8Y29kZT4mbHQ7ZGVzY3JpcHRvcnMvJmd0OzwvY29kZT4gY29uZmlndXJhdGlvbiBzZWN0aW9uIHRvIHJlZmVyIHRvIHRoZSBzaGFyZWQgYXNzZW1ibHkgZGVzY3JpcHRvci4gQXMgb2YgdmVyc2lvbiAyLjIsIAotICAgICAgICA8ZW0+dGhpcyBubyBsb25nZXIgd29ya3M8L2VtPi4gV2h5IG5vdD8KLSAgICAgIDwvcXVlc3Rpb24+Ci0gICAgICA8YW5zd2VyPgotICAgICAgICA8cD5UaGUgdXNlIG9mIDxjb2RlPiZsdDtkZXNjcmlwdG9ycy8mZ3Q7PC9jb2RlPiB3YXMgYWx3YXlzIGluY29ycmVjdCwgYW5kIGNvdW50ZXIgdG8gdGhlIGRlc2lnbiBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyLiBVbmZvcnR1bmF0ZWx5LCAKLSAgICAgICAgICAgc29tZSBjb2RlIHdhcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gMi4yLWJldGEtMiB0aGF0IGFsbG93ZWQgdGhpcyBwYXJhbWV0ZXIgdG8gcmVmZXJlbmNlIGRlc2NyaXB0b3JzIG9uIHRoZSBjbGFzc3BhdGgsIGluc3RlYWQgb2YgYmVpbmcgZm9yY2VkIHRvIAotICAgICAgICAgICB1c2UgPGNvZGU+Jmx0O2Rlc2NyaXB0b3JSZWZzLyZndDs8L2NvZGU+IGFzIGlzIHRoZSBpbnRlbnRpb24gb2YgdGhlIGRlc2lnbi4gSW4gdmVyc2lvbiAyLjIsIHRoaXMgYnVnIHdhcyBmaXhlZC4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD5JdCBpcyBpbXBvcnRhbnQgdG8gbm90ZSB0aGF0IHRoZSBjb3JyZWN0IGZvcm0sIDxjb2RlPiZsdDtkZXNjcmlwdG9yUmVmcy8mbHQ7PC9jb2RlPiBoYXMgYWx3YXlzIHdvcmtlZCwgYW5kIGNvbnRpbnVlcyB0byB3b3JrLiBUaGUgZG9jdW1lbnRhdGlvbiAKLSAgICAgICAgICAgaGFzIG5vdyBiZWVuIGZpeGVkIHRvIHJlZmxlY3QgdGhlIGNvcnJlY3QgY29uZmlndXJhdGlvbi4KLSAgICAgICAgPC9wPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0gICAgPGZhcSBpZD0iYmluZGluZyI+Ci0gICAgICA8cXVlc3Rpb24+V2hhdCBnb2FsIHNob3VsZCBJIHVzZSB0byBjcmVhdGUgYW4gYXNzZW1ibHkgYXMgcGFydCBvZiBteSBub3JtYWwgYnVpbGQgcHJvY2Vzcz88L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLSAgICAgICAgPHA+VXNlIHRoZSA8YSBocmVmPSJzaW5nbGUtbW9qby5odG1sIj5zaW5nbGU8L2E+IGdvYWwuPC9wPgotICAgICAgICA8cD48Yj5OT1RFOjwvYj4gQWxsIG90aGVyIG1vam9zIGhhdmUgYmVlbiBkZXByZWNhdGVkLCBlaXRoZXIgYmVjYXVzZSB0aGV5IGNhbiBjYXVzZSBzdHJhbmdlIGFuZCB1bnByZWRpY3RhYmxlIGJlaGF2aW9yIGluIGEgdmFyaWV0eSBvZiBzaXR1YXRpb25zLCBvcgotICAgICAgICAgICBiZWNhdXNlIHRoZXkgYXJlIHJlZHVuZGFudCBnaXZlbiB0aGUgYXZhaWxhYmlsaXR5IG9mIHRoZSA8Y29kZT5kaXI8L2NvZGU+IGFzc2VtYmx5IGZvcm1hdCBhbmQgdGhlIDxjb2RlPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9jb2RlPi4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD5TaW5jZSB0aGUgPGEgaHJlZj0iYXNzZW1ibHktbW9qby5odG1sIj5hc3NlbWJseTwvYT4sIDxhIGhyZWY9ImF0dGFjaGVkLW1vam8uaHRtbCI+YXR0YWNoZWQ8L2E+LCA8YSBocmVmPSJkaXJlY3RvcnktbW9qby5odG1sIj5kaXJlY3Rvcnk8L2E+LCBhbmQgPGEgaHJlZj0iZGlyZWN0b3J5LWlubGluZS1tb2pvLmh0bWwiPmRpcmVjdG9yeS1pbmxpbmU8L2E+IGdvYWxzIGFyZSBhbGwgYWdncmVnYXRvcnMsIHRoZXkgd2lsbCBleGVjdXRlIGF0IG1vc3Qgb25jZQotICAgICAgICAgICBwZXIgZXhlY3V0aW9uIG9mIE1hdmVuLiBTZWUgPGEgaHJlZj0iaHR0cDovL2RvY3MuY29kZWhhdXMub3JnL2Rpc3BsYXkvTUFWRU4vQXR5cGljYWwrUGx1Z2luK1VzZStDYXNlcyI+QXR5cGljYWwrUGx1Z2luK1VzZStDYXNlczwvYT4gKHdpa2kpIGZvciBtb3JlCi0gICAgICAgICAgIGluZm9ybWF0aW9uIG9uIHRoZSBwcm9ibGVtcyBhc3NvY2lhdGVkIHdpdGggYWdncmVnYXRvciBtb2pvcy4KLSAgICAgICAgPC9wPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0gICAgPGZhcSBpZD0ibW9kdWxlLWJpbmFyaWVzIj4KLSAgICAgIDxxdWVzdGlvbj5UaGUgQXNzZW1ibHkgUGx1Z2luIGlzIHNheWluZyBpdCBjYW5ub3QgZmluZCBmaWxlcyBmb3IgdGhlIG1vZHVsZSBiaW5hcmllcyBpbmNsdWRlZCBieSBteSBhc3NlbWJseSBkZXNjcmlwdG9yLiBXaGF0IGdpdmVzPzwvcXVlc3Rpb24+Ci0gICAgICA8YW5zd2VyPgotICAgICAgICA8cD48Yj5JZiB5b3VyIGFzc2VtYmx5IGluY2x1ZGVzIG1vZHVsZSBiaW5hcmllcywgdGhvc2UgYmluYXJpZXMgd29uJ3QgYmUgYXZhaWxhYmxlIHRvIHRoZSBhc3NlbWJseSBwbHVnaW4gZXhjZXB0IGluIHNwZWNpYWwgY2FzZXMuPC9iPiBUaGlzIGlzIG5vcm1hbGx5IHNlZW4KLSAgICAgICAgICAgd2hlbiB0aGUgQXNzZW1ibHkgUGx1Z2luIGlzIGJvdW5kIHRvIGEgcGhhc2Ugb2YgdGhlIHN0YW5kYXJkIGJ1aWxkIGxpZmVjeWNsZSBpbiB0aGUgPGI+cGFyZW50IFBPTTwvYj4gb2YgYSBtdWx0aW1vZHVsZSBidWlsZC4KLSAgICAgICAgICAgSXQgaXMgYSByZXN1bHQgb2YgdGhlIHdheSBNYXZlbiBzb3J0cyBhbmQgZXhlY3V0ZXMgdGhlIGJ1aWxkIHByb2Nlc3MgZm9yIGEgbXVsdGltb2R1bGUgcHJvamVjdCBsYXlvdXQuCi0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+SW4gYSBtdWx0aW1vZHVsZSBoaWVyYXJjaHksIHdoZW4gYSBjaGlsZCBtb2R1bGUgZGVjbGFyZXMgdGhlIHBhcmVudCBQT00gaW4gaXRzICZsdDtwYXJlbnQvJmd0OyBzZWN0aW9uLCBNYXZlbiBpbnRlcnByZXRzIHRoaXMgdG8gbWVhbiB0aGF0IHRoZSBwYXJlbnQKLSAgICAgICAgICAgcHJvamVjdCdzIGJ1aWxkIG11c3QgYmUgY29tcGxldGVkIGJlZm9yZSB0aGUgY2hpbGQgYnVpbGQgY2FuIHN0YXJ0LiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGFyZW50IHByb2plY3QgaXMgaW4gaXRzIGZpbmFsIGZvcm0gYnkgdGhlIHRpbWUgdGhlIGNoaWxkCi0gICAgICAgICAgIG5lZWRzIGFjY2VzcyB0byBpdHMgUE9NIGluZm9ybWF0aW9uLiBJbiBjYXNlcyB3aGVyZSB0aGUgQXNzZW1ibHkgUGx1Z2luIGlzIGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhhdCBwYXJlbnQgcHJvamVjdCdzIGJ1aWxkIHByb2Nlc3MsIGl0IHdpbGwgZXhlY3V0ZQotICAgICAgICAgICBhbG9uZyB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBhcyBwYXJ0IG9mIHRoZSBwYXJlbnQgYnVpbGQgLSA8Yj5iZWZvcmUgdGhlIGNoaWxkIGJ1aWxkIGNhbiBzdGFydDwvYj4uIElmIHRoZSBhc3NlbWJseSBkZXNjcmlwdG9yIHVzZWQgaW4gdGhhdCBwYXJlbnQgYnVpbGQKLSAgICAgICAgICAgcmVmZXJlbmNlcyBtb2R1bGUgYmluYXJpZXMsIGl0IGVmZmVjdGl2ZWx5IGV4cGVjdHMgdGhlIGNoaWxkIGJ1aWxkIHRvIGJlIGNvbXBsZXRlZCA8Yj5iZWZvcmUgdGhlIGFzc2VtYmx5IGlzIHByb2Nlc3NlZDwvYj4uIFRoaXMgbGVhZHMgdG8gYSByZWN1cnNpdmUKLSAgICAgICAgICAgZGVwZW5kZW5jeSBzaXR1YXRpb24sIHdoZXJlIHRoZSBjaGlsZCBidWlsZCBkZXBlbmRzIG9uIHRoZSBwYXJlbnQgYnVpbGQgdG8gY29tcGxldGUgYmVmb3JlIGl0IGNhbiBzdGFydCwgd2hpbGUgdGhlIHBhcmVudCBidWlsZCBkZXBlbmRzIG9uIHRoZSBwcmVzZW5jZQotICAgICAgICAgICBvZiBjaGlsZC1tb2R1bGUgYXJ0aWZhY3RzIHRvIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4gU2luY2UgdGhlc2UgYXJ0aWZhY3RzIGFyZSBtaXNzaW5nLCB0aGUgQXNzZW1ibHkgUGx1Z2luIHdpbGwgY29tcGxhaW4gYWJvdXQgbWlzc2luZyBhcnRpZmFjdHMsIGFuZAotICAgICAgICAgICB0aGUgYnVpbGQgd2lsbCBmYWlsLgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPkluIG1hbnkgY2FzZXMsIHlvdSBjYW4gYXZvaWQgdGhpcyBwcm9ibGVtIGJ5IGFkZGluZyBhIG5ldyBjaGlsZCBtb2R1bGUgd2hvc2Ugc29sZSBwdXJwb3NlIGlzIHRvIHByb2R1Y2UgeW91ciBhc3NlbWJseS4gSW4gdGhlIFBPTSBmb3IgdGhpcyBuZXcgcHJvamVjdCwKLSAgICAgICAgICAgYWRkIGRlcGVuZGVuY3kgZGVmaW5pdGlvbnMgZm9yIGFueSBvZiB0aGUgbW9kdWxlIGJpbmFyaWVzIHlvdSBoYWQgcHJldmlvdXNseSByZWZlcmVuY2VkLiBUaGlzIHdpbGwgZW5zdXJlIHRoZSBuZXcgYXNzZW1ibHkgY2hpbGQgaXMgYnVpbHQgbGFzdC4KLSAgICAgICAgICAgVGhlbiwgbW92ZSB5b3VyIGFzc2VtYmx5IGRlc2NyaXB0b3IgaW50byB0aGlzIG5ldyBjaGlsZCBtb2R1bGUuIEF0IHRoaXMgcG9pbnQsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZWl0aGVyIGNoYW5naW5nIGFsbCBtb2R1bGVTZXQvYmluYXJpZXMgcmVmZXJlbmNlcyAKLSAgICAgICAgICAgdG8gZGVwZW5kZW5jeVNldCByZWZlcmVuY2VzLCA8Yj5vciB5b3UgY2FuIGtlZXAgdGhlIG1vZHVsZVNldHMgYW5kIGluc3RlYWQgc2V0IHRoZSB1c2VBbGxSZWFjdG9yUHJvamVjdHMgZmxhZyB0byA8aT50cnVlPC9pPiBmb3IgZWFjaCBtb2R1bGVTZXQuPC9iPgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPgotICAgICAgICAgICBPYnZpb3VzbHksIGFueSBmaWxlU2V0IG9yIGZpbGUgcmVmZXJlbmNlcyB5b3UgbWF5IGhhdmUgaW4gdGhpcyBkZXNjcmlwdG9yIG1heSBuZWVkCi0gICAgICAgICAgIHRvIGJlIGFkanVzdGVkIG9yIGhhdmUgdGhlIGZpbGVzIHRoZXkgcmVmZXJlbmNlIG1vdmVkIGludG8gdGhlIG5ldyBjaGlsZCBtb2R1bGUgYWxvbmdzaWRlIHRoZSBkZXNjcmlwdG9yIGl0c2VsZi4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD5JbiBjYXNlcyB3aGVyZSB5b3UgYWJzb2x1dGVseSBtdXN0IHVzZSBtb2R1bGUtYmluYXJpZXMgcmVmZXJlbmNlcywgeW91IHNob3VsZCBjcmVhdGUgYW4gYXNzZW1ibHktY2hpbGQgUE9NIG1lbnRpb25lZCBhYm92ZSwgdGhlbiBpbnNlcnQKLSAgICAgICAgICAgPGNvZGU+Jmx0O3VzZUFsbFJlYWN0b3JQcm9qZWN0cyZndDt0cnVlJmx0O3VzZUFsbFJlYWN0b3JQcm9qZWN0cyZndDs8L2NvZGU+IHRvIGVhY2ggb2YgeW91ciA8Y29kZT5tb2R1bGVTZXQ8L2NvZGU+IHNlY3Rpb25zLiBUaGVuLCBiaW5kIHRoZSBhc3NlbWJseQotICAgICAgICAgICBpbiB5b3VyIGFzc2VtYmx5LWNoaWxkIFBPTSAobm9ybWFsbHkgdG8gdGhlIDxjb2RlPnBhY2thZ2U8L2NvZGU+IHBoYXNlKSB1c2luZyB0aGUgPGNvZGU+c2luZ2xlPC9jb2RlPiBnb2FsLiBXaGVuIHlvdSBleGVjdXRlIHRoZSBidWlsZCBmcm9tIHRoZSB0b3AtbGV2ZWwgUE9NLAotICAgICAgICAgICBNYXZlbiBzaG91bGQgZ2VuZXJhdGVkIHlvdXIgYXNzZW1ibHkgaW4gdGhlIG5ldyBjaGlsZCBwcm9qZWN0LgotICAgICAgICA8L3A+Ci0gICAgICAgIDxwPjxiPk5PVEU6PC9iPiBUaGUgdXNlQWxsUmVhY3RvclByb2plY3RzIGZsYWcgaXMgb25seSBhdmFpbGFibGUgaW4gdmVyc2lvbiAyLjIgYW5kIGhpZ2hlci48L3A+Ci0gICAgICA8L2Fuc3dlcj4KLSAgICA8L2ZhcT4KLSAgICA8ZmFxIGlkPSJyZXF1aXJlZC1jbGFzc2lmaWVycyI+Ci0gICAgICA8cXVlc3Rpb24+Ci0gICAgICAgIEluIHByZXZpb3VzIHZlcnNpb25zIChiZWZvcmUgMi4yIGZpbmFsKSwgbGVhdmluZyBvZmYgdGhlIGFzc2VtYmx5IGlkIGFuZCBsZWF2aW5nIHRoZSBjbGFzc2lmaWVyIHVuY29uZmlndXJlZCByZXN1bHRlZCBpbiB0aGUgCi0gICAgICAgIGFzc2VtYmx5IGJlaW5nIHVzZWQgYXMgdGhlIHByb2plY3QncyBtYWluIGFydGlmYWN0LiBXaXRoIHRoZSAyLjIgcmVsZWFzZSwgdGhpcyBjb25maWd1cmF0aW9uIHJlc3VsdHMgaW4gYSB2YWxpZGF0aW9uIGVycm9yLiAKLSAgICAgICAgTXkgcHJvamVjdCBkZXBlbmRlZCBvbiB0aGUgcHJldmlvdXMgYmVoYXZpb3IhIFdoeSBoYXMgdGhpcyBjaGFuZ2VkLCBhbmQgaG93IGNhbiBJIG1ha2UgdGhpcyB3b3JrIGluIG15IHByb2plY3Q/Ci0gICAgICA8L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLSAgICAgICAgPHA+VGhlIGFzc2VtYmx5IGlkIGlzIHVzZWQgZm9yIHJlcG9ydGluZyBhbmQgY2FsY3VsYXRpbmcgZGVzY3JpcHRvci9jb21wb25lbnQgbWVyZ2VzLiBUaGV5J3JlIGFsc28gcmVxdWlyZWQgdG8gYXZvaWQgY29sbGlzaW9ucyB3aXRoIHRoZSAKLSAgICAgICAgICAgbWFpbiBvdXRwdXQgb2YgdGhlIHByb2plY3QncyBidWlsZCBwcm9jZXNzLiBJdCdzIGNyaXRpY2FsIHRoYXQgdGhpcyBpZCBiZSBpbiBwbGFjZSwgdG8gb3ZlcnJpZGluZyB0aGUgcHJvamVjdCdzIG1haW4gYXJ0aWZhY3QgaW5hZHZlcnRlbnRseSwgCi0gICAgICAgICAgIGFuZCB0byBoZWxwIGVycm9yLXJlcG9ydGluZyBtYWtlIHNlbnNlIHRvIHRoZSB1c2VyLiA8ZW0+TGVhdmluZyBvZmYgdGhlIGFzc2VtYmx5IGlkIGhhcyBhbHdheXMgYmVlbiBhbiBlcnJvcjwvZW0+LCBidXQgdW5mb3J0dW5hdGVseSBwcmV2aW91cyAKLSAgICAgICAgICAgcmVsZWFzZXMgY29udGFpbmVkIGEgYnVnIGluIHRoZSBtb2RlbCB0aGF0IGFsbG93ZWQgZW1wdHkgb3IgbWlzc2luZyBhc3NlbWJseSBpZCdzLiBUaGlzIGJ1ZyBoYXMgYmVlbiBmaXhlZCBpbiB2ZXJzaW9uIDIuMi4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD5Ib3dldmVyLCBpbiBjZXJ0YWluIGNhc2VzIGl0IG1ha2VzIHNlbnNlIHRvIHVzZSB0aGUgYXNzZW1ibHkgb3V0cHV0IGFzIHRoZSBtYWluIHByb2plY3QgYXJ0aWZhY3QuIFNvLCB3aGF0J3MgdGhlIGNvcnJlY3QgYXBwcm9hY2ggaW4gdGhlc2UgCi0gICAgICAgICAgIHNpdHVhdGlvbnM/IFRoaXMgdXNlIGNhc2UgaXMgbWVhbnQgdG8gcmVxdWlyZSBkZWxpYmVyYXRlIGNvbmZpZ3VyYXRpb24sIHNvIHlvdXIgaW50ZW50aW9uIHRvIGRlcGFydCBmcm9tIHRoZSBub3JtYWwgYmVoYXZpb3Igd2lsbCBiZSBjbGVhci4KLSAgICAgICAgICAgVG8gY29uZmlndXJlIHRoZSB1c2Ugb2YgdGhlIGFzc2VtYmx5IG91dHB1dCBhcyB0aGUgbWFpbiBwcm9qZWN0IGFydGlmYWN0LCBmb2xsb3cgdGhlc2Ugc3RlcHM6Ci0gICAgICAgIDwvcD4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgPG9sPgotICAgICAgICAgICAgPGxpPk1ha2Ugc3VyZSB5b3VyIGFzc2VtYmx5IG9ubHkgdXNlcyA8Yj5vbmUgZm9ybWF0PC9iPi4gTW9yZSB0aGFuIG9uZSBmb3JtYXQgY291bGQgbWVhbiB0aGUgYXNzZW1ibHkgYXJ0aWZhY3QgdXNlZCBmb3IgdGhlIHByb2plY3QncyAKLSAgICAgICAgICAgICAgICBtYWluIGFydGlmYWN0IGlzIG5vbi1kZXRlcm1pbmlzdGljLgotICAgICAgICAgICAgPC9saT4KLSAgICAgICAgICAgIDxsaT5BZGQgdGhlIGNvbmZpZ3VyYXRpb246IDxjb2RlPiZsdDthcHBlbmRBc3NlbWJseUlkJmd0O2ZhbHNlJmx0Oy9hcHBlbmRBc3NlbWJseUlkJmd0OzwvY29kZT4gdG8geW91ciBhc3NlbWJseS1wbHVnaW4gZXhlY3V0aW9uLiAKLSAgICAgICAgICAgICAgICBUaGlzIHdpbGwgcHJldmVudCB0aGUgYXNzZW1ibHkgYXJ0aWZhY3QgZnJvbSBzaW1wbHkgYmVpbmcgYXR0YWNoZWQgdG8gdGhlIHByb2plY3QuCi0gICAgICAgICAgICA8L2xpPgotICAgICAgICAgIDwvb2w+Ci0gICAgICAgIDwvcD4KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotICAgIDxmYXEgaWQ9ImRhc2hDbGFzc2lmaWVyIj4KLSAgICAgIDxxdWVzdGlvbj4KLSAgICAgICAgSSBoYXZlIGEgZGVwZW5kZW5jeVNldCB0aGF0IGluY2x1ZGVzIHNvbWUgYXJ0aWZhY3RzIHdpdGggY2xhc3NpZmllcnMsIGFuZCBvdGhlcnMgd2l0aG91dCBjbGFzc2lmaWVycy4KLSAgICAgICAgSG93IGNhbiBJIHNldHVwIHRoZSBmaWxlIG1hcHBpbmdzIHRvIGhhbmRsZSBib3RoIGNhc2VzIGFwcHJvcHJpYXRlbHk/Ci0gICAgICA8L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgVGhlIGJlc3Qgd2F5IHRvIGhhbmRsZSBhIG1peGVkIGJhZyBvZiBkZXBlbmRlbmNpZXMgd2l0aCBhbmQgd2l0aG91dCBjbGFzc2lmaWVycyBpcyB0byB1c2UgdGhlCi0gICAgICAgICAgPGI+JHtkYXNoQ2xhc3NpZmllcj99PC9iPiBleHByZXNzaW9uLCBhZGRlZCBpbiB2ZXJzaW9uIDIuMi1iZXRhLTIgb2YgdGhlIGFzc2VtYmx5IHBsdWdpbiBlc3BlY2lhbGx5Ci0gICAgICAgICAgZm9yIHRoaXMgcHVycG9zZS4gVGhpcyBleHByZXNzaW9uIHdpbGwgZGV0ZXJtaW5lIHdoZXRoZXIgZWFjaCBhcnRpZmFjdCBoYXMgYSBjbGFzc2lmaWVyLCBhbmQgaWYgaXQKLSAgICAgICAgICBkb2VzLCBpdCB3aWxsIHN1YnN0aXR1dGUgdGhlIGFydGlmYWN0J3MgY2xhc3NpZmllciAtIHByZXBlbmRlZCBieSBhIGRhc2ggLSBpbiBwbGFjZSBvZiB0aGUgZXhwcmVzc2lvbi4KLSAgICAgICAgPC9wPgotICAgICAgICA8cD4KLSAgICAgICAgICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB5b3Ugd2FudCB0byBpbmNsdWRlIHR3byBhcnRpZmFjdHMsIGNvbW1vbnMtbG9nZ2luZy0xLjAuNC5qYXIsIGFuZAotICAgICAgICAgIHlvdXJzZXJ2ZXItMS4wLWNsaWVudC5qYXIgKHdoZXJlICdjbGllbnQnIGlzIHRoZSBjbGFzc2lmaWVyIG9mIHRoZSBzZWNvbmQgYXJ0aWZhY3QpLiBUbyBkbyB0aGlzLAotICAgICAgICAgIHNpbXBseSBhZGQgdGhlIGZvbGxvd2luZyB0byB5b3VyIGRlcGVuZGVuY3lTZXQ6Ci0gICAgICAgIDwvcD4KLSAgICAgICAgPHByZT4KLSZsdDtvdXRwdXRGaWxlTmFtZU1hcHBpbmcmZ3Q7JHthcnRpZmFjdC5hcnRpZmFjdElkfS0ke2FydGlmYWN0LnZlcnNpb259JHtkYXNoQ2xhc3NpZmllcj99LiR7YXJ0aWZhY3QuZXh0ZW5zaW9ufSZsdDsvb3V0cHV0RmlsZU5hbWVNYXBwaW5nJmd0OwotICAgICAgICA8L3ByZT4KLSAgICAgIDwvYW5zd2VyPgotICAgIDwvZmFxPgotICAgIDxmYXEgaWQ9Im91dHB1dEZpbGVOYW1lTWFwcGluZyI+Ci0gICAgICA8cXVlc3Rpb24+Ci0gICAgICAgIFdoaWNoIHByb3BlcnRpZXMgY2FuIGJlIHVzZWQgaW4gdGhlIG91dHB1dEZpbGVOYW1lTWFwcGluZyBwYXJhbWV0ZXIuCi0gICAgICA8L3F1ZXN0aW9uPgotICAgICAgPGFuc3dlcj4KLSAgICAgICAgPHA+Ci0gICAgICAgICAgWW91IGNhbiB1c2UgOgotICAgICAgICA8L3A+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+YWxsIHN5c3RlbSBvciBtYXZlbiBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBpbiB5b3VyIGJ1aWxkIHdpdGggdGhlIHN5bnRheCA8Y29kZT4ke215UHJvcGVydHl9PC9jb2RlPi48L2xpPgotICAgICAgICAgIDxsaT5hbGwgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdpdGggPGNvZGU+JHtlbnYuWFhYfTwvY29kZT4gd2hlcmUgPGNvZGU+WFhYPC9jb2RlPiBpcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuPC9saT4KLSAgICAgICAgICA8bGk+dGhlIHNwZWNpYWwgPGNvZGU+JHtkYXNoQ2xhc3NpZmllcj99PC9jb2RlPiBwcm9wZXJ0eSAoc2VlIGFib3ZlKS48L2xpPgotICAgICAgICAgIDxsaT5hbGwgYXJ0aWZhY3RzIGF0dHJpYnV0ZXMgKDxhIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3JlZi8zLjAuNC9tYXZlbi1hcnRpZmFjdC9hcGlkb2NzL29yZy9hcGFjaGUvbWF2ZW4vYXJ0aWZhY3QvQXJ0aWZhY3QuaHRtbCI+IGZyb20gdGhlIEFydGlmYWN0IGNsYXNzPC9hPikgbGlrZSA6Ci0gICAgICAgICAgPHVsPgotICAgICAgICAgICAgICA8bGk+PGNvZGU+JHthcnRpZmFjdC5ncm91cElkfTwvY29kZT4gOiBUaGUgYXJ0aWZhY3QgZ3JvdXBJZC48L2xpPgotICAgICAgICAgICAgICA8bGk+PGNvZGU+JHthcnRpZmFjdC5hcnRpZmFjdElkfTwvY29kZT4gOiAgVGhlIGFydGlmYWN0IGFydGlmYWN0SWQuPC9saT4KLSAgICAgICAgICAgICAgPGxpPjxjb2RlPiR7YXJ0aWZhY3QudmVyc2lvbn08L2NvZGU+IDogIFRoZSBhcnRpZmFjdCBjbGFzc2lmaWVyLjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Y29kZT4ke2FydGlmYWN0LmJhc2VWZXJzaW9ufTwvY29kZT4gOiAgVGhlIGFydGlmYWN0IGJhc2UgdmVyc2lvbiAoRm9yIGEgU05BUFNIT1QgaXQgd2lsbCBiZSBhbHdheXMgLVNOQVBTSE9UIGFuZCBub3QgaXRzIHRpbWVzdGFtcCBldmVuIGlmIHlvdSBkaWRuJ3QgYnVpbHQgaXQgeW91cnNlbGYpLjwvbGk+Ci0gICAgICAgICAgICAgIDxsaT48Y29kZT4ke2FydGlmYWN0LmNsYXNzaWZpZXJ9PC9jb2RlPiA6ICBUaGUgYXJ0aWZhY3QgY2xhc3NpZmllci48L2xpPgotICAgICAgICAgICAgICA8bGk+PGNvZGU+JHthcnRpZmFjdC5zY29wZX08L2NvZGU+IDogIFRoZSBhcnRpZmFjdCBzY29wZS48L2xpPgotICAgICAgICAgICAgICA8bGk+Li4uPC9saT4KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgICBZb3UgY2FuIHVzZSA8Y29kZT4ke21vZHVsZS5YWFhYWH08L2NvZGU+IHdoZW4gdXNpbmcgaXQgZm9yIHlvdXIgcHJvamVjdCBtb2R1bGVzIGFydGlmYWN0cy4KLSAgICAgICAgICA8L2xpPgotICAgICAgICA8L3VsPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0gICAgPGZhcSBpZD0idGFyRmlsZU1vZGVzIj4KLSAgICAgIDxxdWVzdGlvbj4KLSAgICAgICAgVGFyIGNvbXBsYWlucyBhYm91dCBncm91cGlkIHZhbHVlIGJlaW5nIHRvbyBiaWcKLSAgICAgIDwvcXVlc3Rpb24+Ci0gICAgICA8YW5zd2VyPgotICAgICAgICA8cD4KLSAgICAgICAgICBHTlUgdGFyIGhhcyByZXN0cmljdGlvbnMgb24gbWF4IHZhbHVlIG9mIFVJRC9HVUlEIGluIHRhciBmaWxlcy4KLSAgICAgICAgICBDb25zaWRlciB1c2luZyB0aGUgbW9yZSB3ZWxsIGRlZmluZWQgUE9TSVggdGFyIGZvcm1hdCwgd2hpY2ggc2hvdWxkIHN1cHBvcnQKLSAgICAgICAgICBsYXJnZXIgdmFsdWVzLiBVc2UgdGFyTG9uZ0ZpbGVNb2RlPXBvc2l4IGluIHRoZSBhc3NlbWJseTpzaW5nbGUgZ29hbC4KLSAgICAgICAgPC9wPgotICAgICAgPC9hbnN3ZXI+Ci0gICAgPC9mYXE+Ci0KLSAgPC9wYXJ0PgotPC9mYXFzPgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtaGlnaExldmVsLnBuZyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLWhpZ2hMZXZlbC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1YzJiYjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtaGlnaExldmVsLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW1ham9yQ2xhc3Nlcy5wbmcgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1tYWpvckNsYXNzZXMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDdmZTMwLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW1ham9yQ2xhc3Nlcy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1ub3Rlcy5odG1sL0NoZWNrZWQucG5nIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9DaGVja2VkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRlOWYyNS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1ub3Rlcy5odG1sL0NoZWNrZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9Db2xsYXBzZWQucG5nIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9Db2xsYXBzZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMzM5Nzc2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW5vdGVzLmh0bWwvQ29sbGFwc2VkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW5vdGVzLmh0bWwvRXhwYW5kZWQucG5nIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9FeHBhbmRlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMDBmNGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9FeHBhbmRlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1ub3Rlcy5odG1sL0xlYWZSb3dIYW5kbGUucG5nIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9MZWFmUm93SGFuZGxlLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM2MzM3NS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1ub3Rlcy5odG1sL0xlYWZSb3dIYW5kbGUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9NaXhlZC5wbmcgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1ub3Rlcy5odG1sL01peGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzMDQ5OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1ub3Rlcy5odG1sL01peGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW5vdGVzLmh0bWwvVW5jaGVja2VkLnBuZyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW5vdGVzLmh0bWwvVW5jaGVja2VkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJhMzJkNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1ub3Rlcy5odG1sL1VuY2hlY2tlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9hcmNoaXRlY3R1cmUvYXNzZW1ibHktcGx1Z2luLWFyY2hpdGVjdHVyZS1ub3Rlcy5odG1sL2JsYW5rLnBuZyBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW5vdGVzLmh0bWwvYmxhbmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2I4MzhlLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW5vdGVzLmh0bWwvYmxhbmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9pbmRleC5odG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9yZXNvdXJjZXMvYXJjaGl0ZWN0dXJlL2Fzc2VtYmx5LXBsdWdpbi1hcmNoaXRlY3R1cmUtbm90ZXMuaHRtbC9pbmRleC5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzU2NjQ5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2FyY2hpdGVjdHVyZS9hc3NlbWJseS1wbHVnaW4tYXJjaGl0ZWN0dXJlLW5vdGVzLmh0bWwvaW5kZXguaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1MCArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIj4KLTwhLS0KLUxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLW9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLXJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLXRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLXdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi1zcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi11bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGh0bWw+Ci08aGVhZD4KLTxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04Ij4KLTx0aXRsZT48L3RpdGxlPgotPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KLSAgICAKLSAgICB0aCB7Ci0gICAgICAgIHZlcnRpY2FsLWFsaWduOiBib3R0b207Ci0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICB0ZCx0aCB7Ci0gICAgICAgIC8qIENoZWF0aW5nIGhlcmUgc28gd2UgY2FuIGdldCBhIGRlZmF1bHQgZm9udCBhbmQgc2l6ZS4gSWYgaXQncyBzZXQgaW4gdGhlIG91dGxpbmUgdGhlbiBpdCdsbCBnZXQgcmVkZWNsYXJlZCBiZWxvdwotICAgICAgICAgICBhbmQgb3ZlcndyaXR0ZW4gKGhvcGVmdWxseSkuCi0gICAgICAgICovCi0gICAgICAgIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7Ci0gICAgICAgIGZvbnQtc2l6ZTogMTJweDsKLSAgICAgICAgCi0KLSAgICAgICAgZW1wdHktY2VsbHM6IHNob3c7Ci0gICAgfQotCi0gICAgLyogTGV2ZWwgU3R5bGVzICovCi0gICAgCi0gICAgLndob2xlRG9jdW1lbnQgewotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgLmNvbHVtbnRpdGxlIHsgCi0gICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO2ZvbnQtd2VpZ2h0OiA5MDA7ICAKLSAgICB9Ci0KLSAgICAubGV2ZWwxIHsgCi0gICAgICAgIGNvbG9yOnJnYigxNjEsMTAwLDQ1KSA7ICBiYWNrZ3JvdW5kLWNvbG9yOnJnYigxOTEsMTkxLDE5MSkgOyAgZm9udC13ZWlnaHQ6IDgwMDsgIGZvbnQtc2l6ZTogMTRweDsKLSAgICB9Ci0KLSAgICAubGV2ZWwyIHsgCi0gICAgICAgIGZvbnQtd2VpZ2h0OiA5MDA7ICAKLSAgICB9Ci0KLQotICAgIHRkLnN1YmNlbGwgewotICAgICAgICBib3JkZXI6IG5vbmU7Ci0gICAgfQotCi0gICAgLmluZGljYXRvciB7Ci0gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7Ci0gICAgICAgIHRleHQtYWxpZ246cmlnaHQ7Ci0gICAgICAgIG1hcmdpbi1yaWdodDogMnB4OwotICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwotICAgICAgICBwYWRkaW5nLXRvcDogM3B4OwotICAgIH0KLSAgICAKLSAgICB0YWJsZS5zdWJ0YWJsZSB7Ci0gICAgfQotICAgIAotICAgIGRpdi5yb3cgewotICAgIH0KLQotICAgIC5leHBhbmRlZCB7Ci0gICAgICAgIGRpc3BsYXk6IGlubGluZTsKLSAgICB9Ci0gICAgLmNvbGxhcHNlZCB7Ci0gICAgICAgIGRpc3BsYXk6IG5vbmU7Ci0gICAgfQotICAgIAotICAgIAotICAgIC5ub3RlIHsgCi1ib3JkZXI6IG5vbmU7Ci1jb2xvcjpyZ2IoODQsODQsODQpIDsgIGZvbnQtc3R5bGU6IGl0YWxpYztmb250LXNpemU6IDExcHg7Ci0gICAgfQotCi0gICAgCi0gICAgLyogVG90YWwgdGFibGUgd2lkdGggaXMgOTAwCi0gICAgICBBZGp1c3RlZCB0YWJsZSB3aWR0aCBpcyAxMDM1ICovCi0gICAgCi0gICAgdGFibGUucm93IHsKLSAgICAgICAgd2lkdGg6IDEwMzVweDsKLSAgICAKLSAgICB9Ci0gICAgCi0gICAgCi0gICAgLmNvbF93aWR0aDEgeyAKLSAgICAgICAgd2lkdGg6IDEwMzVweDsgIC8qIEFjdHVhbCB3aWR0aCBpcyA5MDAgKi8KLSAgICB9Ci0KLSAgICAuY29sMSB7IAotICAgICAgICAKLSAgICB9Ci0KLSAgICAubnMtSGlnaGxpZ2h0IHsgCi0gICAgICAgIGJhY2tncm91bmQtY29sb3I6cmdiKDI1MywyNTUsODkpIDsgIH0KLQotICAgIC5ucy1DaXRhdGlvbiB7IAotICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9Ci0KLSAgICAubnMtRW1waGFzaXMgeyAKLSAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO30KLTwvc3R5bGU+Ci08L2hlYWQ+Ci08Ym9keT48dGFibGUgY2VsbHNwYWNpbmc9IjAiPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iY29sb3I6cmdiKDE2MSwxMDAsNDUpIDsgIGJhY2tncm91bmQtY29sb3I6cmdiKDE5MSwxOTEsMTkxKSA7ICBmb250LXdlaWdodDogODAwOyAgZm9udC1zaXplOiAxNHB4OyI+PGRpdj4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSJ3ZWRnZSIgc3JjPSJFeHBhbmRlZC5wbmciIHRpdGxlPSJjb2xsYXBzZSI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IE1vam9zIChvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2pvKTxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSJmb250LXdlaWdodDogOTAwOyAgIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNDdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBVc2VzOjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Bc3NlbWJseUFyY2hpdmVyPC9zcGFuPjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSJmb250LXdlaWdodDogOTAwOyAgIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNDdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBQcm92aWRlczo8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gaW1wbGVtZW50YXRpb24gb2YgPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QXNzZW1ibHlDb25maWd1cmF0aW9uU291cmNlPC9zcGFuPiwgZm9yIHVzZSBpbiBhc3NlbWJseSBjb21wb25lbnRzPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9ImZvbnQtd2VpZ2h0OiA5MDA7ICAiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0N3B4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSJ3ZWRnZSIgc3JjPSJFeHBhbmRlZC5wbmciIHRpdGxlPSJjb2xsYXBzZSI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IE5vdGVzOjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Bc3NlbWJseUNvbmZpZ3VyYXRpb25Tb3VyY2U8L3NwYW4+IHRyYW5zcG9ydHMgYnVpbGQgc3RhdGUgZ2l2ZW4gYnkgbW9qbyBwYXJhbWV0ZXJzIHRvIGRlZXBlciBhc3NlbWJseSBjb21wb25lbnRzPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Bc3NlbWJseUFyY2hpdmVyPC9zcGFuPiBhYnN0cmFjdHMgdGhlIGJ1c2luZXNzIG9mIGNyZWF0aW5nIHRoZSBhc3NlbWJseSBhcnRpZmFjdCBmcm9tIHRoZSBtb2pvczxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9ImNvbG9yOnJnYigxNjEsMTAwLDQ1KSA7ICBiYWNrZ3JvdW5kLWNvbG9yOnJnYigxOTEsMTkxLDE5MSkgOyAgZm9udC13ZWlnaHQ6IDgwMDsgIGZvbnQtc2l6ZTogMTRweDsiPjxkaXY+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBBc3NlbWJseUFyY2hpdmVyIChvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlKTxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSJmb250LXdlaWdodDogOTAwOyAgIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNDdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBVc2VzOjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5BcmNoaXZlck1hbmFnZXI8L3NwYW4+PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiB0aGUgc2V0IG9mIDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFyY2hpdmVBc3NlbWJseVBoYXNlPC9zcGFuPiBpbXBsZW1lbnRhdGlvbnM8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QXNzZW1ibHlEZXNjcmlwdG9yUmVhZGVyPC9zcGFuPiBhbmQgPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QXNzZW1ibHlJbnRlcnBvbGF0b3I8L3NwYW4+PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9ImZvbnQtd2VpZ2h0OiA5MDA7ICAiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0N3B4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSJ3ZWRnZSIgc3JjPSJFeHBhbmRlZC5wbmciIHRpdGxlPSJjb2xsYXBzZSI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IFByb3ZpZGVzOjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IndlZGdlIiBzcmM9IkV4cGFuZGVkLnBuZyIgdGl0bGU9ImNvbGxhcHNlIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gbG9naWMgdG8gZGlzY292ZXIgYW5kIHJlYWQgYXNzZW1ibHkgZGVzY3JpcHRvcnM8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNzdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFzc2VtYmx5RGVzY3JpcHRvclJlYWRlcjwvc3Bhbj4gYW5kIDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFzc2VtYmx5SW50ZXJwb2xhdG9yPC9zcGFuPiBoZWxwIHdpdGggdGhpcyB0YXNrPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBsb2dpYyB0byBkaXNjb3ZlciBhbmQgYWRkIGZpbHRlcnMgdGhhdCBtZXJnZSBjb250YWluZXIgZGVzY3JpcHRvciBmaWxlczxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA3N3B4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gdGhlc2UgYXJlIGltcGxlbWVudGF0aW9ucyBvZiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Db250YWluZXJEZXNjcmlwdG9ySGFuZGxlcjwvc3Bhbj48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSJmb250LXdlaWdodDogOTAwOyAgIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNDdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBOb3Rlczo8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFyY2hpdmVyPC9zcGFuPiBpbnN0YW5jZXMgYXJlIHJldHJpZXZlZCBmcm9tIHRoZSA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5BcmNoaXZlck1hbmFnZXI8L3NwYW4+PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFyY2hpdmVyPC9zcGFuPiBpbnN0YW5jZXMgYXJlIHdyYXBwZWQgd2l0aCA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Bc3NlbWJseVByb3h5QXJjaGl2ZXI8L3NwYW4+LCB3aGljaCBhZGRzIGdsb2JhbCBwcmVmaXhpbmcsIGRyeS1ydW4sIGFuZCBkdXBsaWNhdGUgZGV0ZWN0aW9uIGZlYXR1cmVzPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5BcmNoaXZlQXNzZW1ibHlQaGFzZXM8L3NwYW4+IGV4ZWN1dGUgdGhlIGFjdHVhbCBpbnRlcmFjdGlvbiB3aXRoIHRoZSAocHJveGllZCkgPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QXJjaGl2ZXI8L3NwYW4+IGluc3RhbmNlIHRvIHByb2R1Y2UgdGhlIGFzc2VtYmx5PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFzc2VtYmx5UHJveHlBcmNoaXZlcjwvc3Bhbj4gaXMgdGhlIG9ubHkgb25lIGluaXRpYWxpemVkIGFzIGEgUE9KTyB3aXRoIHRoZSByZWFsIDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFyY2hpdmVyPC9zcGFuPiBjb21wb25lbnQgaW5zdGFuY2UgcGFzc2VkIGludG8gdGhlIGNvbnN0cnVjdG9yOyBhbGwgb3RoZXIgY2xhc3NlcyB1c2VkIGJ5IHRoZSA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Bc3NlbWJseUFyY2hpdmVyPC9zcGFuPiBhcmUgY29tcG9uZW50cyBpbmplY3RlZCBieSBQbGV4dXM8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFyY2hpdmVBc3NlbWJseVBoYXNlPC9zcGFuPiBpbnN0YW5jZXMgYXJlIGluamVjdGVkIHZpYSBhIE1hcCB3aGljaCBpcyBrZXllZCBieSB0aGVpciByZXNwZWN0aXZlIHJvbGUtaGludHM7IEkgZG9uJ3QgYmVsaWV2ZSB0aGUgb3JkZXJpbmcgb2Yga2V5cyBpbiB0aGlzIG1hcCBpcyBkZXRlcm1pbmlzdGljLjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Db250YWluZXJEZXNjcmlwdG9ySGFuZGxlcjwvc3Bhbj4gaW5zdGFuY2VzIGFyZSBjb21wb25lbnRzIHRoYXQgYXJlIGluamVjdGVkIHZpYSBhIE1hcCB3aGljaCBpcyBrZXllZCBieSB0aGVpciByZXNwZWN0aXZlIHJvbGUtaGludHMuIEN1c3RvbSBpbXBsZW1lbnRhdGlvbnMgY2FuIGJlIGFkZGVkIHZpYSB0aGUgcGx1Z2luLWxldmVsIGRlcGVuZGVuY3kgY29uZmlndXJhdGlvbiBpbiB0aGUgcG9tLnhtbDxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSJjb2xvcjpyZ2IoMTYxLDEwMCw0NSkgOyAgYmFja2dyb3VuZC1jb2xvcjpyZ2IoMTkxLDE5MSwxOTEpIDsgIGZvbnQtd2VpZ2h0OiA4MDA7ICBmb250LXNpemU6IDE0cHg7Ij48ZGl2PgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IndlZGdlIiBzcmM9IkV4cGFuZGVkLnBuZyIgdGl0bGU9ImNvbGxhcHNlIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gQXJjaGl2ZXJBc3NlbWJseVBoYXNlIChvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlKTxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9ImZvbnQtd2VpZ2h0OiA5MDA7ICAiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0N3B4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSJ3ZWRnZSIgc3JjPSJFeHBhbmRlZC5wbmciIHRpdGxlPSJjb2xsYXBzZSI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IERlZmF1bHQgSW1wbGVtZW50YXRpb25zOjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+TW9kdWxlU2V0QXNzZW1ibHlQaGFzZTwvc3Bhbj48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+RGVwZW5kZW5jeVNldEFzc2VtYmx5UGhhc2U8L3NwYW4+PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5GaWxlU2V0QXNzZW1ibHlQaGFzZTwvc3Bhbj48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+RmlsZUl0ZW1Bc3NlbWJseVBoYXNlPC9zcGFuPjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+UmVwb3NpdG9yeUFzc2VtYmx5UGhhc2U8L3NwYW4+PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iZm9udC13ZWlnaHQ6IDkwMDsgICI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDQ3cHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IndlZGdlIiBzcmM9IkV4cGFuZGVkLnBuZyIgdGl0bGU9ImNvbGxhcHNlIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gVXNlczo8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFyY2hpdmVyVGFzazwvc3Bhbj4gaW1wbGVtZW50YXRpb25zLCBhcyBQT0pPczxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5GaWxlRm9ybWF0dGVyPC9zcGFuPiAoPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+RmlsZUl0ZW1Bc3NlbWJseVBoYXNlPC9zcGFuPik8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPlJlcG9zaXRvcnlBc3NlbWJsZXI8L3NwYW4+IChmcm9tIG1hdmVuLXJlcG9zaXRvcnktYnVpbGRlcjsgdXNlZCBieSA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5SZXBvc2l0b3J5QXNzZW1ibHlQaGFzZTwvc3Bhbj4pPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iZm9udC13ZWlnaHQ6IDkwMDsgICI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDQ3cHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IndlZGdlIiBzcmM9IkV4cGFuZGVkLnBuZyIgdGl0bGU9ImNvbGxhcHNlIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gTm90ZXM6PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBJbml0aWFsaXplZCBhcyBQbGV4dXMgY29tcG9uZW50czxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBnZW5lcmFsbHksIGVhY2ggaW1wbGVtZW50YXRpb24gaGFuZGxlcyBvbmUgdG9wLWxldmVsIHNlY3Rpb24gb2YgdGhlIGFzc2VtYmx5IGRlc2NyaXB0b3I8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IHBoYXNlcyBzaGFyZSBjb21tb24gbG9naWMgaW4gdGVybXMgb2YgaG93IHRoZXkgaW50ZXJhY3Qgd2l0aCB0aGUgPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QXJjaGl2ZXI8L3NwYW4+IGluc3RhbmNlOyB0aGlzIGlzIGNhcHR1cmVkIGluIGRpZmZlcmVudCA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5BcmNoaXZlclRhc2s8L3NwYW4+IGltcGxlbWVudGF0aW9uczxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9ImNvbG9yOnJnYigxNjEsMTAwLDQ1KSA7ICBiYWNrZ3JvdW5kLWNvbG9yOnJnYigxOTEsMTkxLDE5MSkgOyAgZm9udC13ZWlnaHQ6IDgwMDsgIGZvbnQtc2l6ZTogMTRweDsiPjxkaXY+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBBcmNoaXZlclRhc2sgKG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzayk8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iZm9udC13ZWlnaHQ6IDkwMDsgICI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDQ3cHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IndlZGdlIiBzcmM9IkV4cGFuZGVkLnBuZyIgdGl0bGU9ImNvbGxhcHNlIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gRGVmYXVsdCBJbXBsZW1lbnRhdGlvbnM6PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFkZEFydGlmYWN0VGFzazwvc3Bhbj48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFkZERlcGVuZGVuY3lTZXRzVGFzazwvc3Bhbj48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QWRkRGlyZWN0b3J5VGFzazwvc3Bhbj48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFkZEZpbGVTZXRzVGFzazwvc3Bhbj48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSJmb250LXdlaWdodDogOTAwOyAgIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNDdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBVc2VzOjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+RGVwZW5kZW5jeVJlc29sdmVyPC9zcGFuPiAoPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QWRkRGVwZW5kZW5jeVNldHNUYXNrPC9zcGFuPik8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+RmlsZVNldEZvcm1hdHRlcjwvc3Bhbj4gKDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFkZEZpbGVTZXRzVGFzazwvc3Bhbj4pPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9ImZvbnQtd2VpZ2h0OiA5MDA7ICAiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0N3B4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSJ3ZWRnZSIgc3JjPSJFeHBhbmRlZC5wbmciIHRpdGxlPSJjb2xsYXBzZSI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IE5vdGVzOjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBVc2VkIGFzIFBPSk9zIHRoYXQgYXJlIGluaXRpYWxpemVkIHRoZW4gZXhlY3V0ZWQgYnkgZGlmZmVyZW50IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFyY2hpdmVyQXNzZW1ibHlQaGFzZTwvc3Bhbj4gaW5zdGFuY2VzLjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSJjb2xvcjpyZ2IoMTYxLDEwMCw0NSkgOyAgYmFja2dyb3VuZC1jb2xvcjpyZ2IoMTkxLDE5MSwxOTEpIDsgIGZvbnQtd2VpZ2h0OiA4MDA7ICBmb250LXNpemU6IDE0cHg7Ij48ZGl2PgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IndlZGdlIiBzcmM9IkV4cGFuZGVkLnBuZyIgdGl0bGU9ImNvbGxhcHNlIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXIgKG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZpbHRlcik8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSJmb250LXdlaWdodDogOTAwOyAgIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNDdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBOb3Rlczo8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IEFkZGVkIHRvIHRoZSA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Bc3NlbWJseVByb3h5QXJjaGl2ZXI8L3NwYW4+IGFzIGEgZmlsdGVyIGFuZCBmaW5hbGl6ZXI8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gQWJpbGl0eSB0byBjaGVycnktcGljayBmaWxlcyBiZWZvcmUgdGhleSdyZSBhZGRlZCB0byB0aGUgYXNzZW1ibHkgYXJjaGl2ZSwgYW5kIHByb2Nlc3MgdGhlbSAocHJvY2Vzc2luZyB1c3VhbGx5IG1lYW5zIGFnZ3JlZ2F0aW9uL21lcmdpbmcsIGJ1dCBjb3VsZCBiZSBhbnl0aGluZyk8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IEFiaWxpdHkgdG8gYWRkIGEgc2V0IG9mICJ2aXJ0dWFsIiBmaWxlcyB0byB0aGUgYXNzZW1ibHkgYXJjaGl2ZSBqdXN0IGJlZm9yZSBpdCBpcyBjbG9zZWQuPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkNvbXBvbmVudHNYbWxBcmNoaXZlRmlsZUZpbHRlcjwvc3Bhbj4gKGZvciBwbGV4dXMgY29tcG9uZW50cy54bWwgZmlsZXMpIGlzIGFsd2F5cyBwcmVzZW50IGR1cmluZyB0aGUgYXNzZW1ibHkgcHJvY2Vzcy48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iY29sb3I6cmdiKDE2MSwxMDAsNDUpIDsgIGJhY2tncm91bmQtY29sb3I6cmdiKDE5MSwxOTEsMTkxKSA7ICBmb250LXdlaWdodDogODAwOyAgZm9udC1zaXplOiAxNHB4OyI+PGRpdj4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSJ3ZWRnZSIgc3JjPSJFeHBhbmRlZC5wbmciIHRpdGxlPSJjb2xsYXBzZSI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IERlcGVuZGVuY3lSZXNvbHZlciAob3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QpPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iZm9udC13ZWlnaHQ6IDkwMDsgICI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDQ3cHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IndlZGdlIiBzcmM9IkV4cGFuZGVkLnBuZyIgdGl0bGU9ImNvbGxhcHNlIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gVXNlczo8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFydGlmYWN0RmFjdG9yeTwvc3Bhbj4gZnJvbSBtYXZlbi1hcnRpZmFjdDxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5BcnRpZmFjdFJlcG9zaXRvcnk8L3NwYW4+IGZyb20gbWF2ZW4tYXJ0aWZhY3Q8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPk1hdmVuUHJvamVjdEJ1aWxkZXI8L3NwYW4+IGZyb20gbWF2ZW4tcHJvamVjdDxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5BcnRpZmFjdFJlc29sdmVyPC9zcGFuPiBmcm9tIG1hdmVuLWFydGlmYWN0PGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIGFsdFJvdyIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5NYXZlbk1ldGFkYXRhU291cmNlPC9zcGFuPi88c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5BcnRpZmFjdE1ldGFkYXRhU291cmNlPC9zcGFuPiBmcm9tIG1hdmVuLXByb2plY3QvbWF2ZW4tYXJ0aWZhY3Q8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSJmb250LXdlaWdodDogOTAwOyAgIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNDdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBOb3Rlczo8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IFNlbGVjdHMgdGhlIGJlc3QgaW1wbGVtZW50YXRpb24gb2YgPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QXJ0aWZhY3RSZXNvbHZlcjwvc3Bhbj4gaXQgY2FuIGZpbmQsIGJhc2VkIG9uIGEgU3RyaW5nLWFycmF5IG9mIHByZWZlcmVudGlhbCByb2xlLWhpbnRzLiBJZiBub25lIG9mIHRoZSBwcmVmZXJyZWQgcmVzb2x2ZXJzIGNhbiBiZSBmb3VuZCwgaXQgZGVmYXVsdHMgdG8gYSBsb29rdXAgd2l0aG91dCBhbnkgcm9sZS1oaW50LiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG1hdmVuIDIuMC54Ljxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9IiI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDYycHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IioiIHNyYz0iTGVhZlJvd0hhbmRsZS5wbmciPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBUaGlzIGNvbXBvbmVudCBjYW4gdGFrZSBhIExpc3Qgb2YgcmVtb3RlIHJlcG9zaXRvcmllcyBmcm9tIHRoZSBjdXJyZW50IGJ1aWxkLCBhcHBlbmQgdG8gdGhpcyB0aGUgTGlzdCBvZiByZW1vdGUgcmVwb3NpdG9yaWVzIGZyb20gdGhlIHByb2plY3QgcGFzc2VkIGluIChhdm9pZGluZyBkdXBsaWNhdGUgZW50cmllcywgYmFzZWQgb24gcmVwb3NpdG9yeSBpZCksIGFuZCB1c2UgdGhhdCBhcyBhIGJhc2lzIGZvciByZXNvbHZpbmcgZGVwZW5kZW5jeSBhcnRpZmFjdHM8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNjJweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0iKiIgc3JjPSJMZWFmUm93SGFuZGxlLnBuZyI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IDxzcGFuIGNsYXNzPSIgbnMtQ2l0YXRpb24iPkFzc2VtYmx5Q29uZmlndXJhdGlvblNvdXJjZS5pc1VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXMoKTwvc3Bhbj4gaXMgdXNlZCBpbiBjYWxsaW5nIGNvbXBvbmVudHMgdG8gY29udHJvbCB3aGV0aGVyIHRoaXMgY29tcG9uZW50ICh0aGUgcmVzb2x2ZXIpIGRvZXMgYSBmdWxsIHRyYW5zaXRpdmUgcmVzb2x1dGlvbiBvZiB0aGUgcHJvamVjdCdzIGRlcGVuZGVuY2llcywgb3IganVzdCByZXNvbHZlcyB0aGUgZGlyZWN0IGRlcGVuZGVuY3kgYXJ0aWZhY3RzPGJyPgotPC9kaXY+PC90ZD48L3RyPgotPHRyPjx0ZCBjbGFzcz0iY29sMSBjb2xfd2lkdGgxIiBzdHlsZT0iY29sb3I6cmdiKDE2MSwxMDAsNDUpIDsgIGJhY2tncm91bmQtY29sb3I6cmdiKDE5MSwxOTEsMTkxKSA7ICBmb250LXdlaWdodDogODAwOyAgZm9udC1zaXplOiAxNHB4OyI+PGRpdj4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSJ3ZWRnZSIgc3JjPSJFeHBhbmRlZC5wbmciIHRpdGxlPSJjb2xsYXBzZSI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IEZpbGVGb3JtYXR0ZXIgKG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdCk8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEgYWx0Um93IiBzdHlsZT0iZm9udC13ZWlnaHQ6IDkwMDsgICI+PGRpdiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDQ3cHg7IHRleHQtaW5kZW50OiAtMzJweDsiPgotPGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMyIgdnNwYWNlPSIwIiBhbHQ9IndlZGdlIiBzcmM9IkV4cGFuZGVkLnBuZyIgdGl0bGU9ImNvbGxhcHNlIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gVXNlczo8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gPHNwYW4gY2xhc3M9IiBucy1DaXRhdGlvbiI+QXNzZW1ibHlGaWxlVXRpbHM8L3NwYW4+IGZvciBsaW5lLWVuZGluZyBub3JtYWxpemF0aW9uIGFuZCB0ZW1wLWRpci90ZW1wLWZpbGUgbWFuYWdlbWVudDxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSJmb250LXdlaWdodDogOTAwOyAgIj48ZGl2IHN0eWxlPSJtYXJnaW4tbGVmdDogNDdweDsgdGV4dC1pbmRlbnQ6IC0zMnB4OyI+Ci08aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIzIiB2c3BhY2U9IjAiIGFsdD0id2VkZ2UiIHNyYz0iRXhwYW5kZWQucG5nIiB0aXRsZT0iY29sbGFwc2UiPjxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjIiIHZzcGFjZT0iMCIgYWx0PSIgIiBzcmM9IlVuY2hlY2tlZC5wbmciPiBQcm92aWRlczo8YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08dHI+PHRkIGNsYXNzPSJjb2wxIGNvbF93aWR0aDEiIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gSW50ZXJwb2xhdGlvbiBvZiBhIGdpdmVuIGZpbGUncyBjb250ZW50cywgYmFzZWQgb24gcHJvamVjdCB2YWx1ZXMgYW5kIGFuIG9wdGlvbmFsIFByb3BlcnRpZXMgZmlsZSBvciBzZXQgb2YgZmlsdGVyIGZpbGVzIChzdXBwbGllZCBieSA8c3BhbiBjbGFzcz0iIG5zLUNpdGF0aW9uIj5Bc3NlbWJseUNvbmZpZ3VyYXRpb25Tb3VyY2U8L3NwYW4+KTxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gTm9ybWFsaXphdGlvbiBvZiBsaW5lIGVuZGluZ3MsIHVzaW5nIHZhbHVlczoga2VlcCAoZG9uJ3QgY2hhbmdlKSwgZG9zIChcclxuKSwgY3JsZiAoXHJcbiksIHVuaXggKFxuKSwgbGYgKFxuKTxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSIgc3R5bGU9ImZvbnQtd2VpZ2h0OiA5MDA7ICAiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA0N3B4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSJ3ZWRnZSIgc3JjPSJFeHBhbmRlZC5wbmciIHRpdGxlPSJjb2xsYXBzZSI+PGltZyBib3JkZXI9IjAiIGhzcGFjZT0iMiIgdnNwYWNlPSIwIiBhbHQ9IiAiIHNyYz0iVW5jaGVja2VkLnBuZyI+IE5vdGVzOjxicj4KLTwvZGl2PjwvdGQ+PC90cj4KLTx0cj48dGQgY2xhc3M9ImNvbDEgY29sX3dpZHRoMSBhbHRSb3ciIHN0eWxlPSIiPjxkaXYgc3R5bGU9Im1hcmdpbi1sZWZ0OiA2MnB4OyB0ZXh0LWluZGVudDogLTMycHg7Ij4KLTxpbWcgYm9yZGVyPSIwIiBoc3BhY2U9IjMiIHZzcGFjZT0iMCIgYWx0PSIqIiBzcmM9IkxlYWZSb3dIYW5kbGUucG5nIj48aW1nIGJvcmRlcj0iMCIgaHNwYWNlPSIyIiB2c3BhY2U9IjAiIGFsdD0iICIgc3JjPSJVbmNoZWNrZWQucG5nIj4gSWYgbGluZSBlbmRpbmcgaXMgbm90ICdrZWVwJywgdGhlIGZpbmFsIGxpbmUgaW4gdGhlIGZpbGUgd2lsbCA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IDkwMDsgICI+YWx3YXlzPC9zcGFuPiBlbmQgd2l0aCBhIG5ld2xpbmUgc3RyaW5nLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBpcyB0aGUgY2FzZSBpbiB0aGUgb3JpZ2luYWwgZmlsZS4gU2VlIE1BU1NFTUJMWS05Ni48YnI+Ci08L2Rpdj48L3RkPjwvdHI+Ci08L3RhYmxlPjwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2Rvd25sb2FkLmNnaSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUvcmVzb3VyY2VzL2Rvd25sb2FkLmNnaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIxNzhkMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3Jlc291cmNlcy9kb3dubG9hZC5jZ2kKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0jIS9iaW4vc2gKLSMKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotIyBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSMgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSMgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotIyB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0jICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSMgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSMgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSMgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0jIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotIyBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0jIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotIyBKdXN0IGNhbGwgdGhlIHN0YW5kYXJkIG1pcnJvcnMuY2dpIHNjcmlwdC4gSXQgd2lsbCB1c2UgZG93bmxvYWQuaHRtbAotIyBhcyB0aGUgaW5wdXQgdGVtcGxhdGUuCi1leGVjIC93d3cvd3d3LmFwYWNoZS5vcmcvZHluL21pcnJvcnMvbWlycm9ycy5jZ2kgJCoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3NpdGUueG1sIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDYwZTA2OS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ERUNPUkFUSU9OLzEuMC4wIgotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL0RFQ09SQVRJT04vMS4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2RlY29yYXRpb24tMS4wLjAueHNkIj4KLSAgPGJvZHk+Ci0gICAgPG1lbnUgbmFtZT0iUmVmZXJlbmNlIj4KLSAgICAgIDxpdGVtIG5hbWU9IkZlYXR1cmVzIiBocmVmPSIuL2ZlYXR1cmVzLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkRlc2NyaXB0b3IgRm9ybWF0IiBocmVmPSIuL2Fzc2VtYmx5Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkNvbXBvbmVudCBGb3JtYXQiIGhyZWY9Ii4vY29tcG9uZW50Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlByZWRlZmluZWQgRGVzY3JpcHRvcnMiIGhyZWY9Ii4vZGVzY3JpcHRvci1yZWZzLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJPdmVydmlldyI+Ci0gICAgICA8aXRlbSBuYW1lPSJJbnRyb2R1Y3Rpb24iIGhyZWY9Ii4vaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iR29hbHMiIGhyZWY9Ii4vcGx1Z2luLWluZm8uaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iVXNhZ2UiIGhyZWY9Ii4vdXNhZ2UuaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iRkFRIiBocmVmPSIuL2ZhcS5odG1sIi8+Ci0gICAgICA8IS0tIEFjY29yZGluZyB0byBodHRwOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL01OR1NJVEUtMTUyIC0tPgotICAgICAgPGl0ZW0gbmFtZT0iTGljZW5zZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyIvPgotICAgICAgPGl0ZW0gbmFtZT0iRG93bmxvYWQiIGhyZWY9ImRvd25sb2FkLmh0bWwiLz4KLSAgICA8L21lbnU+Ci0KLSAgICA8bWVudSBuYW1lPSJBZHZhbmNlZCBUb3BpY3MiPgotICAgICAgPGl0ZW0gbmFtZT0iQXNzZW1ibHkgRGVzY3JpcHRvcnMiIGhyZWY9Ii4vYWR2YW5jZWQtZGVzY3JpcHRvci10b3BpY3MuaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iTW9kdWxlU2V0cyIgaHJlZj0iLi9hZHZhbmNlZC1tb2R1bGUtc2V0LXRvcGljcy5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iRXhhbXBsZXMiPgotICAgICAgPGl0ZW0gbmFtZT0iRXhhbXBsZXMgSW5kZXgiIGhyZWY9Ii4vZXhhbXBsZXMvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iU2luZ2xlIFByb2plY3QiIGNvbGxhcHNlPSJmYWxzZSIgaHJlZj0iLi9leGFtcGxlcy9zaW5nbGUvaW5kZXguaHRtbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkZpbHRlcmluZyBTb21lIERpc3RyaWJ1dGlvbiBGaWxlcyIgaHJlZj0iLi9leGFtcGxlcy9zaW5nbGUvZmlsdGVyaW5nLXNvbWUtZGlzdHJpYnV0aW9uLWZpbGVzLmh0bWwiLz4KLSAgICAgICAgPGl0ZW0gbmFtZT0iSW5jbHVkaW5nL0V4Y2x1ZGluZyBBcnRpZmFjdHMiIGhyZWY9Ii4vZXhhbXBsZXMvc2luZ2xlL2luY2x1ZGluZy1hbmQtZXhjbHVkaW5nLWFydGlmYWN0cy5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IlVzaW5nIENvbXBvbmVudCBEZXNjcmlwdG9ycyIgaHJlZj0iLi9leGFtcGxlcy9zaW5nbGUvdXNpbmctY29tcG9uZW50cy5odG1sIi8+Ci0gICAgICAgIDxpdGVtIG5hbWU9IlVzaW5nIFJlcG9zaXRvcmllcyIgaHJlZj0iLi9leGFtcGxlcy9zaW5nbGUvdXNpbmctcmVwb3NpdG9yaWVzLmh0bWwiLz4KLSAgICAgIDwvaXRlbT4KLSAgICAgIDxpdGVtIG5hbWU9Ik11bHRpbW9kdWxlIFByb2plY3RzIiBjb2xsYXBzZT0iZmFsc2UiIGhyZWY9Ii4vZXhhbXBsZXMvbXVsdGltb2R1bGUvaW5kZXguaHRtbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9IkluY2x1ZGUgTW9kdWxlIEFydGlmYWN0cyIgaHJlZj0iLi9leGFtcGxlcy9tdWx0aW1vZHVsZS9tb2R1bGUtYmluYXJ5LWluY2x1c2lvbi1zaW1wbGUuaHRtbCIvPgotICAgICAgICA8aXRlbSBuYW1lPSJJbmNsdWRlIE1vZHVsZSBTb3VyY2VzIiBocmVmPSIuL2V4YW1wbGVzL211bHRpbW9kdWxlL21vZHVsZS1zb3VyY2UtaW5jbHVzaW9uLXNpbXBsZS5odG1sIi8+Ci0gICAgICA8L2l0ZW0+Ci0gICAgICA8aXRlbSBuYW1lPSJTaGFyaW5nIEFzc2VtYmx5IERlc2NyaXB0b3JzIiBocmVmPSIuL2V4YW1wbGVzL3NoYXJpbmctZGVzY3JpcHRvcnMuaHRtbCIvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS94ZG9jL2Rvd25sb2FkLnhtbC52bSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3NpdGUveGRvYy9kb3dubG9hZC54bWwudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODZkOTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvc2l0ZS94ZG9jL2Rvd25sb2FkLnhtbC52bQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLXNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0iQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLUtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGRvY3VtZW50PgotICA8cHJvcGVydGllcz4KLSAgICA8dGl0bGU+RG93bmxvYWQgJHtwcm9qZWN0Lm5hbWV9IFNvdXJjZTwvdGl0bGU+Ci0gIDwvcHJvcGVydGllcz4KLSAgPGJvZHk+Ci0gICAgPHNlY3Rpb24gbmFtZT0iRG93bmxvYWQgJHtwcm9qZWN0Lm5hbWV9ICR7cHJvamVjdC52ZXJzaW9ufSBTb3VyY2UiPgotCi0gICAgICA8cD4ke3Byb2plY3QubmFtZX0gJHtwcm9qZWN0LnZlcnNpb259IGlzIGRpc3RyaWJ1dGVkIGluIHNvdXJjZSBmb3JtYXQuIFVzZSBhIHNvdXJjZSBhcmNoaXZlIGlmIHlvdSBpbnRlbmQgdG8gYnVpbGQKLSAgICAgICR7cHJvamVjdC5uYW1lfSB5b3Vyc2VsZi4gT3RoZXJ3aXNlLCBzaW1wbHkgdXNlIHRoZSByZWFkeS1tYWRlIGJpbmFyeSBhcnRpZmFjdHMgZnJvbSBjZW50cmFsIHJlcG9zaXRvcnkuPC9wPgotCi0gICAgICA8cD5Zb3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgYSBtaXJyb3IgLSBpZiB0aGUgZmlsZSBpcyBub3QgZm91bmQgb24geW91cnMsIHBsZWFzZSBiZSBwYXRpZW50LCBhcyBpdCBtYXkgdGFrZSAyNAotICAgICAgaG91cnMgdG8gcmVhY2ggYWxsIG1pcnJvcnMuPHAvPgotCi0gICAgICA8cD5JbiBvcmRlciB0byBndWFyZCBhZ2FpbnN0IGNvcnJ1cHRlZCBkb3dubG9hZHMvaW5zdGFsbGF0aW9ucywgaXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvCi0gICAgICA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZGV2L3JlbGVhc2Utc2lnbmluZyN2ZXJpZnlpbmctc2lnbmF0dXJlIj52ZXJpZnkgdGhlIHNpZ25hdHVyZTwvYT4KLSAgICAgIG9mIHRoZSByZWxlYXNlIGJ1bmRsZXMgYWdhaW5zdCB0aGUgcHVibGljIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9kaXN0L21hdmVuL0tFWVMiPktFWVM8L2E+IHVzZWQgYnkgdGhlIEFwYWNoZSBNYXZlbgotICAgICAgZGV2ZWxvcGVycy48L3A+Ci0KLSAgICAgIDxwPiR7cHJvamVjdC5uYW1lfSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgPGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLyI+QXBhY2hlIExpY2Vuc2UsIHZlcnNpb24gMi4wPC9hPi48L3A+Ci0KLSAgICAgIDxwPjwvcD5XZSA8Yj5zdHJvbmdseTwvYj4gZW5jb3VyYWdlIG91ciB1c2VycyB0byBjb25maWd1cmUgYSBNYXZlbiByZXBvc2l0b3J5IG1pcnJvciBjbG9zZXIgdG8gdGhlaXIgbG9jYXRpb24sIHBsZWFzZSByZWFkIDxhIGhyZWY9Ii4vZ3VpZGVzL21pbmkvZ3VpZGUtbWlycm9yLXNldHRpbmdzLmh0bWwiPkhvdyB0byBVc2UgTWlycm9ycyBmb3IgUmVwb3NpdG9yaWVzPC9hPi48L3A+Ci0KLSAgICAgIDxhIG5hbWU9Im1pcnJvciIvPgotICAgICAgPHN1YnNlY3Rpb24gbmFtZT0iTWlycm9yIj4KLQotICAgICAgICA8cD4KLSAgICAgICAgICBbaWYtYW55IGxvZ29dCi0gICAgICAgICAgPGEgaHJlZj0iW2xpbmtdIj4KLSAgICAgICAgICAgIDxpbWcgYWxpZ249InJpZ2h0IiBzcmM9Iltsb2dvXSIgYm9yZGVyPSIwIgotICAgICAgICAgICAgICAgICBhbHQ9ImxvZ28iLz4KLSAgICAgICAgICA8L2E+Ci0gICAgICAgICAgW2VuZF0KLSAgICAgICAgICBUaGUgY3VycmVudGx5IHNlbGVjdGVkIG1pcnJvciBpcwotICAgICAgICAgIDxiPltwcmVmZXJyZWRdPC9iPi4KLSAgICAgICAgICBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgbWlycm9yLAotICAgICAgICAgIHBsZWFzZSBzZWxlY3QgYW5vdGhlciBtaXJyb3IuCi0gICAgICAgICAgSWYgYWxsIG1pcnJvcnMgYXJlIGZhaWxpbmcsIHRoZXJlIGFyZQotICAgICAgICAgIDxpPmJhY2t1cDwvaT4KLSAgICAgICAgICBtaXJyb3JzCi0gICAgICAgICAgKGF0IHRoZSBlbmQgb2YgdGhlIG1pcnJvcnMgbGlzdCkgdGhhdCBzaG91bGQgYmUgYXZhaWxhYmxlLgotICAgICAgICA8L3A+Ci0KLSAgICAgICAgPGZvcm0gYWN0aW9uPSJbbG9jYXRpb25dIiBtZXRob2Q9ImdldCIgaWQ9IlNlbGVjdE1pcnJvciI+Ci0gICAgICAgICAgT3RoZXIgbWlycm9yczoKLSAgICAgICAgICA8c2VsZWN0IG5hbWU9IlByZWZlcnJlZCI+Ci0gICAgICAgICAgICBbaWYtYW55IGh0dHBdCi0gICAgICAgICAgICBbZm9yIGh0dHBdCi0gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJbaHR0cF0iPltodHRwXTwvb3B0aW9uPgotICAgICAgICAgICAgW2VuZF0KLSAgICAgICAgICAgIFtlbmRdCi0gICAgICAgICAgICBbaWYtYW55IGZ0cF0KLSAgICAgICAgICAgIFtmb3IgZnRwXQotICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iW2Z0cF0iPltmdHBdPC9vcHRpb24+Ci0gICAgICAgICAgICBbZW5kXQotICAgICAgICAgICAgW2VuZF0KLSAgICAgICAgICAgIFtpZi1hbnkgYmFja3VwXQotICAgICAgICAgICAgW2ZvciBiYWNrdXBdCi0gICAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJbYmFja3VwXSI+W2JhY2t1cF0gKGJhY2t1cCk8L29wdGlvbj4KLSAgICAgICAgICAgIFtlbmRdCi0gICAgICAgICAgICBbZW5kXQotICAgICAgICAgIDwvc2VsZWN0PgotICAgICAgICAgIDxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSJDaGFuZ2UiLz4KLSAgICAgICAgPC9mb3JtPgotCi0gICAgICAgIDxwPgotICAgICAgICAgIFlvdSBtYXkgYWxzbyBjb25zdWx0IHRoZQotICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9taXJyb3JzLyI+Y29tcGxldGUgbGlzdCBvZgotICAgICAgICAgICAgbWlycm9ycy48L2E+Ci0gICAgICAgIDwvcD4KLQotICAgICAgPC9zdWJzZWN0aW9uPgotICAgICAgCi0gICAgICA8c3Vic2VjdGlvbiBuYW1lPSIke3Byb2plY3QubmFtZX0gJHtwcm9qZWN0LnZlcnNpb259Ij4KLSAgICAgICAgCi0gICAgICA8cD5UaGlzIGlzIHRoZSBjdXJyZW50IHN0YWJsZSB2ZXJzaW9uIG9mICR7cHJvamVjdC5uYW1lfS48L3A+Ci0gICAgICAgIAotICAgICAgPHRhYmxlPgotICAgICAgICA8dGhlYWQ+Ci0gICAgICAgICAgPHRyPgotICAgICAgICAgICAgPHRoPjwvdGg+Ci0gICAgICAgICAgICA8dGg+TGluazwvdGg+Ci0gICAgICAgICAgICA8dGg+Q2hlY2tzdW08L3RoPgotICAgICAgICAgICAgPHRoPlNpZ25hdHVyZTwvdGg+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90aGVhZD4KLSAgICAgICAgPHRib2R5PgotICAgICAgICAgIDx0cj4KLSAgICAgICAgICAgIDx0ZD4ke3Byb2plY3QubmFtZX0gJHtwcm9qZWN0LnZlcnNpb259IChTb3VyY2UgemlwKTwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iW3ByZWZlcnJlZF1tYXZlbi9wbHVnaW5zLyR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn0tc291cmNlLXJlbGVhc2UuemlwIj5tYXZlbi9wbHVnaW5zLyR7cHJvamVjdC5hcnRpZmFjdElkfS0ke3Byb2plY3QudmVyc2lvbn0tc291cmNlLXJlbGVhc2UuemlwPC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbWF2ZW4vcGx1Z2lucy8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LXNvdXJjZS1yZWxlYXNlLnppcC5tZDUiPm1hdmVuL3BsdWdpbnMvJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS1zb3VyY2UtcmVsZWFzZS56aXAubWQ1PC9hPjwvdGQ+Ci0gICAgICAgICAgICA8dGQ+PGEgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2Rpc3QvbWF2ZW4vcGx1Z2lucy8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tJHtwcm9qZWN0LnZlcnNpb259LXNvdXJjZS1yZWxlYXNlLnppcC5hc2MiPm1hdmVuL3BsdWdpbnMvJHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufS1zb3VyY2UtcmVsZWFzZS56aXAuYXNjPC9hPjwvdGQ+Ci0gICAgICAgICAgPC90cj4KLSAgICAgICAgPC90Ym9keT4KLSAgICAgIDwvdGFibGU+Ci0gICAgICA8L3N1YnNlY3Rpb24+Ci0KLSAgICAgIDxzdWJzZWN0aW9uIG5hbWU9IlByZXZpb3VzIFZlcnNpb25zIj4KLSAgICAgICAgCi0gICAgICA8cD5PbGRlciBub24tcmVjb21tZW5kZWQgcmVsZWFzZXMgY2FuIGJlIGZvdW5kIG9uIG91ciA8YSBocmVmPSJodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvbWF2ZW4vcGx1Z2lucy8iPmFyY2hpdmUgc2l0ZTwvYT4uPC9wPgotCi0gICAgICA8L3N1YnNlY3Rpb24+Ci0gICAgPC9zZWN0aW9uPgotICA8L2JvZHk+Ci08L2RvY3VtZW50PgotCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9EZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL0RlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjRhYmE4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL0RlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZTsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5waGFzZS5Bc3NlbWJseUFyY2hpdmVyUGhhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuQXNzZW1ibHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9qb3MuQWJzdHJhY3RBc3NlbWJseU1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdHV0aWxzLlRlc3RGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuRGVmYXVsdFBsZXh1c0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLlBsZXh1c0NvbnRhaW5lcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLlBsZXh1c0NvbnRhaW5lckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5kaWFncy5Ob09wQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLkFyY2hpdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci50YXIuVGFyQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci50YXIuVGFyTG9uZ0ZpbGVNb2RlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIud2FyLldhckFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuemlwLlppcEFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5GaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5jb25zb2xlLkNvbnNvbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suKjsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC4qOwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0Ci17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXN0RmlsZU1hbmFnZXIgZmlsZU1hbmFnZXIgPSBuZXcgVGVzdEZpbGVNYW5hZ2VyKCAiZGVmLWFzc3ktYXJjaGl2ZXIudGVzdC4iLCAiIiApOwotCi0gICAgcHJpdmF0ZSBQbGV4dXNDb250YWluZXIgY29udGFpbmVyOwotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldHVwKCkKLSAgICAgICAgdGhyb3dzIFBsZXh1c0NvbnRhaW5lckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY29udGFpbmVyID0gbmV3IERlZmF1bHRQbGV4dXNDb250YWluZXIoKTsKLSAgICAgICAgY29udGFpbmVyLmluaXRpYWxpemUoKTsKLSAgICAgICAgY29udGFpbmVyLnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgQEFmdGVyQ2xhc3MKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd24oKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaWxlTWFuYWdlci5jbGVhblVwKCk7Ci0gICAgfQotCi0gICAgQFRlc3QoIGV4cGVjdGVkID0gSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24uY2xhc3MgKQotICAgIHB1YmxpYyB2b2lkIGZhaWxXaGVuQXNzZW1ibHlJZElzTnVsbCgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFzc2VtYmx5QXJjaGl2ZXIgbWFjTWdyID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQXNzZW1ibHlBcmNoaXZlciggbW0gKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSA9IG1tLmNyZWF0ZUNvbnRyb2woKS5jcmVhdGVNb2NrKAotICAgICAgICAgICAgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZS5jbGFzcyApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyIGFyY2hpdmVyID0gY3JlYXRlU3ViamVjdCggbWFjTWdyLCBudWxsLCBudWxsICk7Ci0gICAgICAgIGFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUoIG5ldyBBc3NlbWJseSgpLCAiZnVsbC1uYW1lIiwgInppcCIsIGNvbmZpZ1NvdXJjZSwgZmFsc2UgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBcmNoaXZlKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwKLSAgICAgICAgSU9FeGNlcHRpb24sIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyIG1hY01nciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFzc2VtYmx5QXJjaGl2ZXIoIG1tICk7Ci0KLSAgICAgICAgbWFjTWdyLmV4cGVjdEdldEFyY2hpdmVyKCAiemlwIiwgQXJjaGl2ZXIuY2xhc3MgKTsKLSAgICAgICAgbWFjTWdyLmV4cGVjdEdldERlc3RGaWxlKCBuZXcgRmlsZSggInRlc3QiICkgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseUFyY2hpdmVyUGhhc2UgcGhhc2UgPSBtbS5jcmVhdGVDb250cm9sKCkuY3JlYXRlTW9jayhBc3NlbWJseUFyY2hpdmVyUGhhc2UuY2xhc3MgICk7Ci0KLSAgICAgICAgcGhhc2UuZXhlY3V0ZSggKEFzc2VtYmx5KWFueU9iamVjdCgpLCAoQXJjaGl2ZXIpYW55T2JqZWN0KCksIChBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlKWFueU9iamVjdCgpICk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgPQotICAgICAgICAgICAgbW0uY3JlYXRlQ29udHJvbCgpLmNyZWF0ZU1vY2soIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIHRlbXBEaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0gICAgICAgIEZpbGVVdGlscy5kZWxldGVEaXJlY3RvcnkoIHRlbXBEaXIgKTsKLQotICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldFRlbXBvcmFyeVJvb3REaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCB0ZW1wRGlyICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNEcnlSdW4oKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmlzSWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucygpKS5hbmRSZXR1cm4oIGZhbHNlICkuYW55VGltZXMoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIG91dERpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBtYWNNZ3IuYXJjaGl2ZXIuc2V0RGVzdEZpbGUoIG5ldyBGaWxlKCBvdXREaXIsICJmdWxsLW5hbWUuemlwIiApICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1hY01nci5hcmNoaXZlci5jcmVhdGVBcmNoaXZlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCggIlNob3VsZCBuZXZlciBoYXBwZW4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJT0V4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCggIlNob3VsZCBuZXZlciBoYXBwZW4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldE91dHB1dERpcmVjdG9yeSgpKS5hbmRSZXR1cm4oIG91dERpciApOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRGaW5hbE5hbWUoKSApLmFuZFJldHVybiggImZpbmFsTmFtZSIgKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0QXJjaGl2ZXJDb25maWcoKSkuYW5kUmV0dXJuKCBudWxsICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCAgICBjb25maWdTb3VyY2UuZ2V0V29ya2luZ0RpcmVjdG9yeSgpKS5hbmRSZXR1cm4oIG5ldyBGaWxlKCAiLiIgKSkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNVcGRhdGVPbmx5KCkpLmFuZFJldHVybiggZmFsc2UgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc0lnbm9yZVBlcm1pc3Npb25zKCkpLmFuZFJldHVybiggZmFsc2UgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIGFzc2VtYmx5LnNldElkKCAiaWQiICk7Ci0KLSAgICAgICAvLyB0cnkKLSAgICAgICAvLyB7Ci0gICAvLyAgICAgICAgIGV4cGVjdCggbWFjTWdyLmRlcGVuZGVuY3lSZXNvbHZlci5yZXNvbHZlKCAoQXNzZW1ibHkpIGFueU9iamVjdCgpLCAoQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSkgYW55T2JqZWN0KCkgKSkuYW5kUmV0dXJuKCBuZXcgSGFzaFNldDxBcnRpZmFjdD4oICApICk7Ci0vLyAgICAgICAgICAgIG1hY01nci5kZXBlbmRlbmN5UmVzb2x2ZXJDb250cm9sLnNldE1hdGNoZXIoIE1vY2tDb250cm9sLkFMV0FZU19NQVRDSEVSICk7Ci0gICAvLyAgICAgfQotICAgICAgLy8gIGNhdGNoICggZmluYWwgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgLy8gewotICAgICAgICAvLyAgICBmYWlsKCAiU2hvdWxkIG5ldmVyIGhhcHBlbiIgKTsKLSAgICAgICAvLyB9Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIgc3ViamVjdCA9IGNyZWF0ZVN1YmplY3QoIG1hY01nciwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggcGhhc2UgKSwgbnVsbCApOwotCi0gICAgICAgIHN1YmplY3QuY3JlYXRlQXJjaGl2ZSggYXNzZW1ibHksICJmdWxsLW5hbWUiLCAiemlwIiwgY29uZmlnU291cmNlLCBmYWxzZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUFyY2hpdmVyX1Nob3VsZENvbmZpZ3VyZUFyY2hpdmVyKCkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uLCBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQXNzZW1ibHlBcmNoaXZlciBtYWNBcmNoaXZlck1hbmFnZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyKCBtbSApOwotCi0gICAgICAgIGZpbmFsIFRlc3RBcmNoaXZlcldpdGhDb25maWcgYXJjaGl2ZXIgPSBuZXcgVGVzdEFyY2hpdmVyV2l0aENvbmZpZygpOwotCi0gICAgICAgIG1hY0FyY2hpdmVyTWFuYWdlci5leHBlY3RHZXRBcmNoaXZlciggImR1bW15IiwgYXJjaGl2ZXIgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSA9IG1tLmNyZWF0ZU1vY2soICBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlLmNsYXNzKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgc2ltcGxlQ29uZmlnID0gInZhbHVlIjsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRBcmNoaXZlckNvbmZpZygpKS5hbmRSZXR1cm4oCi0gICAgICAgICI8Y29uZmlndXJhdGlvbj48c2ltcGxlQ29uZmlnPiIgKyBzaW1wbGVDb25maWcgKyAiPC9zaW1wbGVDb25maWc+PC9jb25maWd1cmF0aW9uPiIpLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCBuZXcgTW9kZWwoKSApOwotCi0gICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpKS5hbmRSZXR1cm4oIHByb2plY3QgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0TWF2ZW5TZXNzaW9uKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5pc0RyeVJ1bigpKS5hbmRSZXR1cm4oIGZhbHNlICkuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldFdvcmtpbmdEaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCAgbmV3IEZpbGUoICIuIiApKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuaXNVcGRhdGVPbmx5KCkpLmFuZFJldHVybiggZmFsc2UgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBsciA9IG1tLmNyZWF0ZU1vY2soIEFydGlmYWN0UmVwb3NpdG9yeS5jbGFzcyApOwotCi0gICAgICAgIGV4cGVjdChsci5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggICIvcGF0aC90by9sb2NhbC9yZXBvIiApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRMb2NhbFJlcG9zaXRvcnkoKSkuYW5kUmV0dXJuKCBsciApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmlzSWdub3JlUGVybWlzc2lvbnMoKSApLmFuZFJldHVybiggdHJ1ZSApOwotICAgICAgICBzZXR1cEludGVycG9sYXRvcnMoIGNvbmZpZ1NvdXJjZSwgcHJvamVjdCApOwotCi0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIgc3ViamVjdCA9Ci0gICAgICAgICAgICBjcmVhdGVTdWJqZWN0KCBtYWNBcmNoaXZlck1hbmFnZXIsIG5ldyBBcnJheUxpc3Q8QXNzZW1ibHlBcmNoaXZlclBoYXNlPigpLCBudWxsICk7Ci0KLSAgICAgICAgc3ViamVjdC5jcmVhdGVBcmNoaXZlciggImR1bW15IiwgZmFsc2UsICJmaW5hbE5hbWUiLCBjb25maWdTb3VyY2UsIG51bGwsIGZhbHNlICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBzaW1wbGVDb25maWcsIGFyY2hpdmVyLmdldFNpbXBsZUNvbmZpZygpICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyAgdm9pZCBzZXR1cEludGVycG9sYXRvcnMoIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFJlcG9zaXRvcnlJbnRlcnBvbGF0b3IoKSApLmFuZFJldHVybiggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRDb21tYW5kTGluZVByb3BzSW50ZXJwb2xhdG9yKCkgKS5hbmRSZXR1cm4oIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSgpICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0RW52SW50ZXJwb2xhdG9yKCkgKS5hbmRSZXR1cm4oIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSgpICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0TWFpblByb2plY3RJbnRlcnBvbGF0b3IoKSApLmFuZFJldHVybiggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKS5hbnlUaW1lcygpOwotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyAgdm9pZCBzZXR1cEludGVycG9sYXRvcnMoIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlLCBNYXZlblByb2plY3QgbWF2ZW5Qcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFJlcG9zaXRvcnlJbnRlcnBvbGF0b3IoKSApLmFuZFJldHVybiggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRDb21tYW5kTGluZVByb3BzSW50ZXJwb2xhdG9yKCkgKS5hbmRSZXR1cm4oIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSgpICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0RW52SW50ZXJwb2xhdG9yKCkgKS5hbmRSZXR1cm4oIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSgpICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0TWFpblByb2plY3RJbnRlcnBvbGF0b3IoKSApLmFuZFJldHVybiggQWJzdHJhY3RBc3NlbWJseU1vam8ubWFpblByb2plY3RJbnRlcnBvbGF0b3IoIG1hdmVuUHJvamVjdCkgKS5hbnlUaW1lcygpOwotCi0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBcmNoaXZlcl9TaG91bGRDcmVhdGVUYXJBcmNoaXZlcldpdGhOb0NvbXByZXNzaW9uKCkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uLCBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIFRlc3RUYXJBcmNoaXZlciB0dEFyY2hpdmVyID0gbmV3IFRlc3RUYXJBcmNoaXZlcigpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQXNzZW1ibHlBcmNoaXZlciBtYWNBcmNoaXZlck1hbmFnZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyKCBtbSApOwotCi0gICAgICAgIG1hY0FyY2hpdmVyTWFuYWdlci5leHBlY3RHZXRBcmNoaXZlciggInRhciIsIHR0QXJjaGl2ZXIgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSA9IG1tLmNyZWF0ZU1vY2soIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRUYXJMb25nRmlsZU1vZGUoKSkuYW5kUmV0dXJuKCBUYXJMb25nRmlsZU1vZGUuZmFpbC50b1N0cmluZygpKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc0RyeVJ1bigpKS5hbmRSZXR1cm4oIGZhbHNlICkuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRBcmNoaXZlckNvbmZpZygpKS5hbmRSZXR1cm4oIG51bGwgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFByb2plY3QoKSkuYW5kUmV0dXJuKCBuZXcgTWF2ZW5Qcm9qZWN0KCBuZXcgTW9kZWwoKSApICkuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRKYXJBcmNoaXZlQ29uZmlndXJhdGlvbigpKS5hbmRSZXR1cm4oIG51bGwgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFdvcmtpbmdEaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCAgbmV3IEZpbGUoICIuIiApICkuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc1VwZGF0ZU9ubHkoKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNJZ25vcmVQZXJtaXNzaW9ucygpKS5hbmRSZXR1cm4oIHRydWUgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyIHN1YmplY3QgPQotICAgICAgICAgICAgY3JlYXRlU3ViamVjdCggbWFjQXJjaGl2ZXJNYW5hZ2VyLCBuZXcgQXJyYXlMaXN0PEFzc2VtYmx5QXJjaGl2ZXJQaGFzZT4oKSwgbnVsbCApOwotCi0gICAgICAgIHN1YmplY3QuY3JlYXRlQXJjaGl2ZXIoICJ0YXIiLCBmYWxzZSwgImZpbmFsTmFtZSIsIGNvbmZpZ1NvdXJjZSwgbnVsbCwgZmFsc2UgKTsKLQotICAgICAgICBhc3NlcnROdWxsKCB0dEFyY2hpdmVyLmNvbXByZXNzaW9uTWV0aG9kICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggVGFyTG9uZ0ZpbGVNb2RlLmZhaWwsIHR0QXJjaGl2ZXIubG9uZ0ZpbGVNb2RlICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQXJjaGl2ZXJfU2hvdWxkQ3JlYXRlV2FyQXJjaGl2ZXJXaXRoSWdub3JlV2VieG1sU2V0VG9GYWxzZSgpCi0gICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBUZXN0V2FyQXJjaGl2ZXIgdHdBcmNoaXZlciA9IG5ldyBUZXN0V2FyQXJjaGl2ZXIoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFzc2VtYmx5QXJjaGl2ZXIgbWFjQXJjaGl2ZXJNYW5hZ2VyID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQXNzZW1ibHlBcmNoaXZlciggbW0gKTsKLQotICAgICAgICBtYWNBcmNoaXZlck1hbmFnZXIuZXhwZWN0R2V0QXJjaGl2ZXIoICJ3YXIiLCB0d0FyY2hpdmVyICk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgPSBtbS5jcmVhdGVNb2NrKCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlLmNsYXNzICk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNEcnlSdW4oKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldEFyY2hpdmVyQ29uZmlnKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldE1hdmVuU2Vzc2lvbigpKS5hbmRSZXR1cm4oIG51bGwgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCkpLmFuZFJldHVybiggbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKSApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldEphckFyY2hpdmVDb25maWd1cmF0aW9uKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFdvcmtpbmdEaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCBuZXcgRmlsZSggIi4iICkgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc1VwZGF0ZU9ubHkoKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmlzSWdub3JlUGVybWlzc2lvbnMoKSkuYW5kUmV0dXJuKCB0cnVlICkuYW55VGltZXMoKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlciBzdWJqZWN0ID0KLSAgICAgICAgICAgIGNyZWF0ZVN1YmplY3QoIG1hY0FyY2hpdmVyTWFuYWdlciwgbmV3IEFycmF5TGlzdDxBc3NlbWJseUFyY2hpdmVyUGhhc2U+KCksIG51bGwgKTsKLQotICAgICAgICBzdWJqZWN0LmNyZWF0ZUFyY2hpdmVyKCAid2FyIiwgZmFsc2UsIG51bGwsIGNvbmZpZ1NvdXJjZSwgbnVsbCwgZmFsc2UgKTsKLQotICAgICAgICBhc3NlcnRGYWxzZSggdHdBcmNoaXZlci5pZ25vcmVXZWJ4bWwgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVBcmNoaXZlcl9TaG91bGRDcmVhdGVaaXBBcmNoaXZlcigpCi0gICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBaaXBBcmNoaXZlciBhcmNoaXZlciA9IG5ldyBaaXBBcmNoaXZlcigpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQXNzZW1ibHlBcmNoaXZlciBtYWNBcmNoaXZlck1hbmFnZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyKCBtbSApOwotCi0gICAgICAgIG1hY0FyY2hpdmVyTWFuYWdlci5leHBlY3RHZXRBcmNoaXZlciggInppcCIsIGFyY2hpdmVyICk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2UgPSBtbS5jcmVhdGVNb2NrKCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlLmNsYXNzICk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNEcnlSdW4oKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldEFyY2hpdmVyQ29uZmlnKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFdvcmtpbmdEaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCBuZXcgRmlsZSggIi4iICkgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc1VwZGF0ZU9ubHkoKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldEphckFyY2hpdmVDb25maWd1cmF0aW9uKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmlzSWdub3JlUGVybWlzc2lvbnMoKSkuYW5kUmV0dXJuKCB0cnVlICkuYW55VGltZXMoKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlciBzdWJqZWN0ID0KLSAgICAgICAgICAgIGNyZWF0ZVN1YmplY3QoIG1hY0FyY2hpdmVyTWFuYWdlciwgbmV3IEFycmF5TGlzdDxBc3NlbWJseUFyY2hpdmVyUGhhc2U+KCksIG51bGwgKTsKLQotICAgICAgICBzdWJqZWN0LmNyZWF0ZUFyY2hpdmVyKCAiemlwIiwgZmFsc2UsIG51bGwsIGNvbmZpZ1NvdXJjZSwgbnVsbCwgZmFsc2UgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVXYXJBcmNoaXZlcl9TaG91bGREaXNhYmxlSWdub3JlV2VieG1sT3B0aW9uKCkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgVGVzdFdhckFyY2hpdmVyIHR3QXJjaGl2ZXIgPSBuZXcgVGVzdFdhckFyY2hpdmVyKCk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyIG1hY0FyY2hpdmVyTWFuYWdlciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFzc2VtYmx5QXJjaGl2ZXIoIG1tICk7Ci0KLSAgICAgICAgbWFjQXJjaGl2ZXJNYW5hZ2VyLmV4cGVjdEdldEFyY2hpdmVyKCAid2FyIiwgdHdBcmNoaXZlciApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyIHN1YmplY3QgPQotICAgICAgICAgICAgY3JlYXRlU3ViamVjdCggbWFjQXJjaGl2ZXJNYW5hZ2VyLCBuZXcgQXJyYXlMaXN0PEFzc2VtYmx5QXJjaGl2ZXJQaGFzZT4oKSwgbnVsbCApOwotCi0gICAgICAgIHN1YmplY3QuY3JlYXRlV2FyQXJjaGl2ZXIoKTsKLQotICAgICAgICBhc3NlcnRGYWxzZSggdHdBcmNoaXZlci5pZ25vcmVXZWJ4bWwgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUYXJBcmNoaXZlcl9TaG91bGROb3RJbml0aWFsaXplQ29tcHJlc3Npb24oKQotICAgICAgICB0aHJvd3MgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24sIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgVGVzdFRhckFyY2hpdmVyIHR0QXJjaGl2ZXIgPSBuZXcgVGVzdFRhckFyY2hpdmVyKCk7Ci0KLSAgICAgICAgZmluYWwgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIgc3ViamVjdCA9IGNyZWF0ZVN1YmplY3QobW0sIHR0QXJjaGl2ZXIpOwotCi0gICAgICAgIHN1YmplY3QuY3JlYXRlVGFyQXJjaGl2ZXIoICJ0YXIiLCBUYXJMb25nRmlsZU1vZGUuZmFpbCApOwotCi0gICAgICAgIGFzc2VydE51bGwoIHR0QXJjaGl2ZXIuY29tcHJlc3Npb25NZXRob2QgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBUYXJMb25nRmlsZU1vZGUuZmFpbCwgdHRBcmNoaXZlci5sb25nRmlsZU1vZGUgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyIGNyZWF0ZVN1YmplY3QoRWFzeU1vY2tTdXBwb3J0IG1tLAotICAgICAgICAgICAgVGVzdFRhckFyY2hpdmVyIHR0QXJjaGl2ZXIpIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQXNzZW1ibHlBcmNoaXZlciBtYWNBcmNoaXZlck1hbmFnZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyKCBtbSApOwotCi0gICAgICAgIG1hY0FyY2hpdmVyTWFuYWdlci5leHBlY3RHZXRBcmNoaXZlciggInRhciIsIHR0QXJjaGl2ZXIgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICByZXR1cm4gY3JlYXRlU3ViamVjdCggbWFjQXJjaGl2ZXJNYW5hZ2VyLCBuZXcgQXJyYXlMaXN0PEFzc2VtYmx5QXJjaGl2ZXJQaGFzZT4oKSwgbnVsbCApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVRhckFyY2hpdmVyX1Rhckd6Rm9ybWF0X1Nob3VsZEluaXRpYWxpemVHWmlwQ29tcHJlc3Npb24oKQotICAgICAgICB0aHJvd3MgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24sIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgVGVzdFRhckFyY2hpdmVyIHR0QXJjaGl2ZXIgPSBuZXcgVGVzdFRhckFyY2hpdmVyKCk7Ci0KLSAgICAgICAgZmluYWwgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIgc3ViamVjdCA9IGNyZWF0ZVN1YmplY3QobW0sIHR0QXJjaGl2ZXIpOwotCi0gICAgICAgIHN1YmplY3QuY3JlYXRlVGFyQXJjaGl2ZXIoICJ0YXIuZ3oiLCBUYXJMb25nRmlsZU1vZGUuZmFpbCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggVGFyQXJjaGl2ZXIuVGFyQ29tcHJlc3Npb25NZXRob2QuZ3ppcCwgdHRBcmNoaXZlci5jb21wcmVzc2lvbk1ldGhvZCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIFRhckxvbmdGaWxlTW9kZS5mYWlsLCB0dEFyY2hpdmVyLmxvbmdGaWxlTW9kZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVRhckFyY2hpdmVyX1RnekZvcm1hdF9TaG91bGRJbml0aWFsaXplR1ppcENvbXByZXNzaW9uKCkKLSAgICAgICAgdGhyb3dzIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uLCBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIFRlc3RUYXJBcmNoaXZlciB0dEFyY2hpdmVyID0gbmV3IFRlc3RUYXJBcmNoaXZlcigpOwotCi0gICAgICAgIGZpbmFsIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyIHN1YmplY3QgPSBjcmVhdGVTdWJqZWN0KG1tLCB0dEFyY2hpdmVyKTsKLQotICAgICAgICBzdWJqZWN0LmNyZWF0ZVRhckFyY2hpdmVyKCAidGd6IiwgVGFyTG9uZ0ZpbGVNb2RlLmZhaWwgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIFRhckFyY2hpdmVyLlRhckNvbXByZXNzaW9uTWV0aG9kLmd6aXAsIHR0QXJjaGl2ZXIuY29tcHJlc3Npb25NZXRob2QgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBUYXJMb25nRmlsZU1vZGUuZmFpbCwgdHRBcmNoaXZlci5sb25nRmlsZU1vZGUgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUYXJBcmNoaXZlcl9UYXJCejJGb3JtYXRfU2hvdWxkSW5pdGlhbGl6ZUJaaXBDb21wcmVzc2lvbigpCi0gICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBUZXN0VGFyQXJjaGl2ZXIgdHRBcmNoaXZlciA9IG5ldyBUZXN0VGFyQXJjaGl2ZXIoKTsKLQotICAgICAgICBmaW5hbCBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlciBzdWJqZWN0ID0gY3JlYXRlU3ViamVjdChtbSwgdHRBcmNoaXZlcik7Ci0KLSAgICAgICAgc3ViamVjdC5jcmVhdGVUYXJBcmNoaXZlciggInRhci5iejIiLCBUYXJMb25nRmlsZU1vZGUuZmFpbCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggVGFyQXJjaGl2ZXIuVGFyQ29tcHJlc3Npb25NZXRob2QuYnppcDIsIHR0QXJjaGl2ZXIuY29tcHJlc3Npb25NZXRob2QgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBUYXJMb25nRmlsZU1vZGUuZmFpbCwgdHRBcmNoaXZlci5sb25nRmlsZU1vZGUgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVUYXJBcmNoaXZlcl9UYnoyRm9ybWF0X1Nob3VsZEluaXRpYWxpemVCWmlwQ29tcHJlc3Npb24oKQotICAgICAgICB0aHJvd3MgTm9TdWNoQXJjaGl2ZXJFeGNlcHRpb24sIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgVGVzdFRhckFyY2hpdmVyIHR0QXJjaGl2ZXIgPSBuZXcgVGVzdFRhckFyY2hpdmVyKCk7Ci0KLSAgICAgICAgZmluYWwgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIgc3ViamVjdCA9IGNyZWF0ZVN1YmplY3QobW0sIHR0QXJjaGl2ZXIpOwotCi0gICAgICAgIHN1YmplY3QuY3JlYXRlVGFyQXJjaGl2ZXIoICJ0YnoyIiwgVGFyTG9uZ0ZpbGVNb2RlLmZhaWwgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIFRhckFyY2hpdmVyLlRhckNvbXByZXNzaW9uTWV0aG9kLmJ6aXAyLCB0dEFyY2hpdmVyLmNvbXByZXNzaW9uTWV0aG9kICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggVGFyTG9uZ0ZpbGVNb2RlLmZhaWwsIHR0QXJjaGl2ZXIubG9uZ0ZpbGVNb2RlICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlVGFyQXJjaGl2ZXJfSW52YWxpZEZvcm1hdF9TaG91bGRGYWlsV2l0aEludmFsaWRDb21wcmVzc2lvbigpCi0gICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBUZXN0VGFyQXJjaGl2ZXIgdHRBcmNoaXZlciA9IG5ldyBUZXN0VGFyQXJjaGl2ZXIoKTsKLQotICAgICAgICBmaW5hbCBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlciBzdWJqZWN0ID0gY3JlYXRlU3ViamVjdChtbSwgdHRBcmNoaXZlcik7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHN1YmplY3QuY3JlYXRlVGFyQXJjaGl2ZXIoICJ0YXIuWiIsIG51bGwgKTsKLQotICAgICAgICAgICAgZmFpbCggIkludmFsaWQgY29tcHJlc3Npb24gZm9ybWF0cyBzaG91bGQgdGhyb3cgYW4gZXJyb3IuIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZC4KLSAgICAgICAgfQotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIgY3JlYXRlU3ViamVjdCggZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyIG1hY01nciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QXNzZW1ibHlBcmNoaXZlclBoYXNlPiBwaGFzZXMsIExvZ2dlciBsb2dnZXIgKQotICAgIHsKLSAgICAgICAgZmluYWwgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIgc3ViamVjdCA9Ci0gICAgICAgICAgICBuZXcgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXIoIG1hY01nci5hcmNoaXZlck1hbmFnZXIsIHBoYXNlcyApOwotCi0gICAgICAgIHN1YmplY3Quc2V0Q29udGFpbmVyKCBjb250YWluZXIgKTsKLQotICAgICAgICBpZiAoIGxvZ2dlciA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdWJqZWN0LmVuYWJsZUxvZ2dpbmcoIGxvZ2dlciApOwotCi0gICAgICAgIHJldHVybiBzdWJqZWN0OwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyCi0gICAgewotICAgICAgICBmaW5hbCBBcmNoaXZlck1hbmFnZXIgYXJjaGl2ZXJNYW5hZ2VyOwotCi0KLSAgICAgICAgQXJjaGl2ZXIgYXJjaGl2ZXI7Ci0KLSAgICAgICAgZmluYWwgRGVwZW5kZW5jeVJlc29sdmVyIGRlcGVuZGVuY3lSZXNvbHZlcjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbTsKLQotICAgICAgICBwdWJsaWMgTW9ja0FuZENvbnRyb2xGb3JBc3NlbWJseUFyY2hpdmVyKCBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLm1tID0gbW07Ci0gICAgICAgICAgICBhcmNoaXZlck1hbmFnZXIgPSBtbS5jcmVhdGVDb250cm9sKCkuY3JlYXRlTW9jayggIEFyY2hpdmVyTWFuYWdlci5jbGFzcyApOwotCi0gICAgICAgICAgICBkZXBlbmRlbmN5UmVzb2x2ZXIgPSBtbS5jcmVhdGVDb250cm9sKCkuY3JlYXRlTW9jayggRGVwZW5kZW5jeVJlc29sdmVyLmNsYXNzICk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXhwZWN0R2V0RGVzdEZpbGUoIGZpbmFsIEZpbGUgZmlsZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdChhcmNoaXZlci5nZXREZXN0RmlsZSgpKS5hbmRSZXR1cm4oIGZpbGUgKS5hbnlUaW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjcmVhdGVBcmNoaXZlciggZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFyY2hpdmVyPiBhcmNoaXZlckNsYXNzICkKLSAgICAgICAgewotICAgICAgICAgICAgYXJjaGl2ZXIgPSBtbS5jcmVhdGVDb250cm9sKCkuY3JlYXRlTW9jayhhcmNoaXZlckNsYXNzKTsKLQotICAgICAgICAgICAgYXJjaGl2ZXIuc2V0Rm9yY2VkKCBhbnlCb29sZWFuKCkgKTsKLSAgICAgICAgICAgIGV4cGVjdExhc3RDYWxsKCkuYW55VGltZXMoKTsKLQotICAgICAgICAgICAgYXJjaGl2ZXIuc2V0SWdub3JlUGVybWlzc2lvbnMoIGZhbHNlICk7Ci0gICAgICAgICAgICBleHBlY3RMYXN0Q2FsbCgpLmFueVRpbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGV4cGVjdEdldEFyY2hpdmVyKCBmaW5hbCBTdHJpbmcgZm9ybWF0LCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQXJjaGl2ZXI+IGFyY2hpdmVyQ2xhc3MgKQotICAgICAgICB7Ci0gICAgICAgICAgICBjcmVhdGVBcmNoaXZlciggYXJjaGl2ZXJDbGFzcyApOwotCi0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBlY3QoYXJjaGl2ZXJNYW5hZ2VyLmdldEFyY2hpdmVyKCBmb3JtYXQgKSkuYW5kUmV0dXJuKCBhcmNoaXZlciApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBmaW5hbCBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCggInNob3VsZCBuZXZlciBoYXBwZW4iICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXhwZWN0R2V0QXJjaGl2ZXIoIGZpbmFsIFN0cmluZyBmb3JtYXQsIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyICkKLSAgICAgICAgICAgIHRocm93cyBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoYXJjaGl2ZXJNYW5hZ2VyLmdldEFyY2hpdmVyKCBmb3JtYXQgKSkuYW5kUmV0dXJuKCBhcmNoaXZlciApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVGVzdFRhckFyY2hpdmVyCi0gICAgICAgIGV4dGVuZHMgVGFyQXJjaGl2ZXIKLSAgICB7Ci0KLSAgICAgICAgVGFyQ29tcHJlc3Npb25NZXRob2QgY29tcHJlc3Npb25NZXRob2Q7Ci0KLSAgICAgICAgVGFyTG9uZ0ZpbGVNb2RlIGxvbmdGaWxlTW9kZTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgZXhlY3V0ZSgpCi0gICAgICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN1cGVyLmNyZWF0ZUFyY2hpdmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb21wcmVzc2lvbiggZmluYWwgVGFyQ29tcHJlc3Npb25NZXRob2QgbW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbXByZXNzaW9uTWV0aG9kID0gbW9kZTsKLSAgICAgICAgICAgIHN1cGVyLnNldENvbXByZXNzaW9uKCBtb2RlICk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TG9uZ2ZpbGUoIGZpbmFsIFRhckxvbmdGaWxlTW9kZSBtb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgbG9uZ0ZpbGVNb2RlID0gbW9kZTsKLSAgICAgICAgICAgIHN1cGVyLnNldExvbmdmaWxlKCBtb2RlICk7Ci0gICAgICAgIH0KLQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRlc3RXYXJBcmNoaXZlcgotICAgICAgICBleHRlbmRzIFdhckFyY2hpdmVyCi0gICAgewotCi0gICAgICAgIGJvb2xlYW4gaWdub3JlV2VieG1sOwotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVXZWJ4bWwoIGZpbmFsIGJvb2xlYW4gaWdub3JlICkKLSAgICAgICAgewotICAgICAgICAgICAgaWdub3JlV2VieG1sID0gaWdub3JlOwotICAgICAgICAgICAgc3VwZXIuc2V0SWdub3JlV2VieG1sKCBpZ25vcmUgKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0QXJjaGl2ZXJXaXRoQ29uZmlnCi0gICAgICAgIGV4dGVuZHMgTm9PcEFyY2hpdmVyCi0gICAgewotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIHNpbXBsZUNvbmZpZzsKLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZUNvbmZpZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBzaW1wbGVDb25maWc7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHVwbGljYXRlQmVoYXZpb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQXJjaGl2ZXIuRFVQTElDQVRFU19BREQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL01hbmlmZXN0Q3JlYXRpb25GaW5hbGl6ZXJUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9NYW5pZmVzdENyZWF0aW9uRmluYWxpemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzNhN2U5Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL01hbmlmZXN0Q3JlYXRpb25GaW5hbGl6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJjaGl2ZXIuTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3R1dGlscy5UZXN0RmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVGaW5hbGl6ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuamFyLkphckFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC5JT1V0aWw7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrU3VwcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLm5ldC5KYXJVUkxDb25uZWN0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLXB1YmxpYyBjbGFzcyBNYW5pZmVzdENyZWF0aW9uRmluYWxpemVyVGVzdAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLQotICAgIHByaXZhdGUgZmluYWwgVGVzdEZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gbmV3IFRlc3RGaWxlTWFuYWdlciggIm1hbmlmZXN0LWZpbmFsaXplci50ZXN0LiIsICIuamFyIiApOwotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbGVNYW5hZ2VyLmNsZWFuVXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkRG9Ob3RoaW5nV2hlbkFyY2hpdmVDb25maWdJc051bGwoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG5ldyBNYW5pZmVzdENyZWF0aW9uRmluYWxpemVyKCBudWxsLCBudWxsLCBudWxsICkuZmluYWxpemVBcmNoaXZlQ3JlYXRpb24oIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkRG9Ob3RoaW5nV2hlbkFyY2hpdmVySXNOb3RKYXJBcmNoaXZlcigpCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIE1vY2tBbmRDb250cm9sRm9yQXJjaGl2ZXIgbWFjQXJjaGl2ZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBcmNoaXZlciggbW0gKTsKLQotICAgICAgICBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICk7Ci0gICAgICAgIE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24oKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBuZXcgTWFuaWZlc3RDcmVhdGlvbkZpbmFsaXplciggbnVsbCwgcHJvamVjdCwgY29uZmlnICkuZmluYWxpemVBcmNoaXZlQ3JlYXRpb24oIG1hY0FyY2hpdmVyLmFyY2hpdmVyICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEFkZE1hbmlmZXN0V2hlbkFyY2hpdmVySXNKYXJBcmNoaXZlcigpCi0gICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKTsKLSAgICAgICAgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBjb25maWcgPSBuZXcgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbigpOwotCi0gICAgICAgIEZpbGUgdGVtcERpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBGaWxlIG1hbmlmZXN0RmlsZSA9IGZpbGVNYW5hZ2VyLmNyZWF0ZUZpbGUoIHRlbXBEaXIsICJNQU5JRkVTVC5NRiIsICJNYWluLUNsYXNzOiBTdHVmZlxuIiApOwotCi0gICAgICAgIGNvbmZpZy5zZXRNYW5pZmVzdEZpbGUoIG1hbmlmZXN0RmlsZSApOwotCi0gICAgICAgIEphckFyY2hpdmVyIGFyY2hpdmVyID0gbmV3IEphckFyY2hpdmVyKCk7Ci0KLSAgICAgICAgYXJjaGl2ZXIuc2V0QXJjaGl2ZUZpbmFsaXplcnMoIENvbGxlY3Rpb25zLjxBcmNoaXZlRmluYWxpemVyPnNpbmdsZXRvbkxpc3QoIG5ldyBNYW5pZmVzdENyZWF0aW9uRmluYWxpemVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcgKSApICk7Ci0KLSAgICAgICAgRmlsZSBmaWxlID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcEZpbGUoKTsKLQotICAgICAgICBhcmNoaXZlci5zZXREZXN0RmlsZSggZmlsZSApOwotCi0gICAgICAgIGFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUoKTsKLQotICAgICAgICBVUkwgcmVzb3VyY2UgPSBuZXcgVVJMKCAiamFyOmZpbGU6IiArIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkgKyAiIS9NRVRBLUlORi9NQU5JRkVTVC5NRiIgKTsKLQotICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIoIG5ldyBJbnB1dFN0cmVhbVJlYWRlciggcmVzb3VyY2Uub3BlblN0cmVhbSgpICkgKTsKLQotICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotCi0gICAgICAgIElPVXRpbC5jb3B5KCByZWFkZXIsIHdyaXRlciApOwotCi0gICAgICAgIGFzc2VydFRydWUod3JpdGVyLnRvU3RyaW5nKCkuY29udGFpbnMoIk1haW4tQ2xhc3M6IFN0dWZmIikpOwotCi0gICAgICAgIC8vIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTQ4MjM2NzgKLSAgICAgICAgKCAoSmFyVVJMQ29ubmVjdGlvbikgcmVzb3VyY2Uub3BlbkNvbm5lY3Rpb24oKSApLmdldEphckZpbGUoKS5jbG9zZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRBZGRNYW5pZmVzdEVudHJpZXNXaGVuQXJjaGl2ZXJJc0phckFyY2hpdmVyKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCBuZXcgTW9kZWwoKSApOwotICAgICAgICBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uIGNvbmZpZyA9IG5ldyBNYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uKCk7Ci0KLSAgICAgICAgU3RyaW5nIHRlc3RLZXkgPSAiVGVzdC1LZXkiOwotICAgICAgICBTdHJpbmcgdGVzdFZhbHVlID0gInRlc3QtdmFsdWUiOwotCi0gICAgICAgIGNvbmZpZy5hZGRNYW5pZmVzdEVudHJ5KCB0ZXN0S2V5LCB0ZXN0VmFsdWUgKTsKLQotICAgICAgICBKYXJBcmNoaXZlciBhcmNoaXZlciA9IG5ldyBKYXJBcmNoaXZlcigpOwotCi0gICAgICAgIGFyY2hpdmVyLnNldEFyY2hpdmVGaW5hbGl6ZXJzKCBDb2xsZWN0aW9ucy48QXJjaGl2ZUZpbmFsaXplcj5zaW5nbGV0b25MaXN0KCBuZXcgTWFuaWZlc3RDcmVhdGlvbkZpbmFsaXplcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnICkgKSApOwotCi0gICAgICAgIEZpbGUgZmlsZSA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBGaWxlKCk7Ci0KLSAgICAgICAgYXJjaGl2ZXIuc2V0RGVzdEZpbGUoIGZpbGUgKTsKLQotICAgICAgICBhcmNoaXZlci5jcmVhdGVBcmNoaXZlKCk7Ci0KLSAgICAgICAgVVJMIHJlc291cmNlID0gbmV3IFVSTCggImphcjpmaWxlOiIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpICsgIiEvTUVUQS1JTkYvTUFOSUZFU1QuTUYiICk7Ci0KLSAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoIHJlc291cmNlLm9wZW5TdHJlYW0oKSApICk7Ci0KLSAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLQotICAgICAgICBJT1V0aWwuY29weSggcmVhZGVyLCB3cml0ZXIgKTsKLQotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oICJUZXN0IE1hbmlmZXN0OlxuXG4iICsgd3JpdGVyICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSh3cml0ZXIudG9TdHJpbmcoKS5jb250YWlucyh0ZXN0S2V5ICsgIjogIiArIHRlc3RWYWx1ZSkpOwotCi0gICAgICAgIC8vIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTQ4MjM2NzgKLSAgICAgICAgKCAoSmFyVVJMQ29ubmVjdGlvbikgcmVzb3VyY2Uub3BlbkNvbm5lY3Rpb24oKSApLmdldEphckZpbGUoKS5jbG9zZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTW9ja0FuZENvbnRyb2xGb3JBcmNoaXZlcgotICAgIHsKLSAgICAgICAgZmluYWwgQXJjaGl2ZXIgYXJjaGl2ZXI7Ci0KLQotICAgICAgICBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyKCBFYXN5TW9ja1N1cHBvcnQgbW0gKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGFyY2hpdmVyID0gbW0uY3JlYXRlTW9jayhBcmNoaXZlci5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL2FyY2hpdmVyL0Fzc2VtYmx5UHJveHlBcmNoaXZlclRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL2FyY2hpdmVyL0Fzc2VtYmx5UHJveHlBcmNoaXZlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZkMWJiNC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9hcmNoaXZlci9Bc3NlbWJseVByb3h5QXJjaGl2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTQgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLmFyY2hpdmVyOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5hbnlPYmplY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0dXRpbHMuVGVzdEZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmRpYWdzLlRyYWNraW5nQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5qYXIuSmFyQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci51dGlsLkRlZmF1bHRGaWxlU2V0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVJbmZvOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcG9uZW50cy5pby5maWxlc2VsZWN0b3JzLkZpbGVTZWxlY3RvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5jb25zb2xlLkNvbnNvbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrU3VwcG9ydDsKLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotaW1wb3J0IGphdmF4LmFubm90YXRpb24uTm9ubnVsbDsKLQotQFN1cHByZXNzV2FybmluZ3MoIlJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQiKQotcHVibGljIGNsYXNzIEFzc2VtYmx5UHJveHlBcmNoaXZlclRlc3QKLXsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9IG5ldyBUZXN0RmlsZU1hbmFnZXIoICJtYXNzZW1ibHktcHJveHlBcmNoaXZlciIsICIiICk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0KLSAgICBAQWZ0ZXJDbGFzcwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhbnVwRmlsZXMoKQotICAgIHsKLSAgICAgICAgZmlsZU1hbmFnZXIuY2xlYW5VcCgpOwotICAgIH0KLQotICAgIEBUZXN0KCB0aW1lb3V0ID0gNTAwMCApCi0gICAgcHVibGljIHZvaWQgYWRkRmlsZVNldF9Ta2lwV2hlblNvdXJjZUlzQXNzZW1ibHlXb3JrRGlyKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBzb3VyY2VzID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGZpbmFsIEZpbGUgd29ya2RpciA9IG5ldyBGaWxlKCBzb3VyY2VzLCAid29ya2RpciIgKTsKLQotICAgICAgICBmaW5hbCBUcmFja2luZ0FyY2hpdmVyIHRyYWNrZXIgPSBuZXcgVHJhY2tpbmdBcmNoaXZlcigpOwotICAgICAgICBmaW5hbCBBc3NlbWJseVByb3h5QXJjaGl2ZXIgYXJjaGl2ZXIgPQotICAgICAgICAgICAgbmV3IEFzc2VtYmx5UHJveHlBcmNoaXZlciggIiIsIHRyYWNrZXIsIG51bGwsIG51bGwsIG51bGwsIHdvcmtkaXIsIGxvZ2dlciApOwotCi0gICAgICAgIGFyY2hpdmVyLnNldEZvcmNlZCggdHJ1ZSApOwotCi0gICAgICAgIGZpbmFsIERlZmF1bHRGaWxlU2V0IGZzID0gbmV3IERlZmF1bHRGaWxlU2V0KCk7Ci0gICAgICAgIGZzLnNldERpcmVjdG9yeSggd29ya2RpciApOwotCi0gICAgICAgIGFyY2hpdmVyLmFkZEZpbGVTZXQoIGZzICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJhY2tlci5hZGRlZC5pc0VtcHR5KCkgKTsKLSAgICB9Ci0KLSAgICBAVGVzdCggdGltZW91dCA9IDUwMDAgKQotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVTZXRfYWRkRXhjbHVkZVdoZW5Tb3VyY2VDb250YWluc0Fzc2VtYmx5V29ya0RpcigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGUgc291cmNlcyA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIHdvcmtkaXIgPSBuZXcgRmlsZSggc291cmNlcywgIndvcmtkaXIiICk7Ci0gICAgICAgIHdvcmtkaXIubWtkaXIoKTsKLQotICAgICAgICBmaWxlTWFuYWdlci5jcmVhdGVGaWxlKCBzb3VyY2VzLCAidGVzdC1pbmNsdWRlZC50eHQiLCAiVGhpcyBpcyBpbmNsdWRlZCIgKTsKLSAgICAgICAgZmlsZU1hbmFnZXIuY3JlYXRlRmlsZSggd29ya2RpciwgInRlc3QtZXhjbHVkZWQudHh0IiwgIlRoaXMgaXMgZXhjbHVkZWQiICk7Ci0KLSAgICAgICAgZmluYWwgVHJhY2tpbmdBcmNoaXZlciB0cmFja2VyID0gbmV3IFRyYWNraW5nQXJjaGl2ZXIoKTsKLSAgICAgICAgZmluYWwgQXNzZW1ibHlQcm94eUFyY2hpdmVyIGFyY2hpdmVyID0KLSAgICAgICAgICAgIG5ldyBBc3NlbWJseVByb3h5QXJjaGl2ZXIoICIiLCB0cmFja2VyLCBudWxsLCBudWxsLCBudWxsLCB3b3JrZGlyLCBsb2dnZXIgKTsKLQotICAgICAgICBhcmNoaXZlci5zZXRGb3JjZWQoIHRydWUgKTsKLQotICAgICAgICBmaW5hbCBEZWZhdWx0RmlsZVNldCBmcyA9IG5ldyBEZWZhdWx0RmlsZVNldCgpOwotICAgICAgICBmcy5zZXREaXJlY3RvcnkoIHNvdXJjZXMgKTsKLQotICAgICAgICBhcmNoaXZlci5hZGRGaWxlU2V0KCBmcyApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggMSwgdHJhY2tlci5hZGRlZC5zaXplKCkgKTsKLQotICAgICAgICBmaW5hbCBUcmFja2luZ0FyY2hpdmVyLkFkZGl0aW9uIGFkZGl0aW9uID0gdHJhY2tlci5hZGRlZC5nZXQoIDAgKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggYWRkaXRpb24uZXhjbHVkZXMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBhZGRpdGlvbi5leGNsdWRlcy5sZW5ndGggKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCB3b3JrZGlyLmdldE5hbWUoKSwgYWRkaXRpb24uZXhjbHVkZXNbMF0gKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGFkZEZpbGVfTm9QZXJtc19DYWxsQWNjZXB0RmlsZXNPbmx5T25jZSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLSAgICAgICAgZmluYWwgQXJjaGl2ZXIgZGVsZWdhdGUgPSBtbS5jcmVhdGVNb2NrKEFyY2hpdmVyLmNsYXNzKTsKLQotICAgICAgICBkZWxlZ2F0ZS5hZGRGaWxlKCAoRmlsZSlhbnlPYmplY3QoKSwgKFN0cmluZylhbnlPYmplY3QoKSApOwotICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZGVsZWdhdGUuc2V0Rm9yY2VkKHRydWUpOwotICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZmluYWwgQ291bnRlclNlbGVjdG9yIGNvdW50ZXIgPSBuZXcgQ291bnRlclNlbGVjdG9yKCB0cnVlICk7Ci0gICAgICAgIGZpbmFsIExpc3Q8RmlsZVNlbGVjdG9yPiBzZWxlY3RvcnMgPSBuZXcgQXJyYXlMaXN0PEZpbGVTZWxlY3Rvcj4oKTsKLSAgICAgICAgc2VsZWN0b3JzLmFkZCggY291bnRlciApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5UHJveHlBcmNoaXZlciBhcmNoaXZlciA9Ci0gICAgICAgICAgICBuZXcgQXNzZW1ibHlQcm94eUFyY2hpdmVyKCAiIiwgZGVsZWdhdGUsIG51bGwsIHNlbGVjdG9ycywgbnVsbCwgbmV3IEZpbGUoICIuIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKTsKLQotICAgICAgICBhcmNoaXZlci5zZXRGb3JjZWQoIHRydWUgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGlucHV0RmlsZSA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBGaWxlKCk7Ci0KLSAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZSggaW5wdXRGaWxlLCAiZmlsZS50eHQiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBjb3VudGVyLmdldENvdW50KCkgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeV9Ob1Blcm1zX0NhbGxBY2NlcHRGaWxlc09ubHlPbmNlKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBcmNoaXZlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXJjaGl2ZXIgZGVsZWdhdGUgPSBuZXcgSmFyQXJjaGl2ZXIoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIG91dHB1dCA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBGaWxlKCk7Ci0KLSAgICAgICAgZGVsZWdhdGUuc2V0RGVzdEZpbGUoIG91dHB1dCApOwotCi0gICAgICAgIGZpbmFsIENvdW50ZXJTZWxlY3RvciBjb3VudGVyID0gbmV3IENvdW50ZXJTZWxlY3RvciggdHJ1ZSApOwotICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZWxlY3Rvcj4gc2VsZWN0b3JzID0gbmV3IEFycmF5TGlzdDxGaWxlU2VsZWN0b3I+KCk7Ci0gICAgICAgIHNlbGVjdG9ycy5hZGQoIGNvdW50ZXIgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseVByb3h5QXJjaGl2ZXIgYXJjaGl2ZXIgPQotICAgICAgICAgICAgbmV3IEFzc2VtYmx5UHJveHlBcmNoaXZlciggIiIsIGRlbGVnYXRlLCBudWxsLCBzZWxlY3RvcnMsIG51bGwsIG5ldyBGaWxlKCAiLiIgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICk7Ci0KLSAgICAgICAgYXJjaGl2ZXIuc2V0Rm9yY2VkKCB0cnVlICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0gICAgICAgIEZpbGVVdGlscy5jbGVhbkRpcmVjdG9yeSggZGlyICk7Ci0gICAgICAgIGZpbGVNYW5hZ2VyLmNyZWF0ZUZpbGUoIGRpciwgImZpbGUudHh0IiwgIlRoaXMgaXMgYSB0ZXN0LiIgKTsKLQotICAgICAgICBhcmNoaXZlci5hZGREaXJlY3RvcnkoIGRpciApOwotCi0gICAgICAgIGFyY2hpdmVyLmNyZWF0ZUFyY2hpdmUoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIGNvdW50ZXIuZ2V0Q291bnQoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvdW50ZXJTZWxlY3RvcgotICAgICAgICBpbXBsZW1lbnRzIEZpbGVTZWxlY3RvcgotICAgIHsKLQotICAgICAgICBwcml2YXRlIGludCBjb3VudCA9IDA7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFuc3dlciA9IGZhbHNlOwotCi0gICAgICAgIHB1YmxpYyBDb3VudGVyU2VsZWN0b3IoIGZpbmFsIGJvb2xlYW4gYW5zd2VyICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5hbnN3ZXIgPSBhbnN3ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCggZmluYWwgQE5vbm51bGwgRmlsZUluZm8gZmlsZUluZm8gKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggZmlsZUluZm8uaXNGaWxlKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiQ291bnRpbmcgZmlsZTogIiArIGZpbGVJbmZvLmdldE5hbWUoKSArICIuIEN1cnJlbnQgY291bnQ6ICIgKyBjb3VudCApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gYW5zd2VyOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0Fzc2VtYmx5QXJjaGl2ZXJQaGFzZUNvbXBhcmF0b3JUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9Bc3NlbWJseUFyY2hpdmVyUGhhc2VDb21wYXJhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDNhNDlhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0Fzc2VtYmx5QXJjaGl2ZXJQaGFzZUNvbXBhcmF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUucGhhc2U7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0Lio7Ci0KLXB1YmxpYyBjbGFzcyBBc3NlbWJseUFyY2hpdmVyUGhhc2VDb21wYXJhdG9yVGVzdAotewotCi0gICAgY2xhc3MgQmFzaWMgaW1wbGVtZW50cyAgQXNzZW1ibHlBcmNoaXZlclBoYXNlIHsKLSAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZSggQXNzZW1ibHkgYXNzZW1ibHksIEFyY2hpdmVyIGFyY2hpdmVyLCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZSApCi0gICAgICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotICAgICAgICAgICAgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICAgICAgewotCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjbGFzcyBPcmRlcmVkMSBleHRlbmRzIEJhc2ljIGltcGxlbWVudHMgUGhhc2VPcmRlcgotICAgIHsKLSAgICAgICAgcHVibGljIGludCBvcmRlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAyMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGNsYXNzIE9yZGVyZWQyIGV4dGVuZHMgQmFzaWMgaW1wbGVtZW50cyBQaGFzZU9yZGVyCi0gICAgewotICAgICAgICBwdWJsaWMgaW50IG9yZGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICB9Ci0gICAgfQotICAgIGNsYXNzIFVub3JkZXJlZDEgZXh0ZW5kcyBCYXNpYwotICAgIHsKLSAgICB9Ci0KLSAgICBjbGFzcyBVbm9yZGVyZWQyIGV4dGVuZHMgQmFzaWMKLSAgICB7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBjb21wYXJhdG9yU29ydHNDb3JyZWN0bHkoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBMaXN0PEFzc2VtYmx5QXJjaGl2ZXJQaGFzZT4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PEFzc2VtYmx5QXJjaGl2ZXJQaGFzZT4oICApOwotICAgICAgICBVbm9yZGVyZWQyIHUyID0gbmV3IFVub3JkZXJlZDIoKTsKLSAgICAgICAgaXRlbXMuYWRkKCB1MiApOwotICAgICAgICBPcmRlcmVkMiBvMiA9IG5ldyBPcmRlcmVkMigpOwotICAgICAgICBpdGVtcy5hZGQoIG8yICk7Ci0gICAgICAgIE9yZGVyZWQxIG8xID0gbmV3IE9yZGVyZWQxKCk7Ci0gICAgICAgIGl0ZW1zLmFkZCggbzEgKTsKLSAgICAgICAgVW5vcmRlcmVkMSB1MSA9IG5ldyBVbm9yZGVyZWQxKCk7Ci0gICAgICAgIGl0ZW1zLmFkZCggdTEgKTsKLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydCggaXRlbXMsIG5ldyBBc3NlbWJseUFyY2hpdmVyUGhhc2VDb21wYXJhdG9yKCkgKTsKLSAgICAgICAgYXNzZXJ0U2FtZSggdTEsIGl0ZW1zLmdldCggMCApICk7Ci0gICAgICAgIGFzc2VydFNhbWUoICB1MiwgaXRlbXMuZ2V0KDEpICk7Ci0gICAgICAgIGFzc2VydFNhbWUoICBvMSwgaXRlbXMuZ2V0KDIpICk7Ci0gICAgICAgIGFzc2VydFNhbWUoICBvMiwgaXRlbXMuZ2V0KDMpICk7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0RlcGVuZGVuY3lTZXRBc3NlbWJseVBoYXNlVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvRGVwZW5kZW5jeVNldEFzc2VtYmx5UGhhc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzMGVhNTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvRGVwZW5kZW5jeVNldEFzc2VtYmx5UGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHMuQXJ0aWZhY3RNb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHMuTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuQXNzZW1ibHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuRGVwZW5kZW5jeVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLmNvbnNvbGUuQ29uc29sZUxvZ2dlcjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1wdWJsaWMgY2xhc3MgRGVwZW5kZW5jeVNldEFzc2VtYmx5UGhhc2VUZXN0Ci0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVfU2hvdWxkQWRkT25lRGVwZW5kZW5jeUZyb21Qcm9qZWN0KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0TG9jYXRpb24gPSAiL291dCI7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBuZXdNYXZlblByb2plY3QoICJncm91cCIsICJwcm9qZWN0IiwgIjAiICk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RNb2NrIHByb2plY3RBcnRpZmFjdE1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtbSwgImdyb3VwIiwgInByb2plY3QiLCAiMCIsICJqYXIiLCBmYWxzZSApOwotCi0gICAgICAgIHByb2plY3Quc2V0QXJ0aWZhY3QoIHByb2plY3RBcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApOwotCi0gICAgICAgIGZpbmFsIERlcGVuZGVuY3lTZXQgZHMgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgICAgICBkcy5zZXRVc2VQcm9qZWN0QXJ0aWZhY3QoIGZhbHNlICk7Ci0gICAgICAgIGRzLnNldE91dHB1dERpcmVjdG9yeSggb3V0cHV0TG9jYXRpb24gKTsKLSAgICAgICAgZHMuc2V0T3V0cHV0RmlsZU5hbWVNYXBwaW5nKCAiJHthcnRpZmFjdC5hcnRpZmFjdElkfSIgKTsKLSAgICAgICAgZHMuc2V0VW5wYWNrKCBmYWxzZSApOwotICAgICAgICBkcy5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfQ09NUElMRSApOwotICAgICAgICBkcy5zZXRGaWxlTW9kZSggSW50ZWdlci50b1N0cmluZyggMTAsIDggKSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0KLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJ0ZXN0IiApOwotICAgICAgICBhc3NlbWJseS5zZXRJbmNsdWRlQmFzZURpcmVjdG9yeSggZmFsc2UgKTsKLSAgICAgICAgYXNzZW1ibHkuYWRkRGVwZW5kZW5jeVNldCggZHMgKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayBtYWNUYXNrID0KLSAgICAgICAgICAgIG5ldyBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayggbW0sIHByb2plY3QgKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgYXJ0aWZhY3RNb2NrID0gbmV3IEFydGlmYWN0TW9jayggbW0sICJncm91cCIsICJkZXAiLCAiMSIsICJqYXIiLCBmYWxzZSApOwotCi0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIk9uIHRlc3Qgc2V0dXAsIGhhc2hjb2RlIGZvciBkZXBlbmRlbmN5IGFydGlmYWN0OiAiICsgYXJ0aWZhY3RNb2NrLmdldEFydGlmYWN0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzaENvZGUoKSApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0Q1NHZXRSZXBvc2l0b3JpZXMoIG51bGwsIG51bGwgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldERlc3RGaWxlKCBuZXcgRmlsZSggImp1bmsiICkgKTsKLS8vICAgICAgICBtYWNUYXNrLmV4cGVjdEFkZEZpbGUoIGFydGlmYWN0RmlsZSwgIm91dC9kZXAiLCAxMCApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0U2Vzc2lvbiggbnVsbCApOwotCi0gICAgICAgIHByb2plY3Quc2V0QXJ0aWZhY3RzKCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICkgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdENTR2V0RmluYWxOYW1lKCAiZmluYWwtbmFtZSIgKTsKLQotICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IGRlcFByb2plY3QgPSBuZXdNYXZlblByb2plY3QoICJncm91cCIsICJkZXAiLCAiMSIgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEJ1aWxkRnJvbVJlcG9zaXRvcnkoIGRlcFByb2plY3QgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdFJlc29sdmVEZXBlbmRlbmN5U2V0cygpOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGNyZWF0ZVBoYXNlKCBtYWNUYXNrLCBsb2dnZXIsIG1hY1Rhc2suZGVwZW5kZW5jeVJlc29sdmVyICkuZXhlY3V0ZSggYXNzZW1ibHksIG1hY1Rhc2suYXJjaGl2ZXIsIG1hY1Rhc2suY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgbmV3TWF2ZW5Qcm9qZWN0KCBmaW5hbCBTdHJpbmcgZ3JvdXBJZCwgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoIGdyb3VwSWQgKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggYXJ0aWZhY3RJZCApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVfU2hvdWxkTm90QWRkRGVwZW5kZW5jaWVzV2hlblByb2plY3RIYXNOb25lKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIGFzc2VtYmx5LnNldElkKCAidGVzdCIgKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SW5jbHVkZUJhc2VEaXJlY3RvcnkoIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrIG1hY1Rhc2sgPQotICAgICAgICAgICAgbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBtbSwgbnVsbCApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0UmVzb2x2ZURlcGVuZGVuY3lTZXRzKCk7Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgY3JlYXRlUGhhc2UoIG1hY1Rhc2ssIGxvZ2dlciwgbWFjVGFzay5kZXBlbmRlbmN5UmVzb2x2ZXIgKS5leGVjdXRlKCBhc3NlbWJseSwgbnVsbCwgbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlcGVuZGVuY3lTZXRBc3NlbWJseVBoYXNlIGNyZWF0ZVBoYXNlKCBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayBtYWNUYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIsIERlcGVuZGVuY3lSZXNvbHZlciBkciApCi0gICAgewotICAgICAgICBNYXZlblByb2plY3RCdWlsZGVyIHByb2plY3RCdWlsZGVyID0gbnVsbDsKLQotICAgICAgICBpZiAoIG1hY1Rhc2sgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByb2plY3RCdWlsZGVyID0gbWFjVGFzay5wcm9qZWN0QnVpbGRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIERlcGVuZGVuY3lTZXRBc3NlbWJseVBoYXNlIHBoYXNlID0gbmV3IERlcGVuZGVuY3lTZXRBc3NlbWJseVBoYXNlKCBwcm9qZWN0QnVpbGRlciwgZHIsIGxvZ2dlciApOwotCi0gICAgICAgIHBoYXNlLmVuYWJsZUxvZ2dpbmcoIGxvZ2dlciApOwotCi0gICAgICAgIHJldHVybiBwaGFzZTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0ZpbGVJdGVtQXNzZW1ibHlQaGFzZVRlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0ZpbGVJdGVtQXNzZW1ibHlQaGFzZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlZjZmZi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9GaWxlSXRlbUFzc2VtYmx5UGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5GaWxlSXRlbTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0dXRpbHMuVGVzdEZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLlR5cGVDb252ZXJzaW9uVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC51dGlscy5PczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLnJlc291cmNlcy5QbGV4dXNJb1Jlc291cmNlOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5GaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5jb25zb2xlLkNvbnNvbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrU3VwcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5hbnlJbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5hbnlPYmplY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlSXRlbUFzc2VtYmx5UGhhc2VUZXN0Ci0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gICAgcHJpdmF0ZSBmaW5hbCBUZXN0RmlsZU1hbmFnZXIgZmlsZU1hbmFnZXIgPSBuZXcgVGVzdEZpbGVNYW5hZ2VyKCAiZmlsZS1pdGVtLXBoYXNlLnRlc3QuIiwgIiIgKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaWxlTWFuYWdlci5jbGVhblVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVfU2hvdWxkQWRkTm90aGluZ1doZW5Ob0ZpbGVJdGVtc0FyZVByZXNlbnQoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSBtYWNDUyA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSggbW0gKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgbWFjQ1MuZXhwZWN0R2V0QmFzZWRpciggYmFzZWRpciApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yTG9nZ2VyIG1hY0xvZ2dlciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckxvZ2dlciggbW0gKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseS5zZXRJZCggInRlc3QiICk7Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgY3JlYXRlUGhhc2UoIG1hY0xvZ2dlci5sb2dnZXIgKS5leGVjdXRlKCBhc3NlbWJseSwgbnVsbCwgbWFjQ1MuY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVfU2hvdWxkQWRkQWJzb2x1dGVGaWxlTm9GaWx0ZXJOb0xpbmVFbmRpbmdDb252ZXJzaW9uKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQ29uZmlnU291cmNlIG1hY0NTID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQ29uZmlnU291cmNlKCBtbSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBmaWxlTWFuYWdlci5jcmVhdGVGaWxlKCBiYXNlZGlyLCAiZmlsZS50eHQiLCAiVGhpcyBpcyBhIHRlc3QgZmlsZS4iICk7Ci0KLSAgICAgICAgbWFjQ1MuZXhwZWN0R2V0QmFzZWRpciggYmFzZWRpciApOwotCi0gICAgICAgIG1hY0NTLmV4cGVjdEdldFByb2plY3QoIG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICkgKTsKLQotICAgICAgICBtYWNDUy5leHBlY3RHZXRGaW5hbE5hbWUoICJmaW5hbC1uYW1lIiApOwotICAgICAgICBtYWNDUy5leHBlY3RJbnRlcnBvbGF0b3JzKCk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JMb2dnZXIgbWFjTG9nZ2VyID0gbmV3IE1vY2tBbmRDb250cm9sRm9yTG9nZ2VyKCBtbSApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQXJjaGl2ZXIgbWFjQXJjaGl2ZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBcmNoaXZlciggbW0gKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseS5zZXRJZCggInRlc3QiICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZUl0ZW0gZmkgPSBuZXcgRmlsZUl0ZW0oKTsKLSAgICAgICAgZmkuc2V0U291cmNlKCBmaWxlLmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgICAgIGZpLnNldEZpbHRlcmVkKCBmYWxzZSApOwotICAgICAgICBmaS5zZXRMaW5lRW5kaW5nKCAia2VlcCIgKTsKLSAgICAgICAgZmkuc2V0RmlsZU1vZGUoICI3NzciICk7Ci0KLSAgICAgICAgbWFjQXJjaGl2ZXIuZXhwZWN0QWRkRmlsZSggZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUudHh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApICk7Ci0KLSAgICAgICAgYXNzZW1ibHkuYWRkRmlsZSggZmkgKTsKLSAgICAgICAgCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGNyZWF0ZVBoYXNlKCBtYWNMb2dnZXIubG9nZ2VyICkuZXhlY3V0ZSggYXNzZW1ibHksIG1hY0FyY2hpdmVyLmFyY2hpdmVyLCBtYWNDUy5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZV9TaG91bGRBZGRSZWxhdGl2ZUZpbGVOb0ZpbHRlck5vTGluZUVuZGluZ0NvbnZlcnNpb24oKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JDb25maWdTb3VyY2UgbWFjQ1MgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JDb25maWdTb3VyY2UoIG1tICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IGZpbGVNYW5hZ2VyLmNyZWF0ZUZpbGUoIGJhc2VkaXIsICJmaWxlLnR4dCIsICJUaGlzIGlzIGEgdGVzdCBmaWxlLiIgKTsKLQotICAgICAgICBtYWNDUy5leHBlY3RHZXRCYXNlZGlyKCBiYXNlZGlyICk7Ci0KLSAgICAgICAgbWFjQ1MuZXhwZWN0R2V0UHJvamVjdCggbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKSApOwotCi0gICAgICAgIG1hY0NTLmV4cGVjdEdldEZpbmFsTmFtZSggImZpbmFsLW5hbWUiICk7Ci0gICAgICAgIG1hY0NTLmV4cGVjdEludGVycG9sYXRvcnMoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckxvZ2dlciBtYWNMb2dnZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JMb2dnZXIoIG1tICk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBcmNoaXZlciBtYWNBcmNoaXZlciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyKCBtbSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIGFzc2VtYmx5LnNldElkKCAidGVzdCIgKTsKLQotICAgICAgICBmaW5hbCBGaWxlSXRlbSBmaSA9IG5ldyBGaWxlSXRlbSgpOwotICAgICAgICBmaS5zZXRTb3VyY2UoICJmaWxlLnR4dCIgKTsKLSAgICAgICAgZmkuc2V0RmlsdGVyZWQoIGZhbHNlICk7Ci0gICAgICAgIGZpLnNldExpbmVFbmRpbmcoICJrZWVwIiApOwotICAgICAgICBmaS5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLQotICAgICAgICBtYWNBcmNoaXZlci5leHBlY3RBZGRGaWxlKCBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZS50eHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggIjc3NyIsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICkgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGRGaWxlKCBmaSApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGNyZWF0ZVBoYXNlKCBtYWNMb2dnZXIubG9nZ2VyICkuZXhlY3V0ZSggYXNzZW1ibHksIG1hY0FyY2hpdmVyLmFyY2hpdmVyLCBtYWNDUy5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZV9XaXRoT3V0cHV0RGlyZWN0b3J5KCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQ29uZmlnU291cmNlIG1hY0NTID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQ29uZmlnU291cmNlKCBtbSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIHJlYWRtZUZpbGUgPSBmaWxlTWFuYWdlci5jcmVhdGVGaWxlKCBiYXNlZGlyLCAiUkVBRE1FLnR4dCIsICJUaGlzIGlzIGEgdGVzdCBmaWxlIGZvciBSRUFETUUudHh0LiIgKTsKLSAgICAgICAgZmluYWwgRmlsZSBsaWNlbnNlRmlsZSA9Ci0gICAgICAgICAgICBmaWxlTWFuYWdlci5jcmVhdGVGaWxlKCBiYXNlZGlyLCAiTElDRU5TRS50eHQiLCAiVGhpcyBpcyBhIHRlc3QgZmlsZSBmb3IgTElDRU5TRS50eHQuIiApOwotICAgICAgICBmaW5hbCBGaWxlIGNvbmZpZ0ZpbGUgPQotICAgICAgICAgICAgZmlsZU1hbmFnZXIuY3JlYXRlRmlsZSggYmFzZWRpciwgImNvbmZpZy9jb25maWcudHh0IiwgIlRoaXMgaXMgYSB0ZXN0IGZpbGUgZm9yIGNvbmZpZy9jb25maWcudHh0IiApOwotCi0gICAgICAgIG1hY0NTLmV4cGVjdEdldEJhc2VkaXIoIGJhc2VkaXIgKTsKLQotICAgICAgICBtYWNDUy5leHBlY3RHZXRQcm9qZWN0KCBuZXcgTWF2ZW5Qcm9qZWN0KCBuZXcgTW9kZWwoKSApICk7Ci0KLSAgICAgICAgbWFjQ1MuZXhwZWN0R2V0RmluYWxOYW1lKCAiZmluYWwtbmFtZSIgKTsKLSAgICAgICAgbWFjQ1MuZXhwZWN0SW50ZXJwb2xhdG9ycygpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yTG9nZ2VyIG1hY0xvZ2dlciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckxvZ2dlciggbW0gKTsKLSAgICAgICAgaWYgKCBPcy5pc0ZhbWlseSggT3MuRkFNSUxZX1dJTkRPV1MgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1hY0xvZ2dlci5sb2dnZXIuZXJyb3IoICJPUz1XaW5kb3dzIGFuZCB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciBjb250YWlucyBhICpuaXgtc3BlY2lmaWMgIgotICAgICAgICAgICAgICAgICsgInJvb3QtcmVsYXRpdmUtcmVmZXJlbmNlIChzdGFydGluZyB3aXRoIHNsYXNoKSAvIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWFjTG9nZ2VyLmxvZ2dlci53YXJuKCAoU3RyaW5nKWFueU9iamVjdCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyIG1hY0FyY2hpdmVyID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQXJjaGl2ZXIoIG1tICk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJ0ZXN0IiApOwotICAgICAgICBhc3NlbWJseS5zZXRJbmNsdWRlQmFzZURpcmVjdG9yeSggdHJ1ZSApOwotCi0gICAgICAgIGZpbmFsIEZpbGVJdGVtIHJlYWRtZUZpbGVJdGVtID0gbmV3IEZpbGVJdGVtKCk7Ci0gICAgICAgIHJlYWRtZUZpbGVJdGVtLnNldFNvdXJjZSggIlJFQURNRS50eHQiICk7Ci0gICAgICAgIHJlYWRtZUZpbGVJdGVtLnNldE91dHB1dERpcmVjdG9yeSggIiIgKTsKLSAgICAgICAgcmVhZG1lRmlsZUl0ZW0uc2V0RmlsdGVyZWQoIGZhbHNlICk7Ci0gICAgICAgIHJlYWRtZUZpbGVJdGVtLnNldExpbmVFbmRpbmcoICJrZWVwIiApOwotICAgICAgICByZWFkbWVGaWxlSXRlbS5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLQotICAgICAgICBmaW5hbCBGaWxlSXRlbSBsaWNlbnNlRmlsZUl0ZW0gPSBuZXcgRmlsZUl0ZW0oKTsKLSAgICAgICAgbGljZW5zZUZpbGVJdGVtLnNldFNvdXJjZSggIkxJQ0VOU0UudHh0IiApOwotICAgICAgICBsaWNlbnNlRmlsZUl0ZW0uc2V0T3V0cHV0RGlyZWN0b3J5KCAiLyIgKTsKLSAgICAgICAgbGljZW5zZUZpbGVJdGVtLnNldEZpbHRlcmVkKCBmYWxzZSApOwotICAgICAgICBsaWNlbnNlRmlsZUl0ZW0uc2V0TGluZUVuZGluZyggImtlZXAiICk7Ci0gICAgICAgIGxpY2Vuc2VGaWxlSXRlbS5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLQotICAgICAgICBmaW5hbCBGaWxlSXRlbSBjb25maWdGaWxlSXRlbSA9IG5ldyBGaWxlSXRlbSgpOwotICAgICAgICBjb25maWdGaWxlSXRlbS5zZXRTb3VyY2UoICJjb25maWcvY29uZmlnLnR4dCIgKTsKLSAgICAgICAgY29uZmlnRmlsZUl0ZW0uc2V0T3V0cHV0RGlyZWN0b3J5KCAiY29uZmlnIiApOwotICAgICAgICBjb25maWdGaWxlSXRlbS5zZXRGaWx0ZXJlZCggZmFsc2UgKTsKLSAgICAgICAgY29uZmlnRmlsZUl0ZW0uc2V0TGluZUVuZGluZyggImtlZXAiICk7Ci0gICAgICAgIGNvbmZpZ0ZpbGVJdGVtLnNldEZpbGVNb2RlKCAiNzc3IiApOwotCi0gICAgICAgIG1hY0FyY2hpdmVyLmV4cGVjdEFkZEZpbGUoIHJlYWRtZUZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSRUFETUUudHh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApICk7Ci0gICAgICAgIG1hY0FyY2hpdmVyLmV4cGVjdEFkZEZpbGUoIGxpY2Vuc2VGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTElDRU5TRS50eHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggIjc3NyIsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICkgKTsKLSAgICAgICAgbWFjQXJjaGl2ZXIuZXhwZWN0QWRkRmlsZSggY29uZmlnRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy9jb25maWcudHh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApICk7Ci0KLSAgICAgICAgYXNzZW1ibHkuYWRkRmlsZSggcmVhZG1lRmlsZUl0ZW0gKTsKLSAgICAgICAgYXNzZW1ibHkuYWRkRmlsZSggbGljZW5zZUZpbGVJdGVtICk7Ci0gICAgICAgIGFzc2VtYmx5LmFkZEZpbGUoIGNvbmZpZ0ZpbGVJdGVtICk7Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgY3JlYXRlUGhhc2UoIG1hY0xvZ2dlci5sb2dnZXIgKS5leGVjdXRlKCBhc3NlbWJseSwgbWFjQXJjaGl2ZXIuYXJjaGl2ZXIsIG1hY0NTLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlX1dpdGhPdXRwdXREaXJlY3RvcnlBbmREZXN0TmFtZSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSBtYWNDUyA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSggbW0gKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSByZWFkbWVGaWxlID0gZmlsZU1hbmFnZXIuY3JlYXRlRmlsZSggYmFzZWRpciwgIlJFQURNRS50eHQiLCAiVGhpcyBpcyBhIHRlc3QgZmlsZSBmb3IgUkVBRE1FLnR4dC4iICk7Ci0gICAgICAgIGZpbmFsIEZpbGUgbGljZW5zZUZpbGUgPQotICAgICAgICAgICAgZmlsZU1hbmFnZXIuY3JlYXRlRmlsZSggYmFzZWRpciwgIkxJQ0VOU0UudHh0IiwgIlRoaXMgaXMgYSB0ZXN0IGZpbGUgZm9yIExJQ0VOU0UudHh0LiIgKTsKLSAgICAgICAgZmluYWwgRmlsZSBjb25maWdGaWxlID0KLSAgICAgICAgICAgIGZpbGVNYW5hZ2VyLmNyZWF0ZUZpbGUoIGJhc2VkaXIsICJjb25maWcvY29uZmlnLnR4dCIsICJUaGlzIGlzIGEgdGVzdCBmaWxlIGZvciBjb25maWcvY29uZmlnLnR4dCIgKTsKLQotICAgICAgICBtYWNDUy5leHBlY3RHZXRCYXNlZGlyKCBiYXNlZGlyICk7Ci0KLSAgICAgICAgbWFjQ1MuZXhwZWN0R2V0UHJvamVjdCggbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKSApOwotCi0gICAgICAgIG1hY0NTLmV4cGVjdEdldEZpbmFsTmFtZSggImZpbmFsLW5hbWUiICk7Ci0gICAgICAgIG1hY0NTLmV4cGVjdEludGVycG9sYXRvcnMoKTsKLQotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yTG9nZ2VyIG1hY0xvZ2dlciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckxvZ2dlciggbW0gKTsKLSAgICAgICAgaWYgKCBPcy5pc0ZhbWlseSggT3MuRkFNSUxZX1dJTkRPV1MgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1hY0xvZ2dlci5sb2dnZXIuZXJyb3IoICJPUz1XaW5kb3dzIGFuZCB0aGUgYXNzZW1ibHkgZGVzY3JpcHRvciBjb250YWlucyBhICpuaXgtc3BlY2lmaWMgIgotICAgICAgICAgICAgICAgICsgInJvb3QtcmVsYXRpdmUtcmVmZXJlbmNlIChzdGFydGluZyB3aXRoIHNsYXNoKSAvIiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgbWFjTG9nZ2VyLmxvZ2dlci53YXJuKCAoU3RyaW5nKWFueU9iamVjdCgpICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyIG1hY0FyY2hpdmVyID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQXJjaGl2ZXIoIG1tICk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJ0ZXN0IiApOwotICAgICAgICBhc3NlbWJseS5zZXRJbmNsdWRlQmFzZURpcmVjdG9yeSggdHJ1ZSApOwotCi0gICAgICAgIGZpbmFsIEZpbGVJdGVtIHJlYWRtZUZpbGVJdGVtID0gbmV3IEZpbGVJdGVtKCk7Ci0gICAgICAgIHJlYWRtZUZpbGVJdGVtLnNldFNvdXJjZSggIlJFQURNRS50eHQiICk7Ci0gICAgICAgIHJlYWRtZUZpbGVJdGVtLnNldE91dHB1dERpcmVjdG9yeSggIiIgKTsKLSAgICAgICAgcmVhZG1lRmlsZUl0ZW0uc2V0RGVzdE5hbWUoICJSRUFETUVfcmVuYW1lZC50eHQiICk7Ci0gICAgICAgIHJlYWRtZUZpbGVJdGVtLnNldEZpbHRlcmVkKCBmYWxzZSApOwotICAgICAgICByZWFkbWVGaWxlSXRlbS5zZXRMaW5lRW5kaW5nKCAia2VlcCIgKTsKLSAgICAgICAgcmVhZG1lRmlsZUl0ZW0uc2V0RmlsZU1vZGUoICI3NzciICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZUl0ZW0gbGljZW5zZUZpbGVJdGVtID0gbmV3IEZpbGVJdGVtKCk7Ci0gICAgICAgIGxpY2Vuc2VGaWxlSXRlbS5zZXRTb3VyY2UoICJMSUNFTlNFLnR4dCIgKTsKLSAgICAgICAgbGljZW5zZUZpbGVJdGVtLnNldE91dHB1dERpcmVjdG9yeSggIi8iICk7Ci0gICAgICAgIGxpY2Vuc2VGaWxlSXRlbS5zZXREZXN0TmFtZSggIkxJQ0VOU0VfcmVuYW1lZC50eHQiICk7Ci0gICAgICAgIGxpY2Vuc2VGaWxlSXRlbS5zZXRGaWx0ZXJlZCggZmFsc2UgKTsKLSAgICAgICAgbGljZW5zZUZpbGVJdGVtLnNldExpbmVFbmRpbmcoICJrZWVwIiApOwotICAgICAgICBsaWNlbnNlRmlsZUl0ZW0uc2V0RmlsZU1vZGUoICI3NzciICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZUl0ZW0gY29uZmlnRmlsZUl0ZW0gPSBuZXcgRmlsZUl0ZW0oKTsKLSAgICAgICAgY29uZmlnRmlsZUl0ZW0uc2V0U291cmNlKCAiY29uZmlnL2NvbmZpZy50eHQiICk7Ci0gICAgICAgIGNvbmZpZ0ZpbGVJdGVtLnNldERlc3ROYW1lKCAiY29uZmlnX3JlbmFtZWQudHh0IiApOwotICAgICAgICBjb25maWdGaWxlSXRlbS5zZXRPdXRwdXREaXJlY3RvcnkoICJjb25maWciICk7Ci0gICAgICAgIGNvbmZpZ0ZpbGVJdGVtLnNldEZpbHRlcmVkKCBmYWxzZSApOwotICAgICAgICBjb25maWdGaWxlSXRlbS5zZXRMaW5lRW5kaW5nKCAia2VlcCIgKTsKLSAgICAgICAgY29uZmlnRmlsZUl0ZW0uc2V0RmlsZU1vZGUoICI3NzciICk7Ci0KLSAgICAgICAgbWFjQXJjaGl2ZXIuZXhwZWN0QWRkRmlsZSggcmVhZG1lRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJFQURNRV9yZW5hbWVkLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCAiNzc3IiwgbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKSApOwotICAgICAgICBtYWNBcmNoaXZlci5leHBlY3RBZGRGaWxlKCBsaWNlbnNlRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkxJQ0VOU0VfcmVuYW1lZC50eHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggIjc3NyIsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICkgKTsKLSAgICAgICAgbWFjQXJjaGl2ZXIuZXhwZWN0QWRkRmlsZSggY29uZmlnRmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy9jb25maWdfcmVuYW1lZC50eHQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggIjc3NyIsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICkgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGRGaWxlKCByZWFkbWVGaWxlSXRlbSApOwotICAgICAgICBhc3NlbWJseS5hZGRGaWxlKCBsaWNlbnNlRmlsZUl0ZW0gKTsKLSAgICAgICAgYXNzZW1ibHkuYWRkRmlsZSggY29uZmlnRmlsZUl0ZW0gKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBjcmVhdGVQaGFzZSggbWFjTG9nZ2VyLmxvZ2dlciApLmV4ZWN1dGUoIGFzc2VtYmx5LCBtYWNBcmNoaXZlci5hcmNoaXZlciwgbWFjQ1MuY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVfV2l0aE91dHB1dERpcmVjdG9yeUFuZERlc3ROYW1lQW5kSW5jbHVkZUJhc2VEaXJlY3RvcnlGYWxzZSgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSBtYWNDUyA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSggbW0gKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSByZWFkbWVGaWxlID0gZmlsZU1hbmFnZXIuY3JlYXRlRmlsZSggYmFzZWRpciwgIlJFQURNRS50eHQiLCAiVGhpcyBpcyBhIHRlc3QgZmlsZSBmb3IgUkVBRE1FLnR4dC4iICk7Ci0gICAgICAgIGZpbmFsIEZpbGUgbGljZW5zZUZpbGUgPQotICAgICAgICAgICAgZmlsZU1hbmFnZXIuY3JlYXRlRmlsZSggYmFzZWRpciwgIkxJQ0VOU0UudHh0IiwgIlRoaXMgaXMgYSB0ZXN0IGZpbGUgZm9yIExJQ0VOU0UudHh0LiIgKTsKLSAgICAgICAgZmluYWwgRmlsZSBjb25maWdGaWxlID0KLSAgICAgICAgICAgIGZpbGVNYW5hZ2VyLmNyZWF0ZUZpbGUoIGJhc2VkaXIsICJjb25maWcvY29uZmlnLnR4dCIsICJUaGlzIGlzIGEgdGVzdCBmaWxlIGZvciBjb25maWcvY29uZmlnLnR4dCIgKTsKLQotICAgICAgICBtYWNDUy5leHBlY3RHZXRCYXNlZGlyKCBiYXNlZGlyICk7Ci0KLSAgICAgICAgbWFjQ1MuZXhwZWN0R2V0UHJvamVjdCggbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKSApOwotCi0gICAgICAgIG1hY0NTLmV4cGVjdEdldEZpbmFsTmFtZSggImZpbmFsLW5hbWUiICk7Ci0gICAgICAgIG1hY0NTLmV4cGVjdEludGVycG9sYXRvcnMoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckxvZ2dlciBtYWNMb2dnZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JMb2dnZXIoIG1tICk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBcmNoaXZlciBtYWNBcmNoaXZlciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyKCBtbSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIGFzc2VtYmx5LnNldElkKCAidGVzdCIgKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SW5jbHVkZUJhc2VEaXJlY3RvcnkoIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZUl0ZW0gcmVhZG1lRmlsZUl0ZW0gPSBuZXcgRmlsZUl0ZW0oKTsKLSAgICAgICAgcmVhZG1lRmlsZUl0ZW0uc2V0U291cmNlKCAiUkVBRE1FLnR4dCIgKTsKLSAgICAgICAgcmVhZG1lRmlsZUl0ZW0uc2V0RGVzdE5hbWUoICJSRUFETUVfcmVuYW1lZC50eHQiICk7Ci0gICAgICAgIHJlYWRtZUZpbGVJdGVtLnNldEZpbHRlcmVkKCBmYWxzZSApOwotICAgICAgICByZWFkbWVGaWxlSXRlbS5zZXRMaW5lRW5kaW5nKCAia2VlcCIgKTsKLSAgICAgICAgcmVhZG1lRmlsZUl0ZW0uc2V0RmlsZU1vZGUoICI3NzciICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZUl0ZW0gbGljZW5zZUZpbGVJdGVtID0gbmV3IEZpbGVJdGVtKCk7Ci0gICAgICAgIGxpY2Vuc2VGaWxlSXRlbS5zZXRTb3VyY2UoICJMSUNFTlNFLnR4dCIgKTsKLSAgICAgICAgbGljZW5zZUZpbGVJdGVtLnNldERlc3ROYW1lKCAiTElDRU5TRV9yZW5hbWVkLnR4dCIgKTsKLSAgICAgICAgbGljZW5zZUZpbGVJdGVtLnNldEZpbHRlcmVkKCBmYWxzZSApOwotICAgICAgICBsaWNlbnNlRmlsZUl0ZW0uc2V0TGluZUVuZGluZyggImtlZXAiICk7Ci0gICAgICAgIGxpY2Vuc2VGaWxlSXRlbS5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLQotICAgICAgICBmaW5hbCBGaWxlSXRlbSBjb25maWdGaWxlSXRlbSA9IG5ldyBGaWxlSXRlbSgpOwotICAgICAgICBjb25maWdGaWxlSXRlbS5zZXRTb3VyY2UoICJjb25maWcvY29uZmlnLnR4dCIgKTsKLSAgICAgICAgY29uZmlnRmlsZUl0ZW0uc2V0RGVzdE5hbWUoICJjb25maWdfcmVuYW1lZC50eHQiICk7Ci0gICAgICAgIGNvbmZpZ0ZpbGVJdGVtLnNldE91dHB1dERpcmVjdG9yeSggImNvbmZpZyIgKTsKLSAgICAgICAgY29uZmlnRmlsZUl0ZW0uc2V0RmlsdGVyZWQoIGZhbHNlICk7Ci0gICAgICAgIGNvbmZpZ0ZpbGVJdGVtLnNldExpbmVFbmRpbmcoICJrZWVwIiApOwotICAgICAgICBjb25maWdGaWxlSXRlbS5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLQotICAgICAgICBtYWNBcmNoaXZlci5leHBlY3RBZGRGaWxlKCByZWFkbWVGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUkVBRE1FX3JlbmFtZWQudHh0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApICk7Ci0gICAgICAgIG1hY0FyY2hpdmVyLmV4cGVjdEFkZEZpbGUoIGxpY2Vuc2VGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTElDRU5TRV9yZW5hbWVkLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCAiNzc3IiwgbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKSApOwotICAgICAgICBtYWNBcmNoaXZlci5leHBlY3RBZGRGaWxlKCBjb25maWdGaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlnL2NvbmZpZ19yZW5hbWVkLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCAiNzc3IiwgbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKSApOwotCi0gICAgICAgIGFzc2VtYmx5LmFkZEZpbGUoIHJlYWRtZUZpbGVJdGVtICk7Ci0gICAgICAgIGFzc2VtYmx5LmFkZEZpbGUoIGxpY2Vuc2VGaWxlSXRlbSApOwotICAgICAgICBhc3NlbWJseS5hZGRGaWxlKCBjb25maWdGaWxlSXRlbSApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGNyZWF0ZVBoYXNlKCBtYWNMb2dnZXIubG9nZ2VyICkuZXhlY3V0ZSggYXNzZW1ibHksIG1hY0FyY2hpdmVyLmFyY2hpdmVyLCBtYWNDUy5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpbGVJdGVtQXNzZW1ibHlQaGFzZSBjcmVhdGVQaGFzZSggZmluYWwgTG9nZ2VyIGxvZ2dlciApCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlSXRlbUFzc2VtYmx5UGhhc2UgcGhhc2UgPSBuZXcgRmlsZUl0ZW1Bc3NlbWJseVBoYXNlKCk7Ci0gICAgICAgIHBoYXNlLmVuYWJsZUxvZ2dpbmcoIGxvZ2dlciApOwotCi0gICAgICAgIHJldHVybiBwaGFzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1vY2tBbmRDb250cm9sRm9yQXJjaGl2ZXIKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyOwotCi0gICAgICAgIHB1YmxpYyBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyKCBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlciA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2soQXJjaGl2ZXIuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXhwZWN0QWRkRmlsZSggZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBTdHJpbmcgb3V0cHV0TG9jYXRpb24sIGZpbmFsIGludCBmaWxlTW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyLmFkZFJlc291cmNlKCAoIFBsZXh1c0lvUmVzb3VyY2UpIGFueU9iamVjdCgpLCAoU3RyaW5nKSBhbnlPYmplY3QoKSwgYW55SW50KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZXJFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoICJTaG91bGQgbmV2ZXIgaGFwcGVuLiIgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTW9ja0FuZENvbnRyb2xGb3JDb25maWdTb3VyY2UKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlOwotCi0gICAgICAgIHB1YmxpYyBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSggZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1vY2tNYW5hZ2VyICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBjb25maWdTb3VyY2UgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MpOwotCi0gICAgICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldE1hdmVuU2Vzc2lvbigpKS5hbmRSZXR1cm4oIG51bGwgKS5hbnlUaW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXhwZWN0R2V0UHJvamVjdCggZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldFByb2plY3QoKSkuYW5kUmV0dXJuKCBwcm9qZWN0ICkuYXRMZWFzdE9uY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4cGVjdEdldEZpbmFsTmFtZSggZmluYWwgU3RyaW5nIGZpbmFsTmFtZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldEZpbmFsTmFtZSgpKS5hbmRSZXR1cm4oIGZpbmFsTmFtZSApLmF0TGVhc3RPbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBleHBlY3RJbnRlcnBvbGF0b3JzKCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0Q29tbWFuZExpbmVQcm9wc0ludGVycG9sYXRvcigpKS5hbmRSZXR1cm4oIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmVtcHR5KCkgKS5hbnlUaW1lcygpOwotICAgICAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRFbnZJbnRlcnBvbGF0b3IoKSkuYW5kUmV0dXJuKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5lbXB0eSgpICkuYW55VGltZXMoKTsKLSAgICAgICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0TWFpblByb2plY3RJbnRlcnBvbGF0b3IoKSkuYW5kUmV0dXJuKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5lbXB0eSgpICkuYW55VGltZXMoKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgcHVibGljIHZvaWQgZXhwZWN0R2V0VGVtcG9yYXJ5Um9vdERpcmVjdG9yeSggZmluYWwgRmlsZSB0ZW1wUm9vdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFRlbXBvcmFyeVJvb3REaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCB0ZW1wUm9vdCApLmF0TGVhc3RPbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBleHBlY3RHZXRCYXNlZGlyKCBmaW5hbCBGaWxlIGJhc2VkaXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggYmFzZWRpciApLmF0TGVhc3RPbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBleHBlY3RHZXRFbmNvZGluZyggKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRFbmNvZGluZygpKS5hbmRSZXR1cm4oICJVVEYtOCIpLmF0TGVhc3RPbmNlKCk7Ci0gICAgICAgIH0KLX0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTW9ja0FuZENvbnRyb2xGb3JMb2dnZXIKLSAgICB7Ci0gICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXI7Ci0KLSAgICAgICAgcHVibGljIE1vY2tBbmRDb250cm9sRm9yTG9nZ2VyKCBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIgKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIGxvZ2dlciA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2sgKExvZ2dlci5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL0ZpbGVTZXRBc3NlbWJseVBoYXNlVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvRmlsZVNldEFzc2VtYmx5UGhhc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0M2VlNzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvRmlsZVNldEFzc2VtYmx5UGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzUgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHMuTW9ja0FuZENvbnRyb2xGb3JBZGRGaWxlU2V0c1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5GaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3R1dGlscy5UZXN0RmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5hbnlPYmplY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci0KLXB1YmxpYyBjbGFzcyBGaWxlU2V0QXNzZW1ibHlQaGFzZVRlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFRlc3RGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9IG5ldyBUZXN0RmlsZU1hbmFnZXIoICJmaWxlLXNldC1hc3NlbWJseS50ZXN0LiIsICIiICk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmlsZU1hbmFnZXIuY2xlYW5VcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGROb3RGYWlsV2hlbk5vRmlsZVNldHNTcGVjaWZpZWQoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0KLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJ0ZXN0IiApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yTG9nZ2VyIG1hY0xvZ2dlciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckxvZ2dlcigpOwotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZEZpbGVTZXRzVGFzayBtYWNUYXNrID0KLSAgICAgICAgICAgIG5ldyBNb2NrQW5kQ29udHJvbEZvckFkZEZpbGVTZXRzVGFzayggbW0sIGZpbGVNYW5hZ2VyICk7Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgY3JlYXRlUGhhc2UoIG1hY0xvZ2dlciApLmV4ZWN1dGUoIGFzc2VtYmx5LCBtYWNUYXNrLmFyY2hpdmVyLCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRBZGRPbmVGaWxlU2V0KCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIGFzc2VtYmx5LnNldElkKCAidGVzdCIgKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SW5jbHVkZUJhc2VEaXJlY3RvcnkoIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgIGZzLnNldE91dHB1dERpcmVjdG9yeSggIi9vdXQiICk7Ci0gICAgICAgIGZzLnNldERpcmVjdG9yeSggIi9pbnB1dCIgKTsKLSAgICAgICAgZnMuc2V0RmlsZU1vZGUoICI3NzciICk7Ci0gICAgICAgIGZzLnNldERpcmVjdG9yeU1vZGUoICI3NzciICk7Ci0KLSAgICAgICAgYXNzZW1ibHkuYWRkRmlsZVNldCggZnMgKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckxvZ2dlciBtYWNMb2dnZXIgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JMb2dnZXIoKTsKLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBZGRGaWxlU2V0c1Rhc2sgbWFjVGFzayA9Ci0gICAgICAgICAgICBuZXcgTW9ja0FuZENvbnRyb2xGb3JBZGRGaWxlU2V0c1Rhc2soIG1tLCBmaWxlTWFuYWdlciApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0QXJjaGl2ZUJhc2VEaXJlY3RvcnkoKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICk7Ci0KLSAgICAgICAgbWFjTG9nZ2VyLmV4cGVjdEVycm9yKCB0cnVlLCB0cnVlICk7Ci0KLSAgICAgICAgZmluYWwgaW50IGRpck1vZGUgPSBJbnRlZ2VyLnBhcnNlSW50KCAiNzc3IiwgOCApOwotICAgICAgICBmaW5hbCBpbnQgZmlsZU1vZGUgPSBJbnRlZ2VyLnBhcnNlSW50KCAiNzc3IiwgOCApOwotCi0gICAgICAgIGZpbmFsIGludFtdIG1vZGVzID0geyAtMSwgLTEsIGRpck1vZGUsIGZpbGVNb2RlIH07Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RBZGRpdGlvbk9mU2luZ2xlRmlsZVNldCggcHJvamVjdCwgImZpbmFsLW5hbWUiLCBmYWxzZSwgbW9kZXMsIDEsIHRydWUgKTsKLQotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCAgbWFjVGFzay5jb25maWdTb3VyY2UgICk7Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgY3JlYXRlUGhhc2UoIG1hY0xvZ2dlciApLmV4ZWN1dGUoIGFzc2VtYmx5LCBtYWNUYXNrLmFyY2hpdmVyLCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZVNldEFzc2VtYmx5UGhhc2UgY3JlYXRlUGhhc2UoIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yTG9nZ2VyIG1hY0xvZ2dlciApCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlU2V0QXNzZW1ibHlQaGFzZSBwaGFzZSA9IG5ldyBGaWxlU2V0QXNzZW1ibHlQaGFzZSgpOwotCi0gICAgICAgIHBoYXNlLmVuYWJsZUxvZ2dpbmcoIG1hY0xvZ2dlci5sb2dnZXIgKTsKLQotICAgICAgICByZXR1cm4gcGhhc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNb2NrQW5kQ29udHJvbEZvckxvZ2dlcgotICAgIHsKLSAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlcjsKLQotICAgICAgICBNb2NrQW5kQ29udHJvbEZvckxvZ2dlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxvZ2dlciA9IG1tLmNyZWF0ZU1vY2soTG9nZ2VyLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4cGVjdERlYnVnKCBmaW5hbCBib29sZWFuIGRlYnVnQ2hlY2ssIGZpbmFsIGJvb2xlYW4gZGVidWdFbmFibGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkZWJ1Z0NoZWNrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBlY3QoIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKS5hbmRSZXR1cm4oIGRlYnVnRW5hYmxlZCApLmFueVRpbWVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggKFN0cmluZykgYW55T2JqZWN0KCkgKTsKLSAgICAgICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYW55VGltZXMoKTsKLSAgICAgICAgfQotICAgICAgICBwdWJsaWMgdm9pZCBleHBlY3RXYXJuKCBmaW5hbCBib29sZWFuIGRlYnVnQ2hlY2ssIGZpbmFsIGJvb2xlYW4gZGVidWdFbmFibGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkZWJ1Z0NoZWNrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBlY3QoIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKS5hbmRSZXR1cm4oIGRlYnVnRW5hYmxlZCApLmFueVRpbWVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggKFN0cmluZykgYW55T2JqZWN0KCkgKTsKLSAgICAgICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYW55VGltZXMoKTsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCAoU3RyaW5nKSBhbnlPYmplY3QoKSApOwotICAgICAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hbnlUaW1lcygpOwotICAgICAgICB9Ci0gICAgICAgIHB1YmxpYyB2b2lkIGV4cGVjdEVycm9yKCBmaW5hbCBib29sZWFuIGRlYnVnQ2hlY2ssIGZpbmFsIGJvb2xlYW4gZGVidWdFbmFibGVkICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkZWJ1Z0NoZWNrICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBleHBlY3QoIGxvZ2dlci5pc0RlYnVnRW5hYmxlZCgpKS5hbmRSZXR1cm4oIGRlYnVnRW5hYmxlZCApLmFueVRpbWVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyggKFN0cmluZykgYW55T2JqZWN0KCkgKTsKLSAgICAgICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYW55VGltZXMoKTsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuKCAoU3RyaW5nKSBhbnlPYmplY3QoKSApOwotICAgICAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hbnlUaW1lcygpOwotICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCAoU3RyaW5nKSBhbnlPYmplY3QoKSApOwotICAgICAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hbnlUaW1lcygpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL01vZHVsZVNldEFzc2VtYmx5UGhhc2VUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS9waGFzZS9Nb2R1bGVTZXRBc3NlbWJseVBoYXNlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMzNDk4Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL01vZHVsZVNldEFzc2VtYmx5UGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OTYgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkRlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnRhc2sudGVzdHV0aWxzLkFydGlmYWN0TW9jazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnRhc2sudGVzdHV0aWxzLk1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHMuTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrLnRlc3R1dGlscy5Nb2NrQW5kQ29udHJvbEZvckFkZEZpbGVTZXRzVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5GaWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLk1vZHVsZUJpbmFyaWVzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLk1vZHVsZVNldDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Nb2R1bGVTb3VyY2VzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3R1dGlscy5UZXN0RmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuVHlwZUNvbnZlcnNpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3RCdWlsZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLmNvbnNvbGUuQ29uc29sZUxvZ2dlcjsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrU3VwcG9ydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbjsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncyggIk9jdGFsSW50ZWdlciIgKQotcHVibGljIGNsYXNzIE1vZHVsZVNldEFzc2VtYmx5UGhhc2VUZXN0Ci0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gICAgcHJpdmF0ZSBmaW5hbCBUZXN0RmlsZU1hbmFnZXIgZmlsZU1hbmFnZXIgPSBuZXcgVGVzdEZpbGVNYW5hZ2VyKCAibW9kdWxlLXNldC1waGFzZS50ZXN0LiIsICIiICk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0lORk8sICJ0ZXN0IiApOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbGVNYW5hZ2VyLmNsZWFuVXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNEZXByZWNhdGVkTW9kdWxlU291cmNlc0NvbmZpZ1ByZXNlbnRfU2hvdWxkQ2F0Y2hPdXRwdXREaXIoKQotICAgIHsKLSAgICAgICAgZmluYWwgTW9kdWxlU291cmNlcyBzb3VyY2VzID0gbmV3IE1vZHVsZVNvdXJjZXMoKTsKLSAgICAgICAgc291cmNlcy5zZXRPdXRwdXREaXJlY3RvcnkoICJvdXRkaXIiICk7Ci0KLSAgICAgICAgZmluYWwgTW9kdWxlU2V0QXNzZW1ibHlQaGFzZSBwaGFzZSA9IGNyZWF0ZVBoYXNlKCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSwgbnVsbCApOwotCi0gICAgICAgIGFzc2VydFRydWUoIHBoYXNlLmlzRGVwcmVjYXRlZE1vZHVsZVNvdXJjZXNDb25maWdQcmVzZW50KCBzb3VyY2VzICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNEZXByZWNhdGVkTW9kdWxlU291cmNlc0NvbmZpZ1ByZXNlbnRfU2hvdWxkQ2F0Y2hJbmNsdWRlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZHVsZVNvdXJjZXMgc291cmNlcyA9IG5ldyBNb2R1bGVTb3VyY2VzKCk7Ci0gICAgICAgIHNvdXJjZXMuYWRkSW5jbHVkZSggIioqL2luY2x1ZGVkLnR4dCIgKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXRBc3NlbWJseVBoYXNlIHBoYXNlID0gY3JlYXRlUGhhc2UoIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApLCBudWxsICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggcGhhc2UuaXNEZXByZWNhdGVkTW9kdWxlU291cmNlc0NvbmZpZ1ByZXNlbnQoIHNvdXJjZXMgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RJc0RlcHJlY2F0ZWRNb2R1bGVTb3VyY2VzQ29uZmlnUHJlc2VudF9TaG91bGRDYXRjaEV4Y2x1ZGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgTW9kdWxlU291cmNlcyBzb3VyY2VzID0gbmV3IE1vZHVsZVNvdXJjZXMoKTsKLSAgICAgICAgc291cmNlcy5hZGRFeGNsdWRlKCAiKiovZXhjbHVkZWQudHh0IiApOwotCi0gICAgICAgIGZpbmFsIE1vZHVsZVNldEFzc2VtYmx5UGhhc2UgcGhhc2UgPSBjcmVhdGVQaGFzZSggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICksIG51bGwgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBwaGFzZS5pc0RlcHJlY2F0ZWRNb2R1bGVTb3VyY2VzQ29uZmlnUHJlc2VudCggc291cmNlcyApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdElzRGVwcmVjYXRlZE1vZHVsZVNvdXJjZXNDb25maWdQcmVzZW50X1Nob3VsZE5vdENhdGNoRmlsZU1vZGUoKQotICAgIHsKLSAgICAgICAgZmluYWwgTW9kdWxlU291cmNlcyBzb3VyY2VzID0gbmV3IE1vZHVsZVNvdXJjZXMoKTsKLSAgICAgICAgc291cmNlcy5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXRBc3NlbWJseVBoYXNlIHBoYXNlID0gY3JlYXRlUGhhc2UoIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApLCBudWxsICk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIHBoYXNlLmlzRGVwcmVjYXRlZE1vZHVsZVNvdXJjZXNDb25maWdQcmVzZW50KCBzb3VyY2VzICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SXNEZXByZWNhdGVkTW9kdWxlU291cmNlc0NvbmZpZ1ByZXNlbnRfU2hvdWxkTm90Q2F0Y2hEaXJNb2RlKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZHVsZVNvdXJjZXMgc291cmNlcyA9IG5ldyBNb2R1bGVTb3VyY2VzKCk7Ci0gICAgICAgIHNvdXJjZXMuc2V0RGlyZWN0b3J5TW9kZSggIjc3NyIgKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXRBc3NlbWJseVBoYXNlIHBoYXNlID0gY3JlYXRlUGhhc2UoIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApLCBudWxsICk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIHBoYXNlLmlzRGVwcmVjYXRlZE1vZHVsZVNvdXJjZXNDb25maWdQcmVzZW50KCBzb3VyY2VzICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlRmlsZVNldF9TaG91bGRVc2VNb2R1bGVEaXJPbmx5V2hlbk91dERpcklzTnVsbCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QiICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCBtb2RlbCApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrIG1hY1Rhc2sgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2soIG1tLCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRGaW5hbE5hbWUoIG51bGwgKTsKLQotICAgICAgICBmaW5hbCBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTb3VyY2VzIHNvdXJjZXMgPSBuZXcgTW9kdWxlU291cmNlcygpOwotICAgICAgICBzb3VyY2VzLnNldEluY2x1ZGVNb2R1bGVEaXJlY3RvcnkoIHRydWUgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IGFydGlmYWN0UHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICk7Ci0KLSAgICAgICAgYXJ0aWZhY3RQcm9qZWN0LnNldEZpbGUoIG5ldyBGaWxlKCBiYXNlZGlyLCAicG9tLnhtbCIgKSApOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhcnRpZmFjdE1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtbSwgImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCAiamFyIiwgZmFsc2UgKTsKLQotICAgICAgICBhcnRpZmFjdFByb2plY3Quc2V0QXJ0aWZhY3QoIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBGaWxlU2V0IHJlc3VsdCA9Ci0gICAgICAgICAgICBjcmVhdGVQaGFzZSggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICksIG51bGwgKS5jcmVhdGVGaWxlU2V0KCBmcywgc291cmNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0UHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY1Rhc2suY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYXJ0aWZhY3QvIiwgcmVzdWx0LmdldE91dHB1dERpcmVjdG9yeSgpICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUZpbGVTZXRfU2hvdWxkUHJlcGVuZE1vZHVsZURpcldoZW5PdXREaXJJc1Byb3ZpZGVkKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEFydGlmYWN0SWQoICJhcnRpZmFjdCIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2sgbWFjVGFzayA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzayggbW0sIHByb2plY3QgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldEZpbmFsTmFtZSggbnVsbCApOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICBmcy5zZXRPdXRwdXREaXJlY3RvcnkoICJvdXQiICk7Ci0KLSAgICAgICAgZmluYWwgTW9kdWxlU291cmNlcyBzb3VyY2VzID0gbmV3IE1vZHVsZVNvdXJjZXMoKTsKLSAgICAgICAgc291cmNlcy5zZXRJbmNsdWRlTW9kdWxlRGlyZWN0b3J5KCB0cnVlICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IGFydGlmYWN0UHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGFydGlmYWN0UHJvamVjdC5zZXRGaWxlKCBuZXcgRmlsZSggYmFzZWRpciwgInBvbS54bWwiICkgKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgYXJ0aWZhY3RNb2NrID0gbmV3IEFydGlmYWN0TW9jayggbW0sICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgImphciIsIGZhbHNlICk7Ci0KLSAgICAgICAgYXJ0aWZhY3RQcm9qZWN0LnNldEFydGlmYWN0KCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApOwotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgcmVzdWx0ID0KLSAgICAgICAgICAgIGNyZWF0ZVBoYXNlKCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSwgbnVsbCApLmNyZWF0ZUZpbGVTZXQoIGZzLCBzb3VyY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJhcnRpZmFjdC9vdXQvIiwgcmVzdWx0LmdldE91dHB1dERpcmVjdG9yeSgpICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUZpbGVTZXRfU2hvdWxkQWRkRXhjbHVkZXNGb3JTdWJNb2R1bGVzV2hlbkV4Y2x1ZGVTdWJNb2REaXJzSXNUcnVlKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrIG1hY1Rhc2sgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2soIG1tLCBudWxsICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRGaW5hbE5hbWUoIG51bGwgKTsKLQotICAgICAgICBmaW5hbCBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTb3VyY2VzIHNvdXJjZXMgPSBuZXcgTW9kdWxlU291cmNlcygpOwotICAgICAgICBzb3VyY2VzLnNldEV4Y2x1ZGVTdWJNb2R1bGVEaXJlY3RvcmllcyggdHJ1ZSApOwotCi0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEFydGlmYWN0SWQoICJhcnRpZmFjdCIgKTsKLQotICAgICAgICBtb2RlbC5hZGRNb2R1bGUoICJzdWJtb2R1bGUiICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCBtb2RlbCApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBwcm9qZWN0LnNldEZpbGUoIG5ldyBGaWxlKCBiYXNlZGlyLCAicG9tLnhtbCIgKSApOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhcnRpZmFjdE1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtbSwgImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCAiamFyIiwgZmFsc2UgKTsKLQotICAgICAgICBwcm9qZWN0LnNldEFydGlmYWN0KCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApOwotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgcmVzdWx0ID0KLSAgICAgICAgICAgIGNyZWF0ZVBoYXNlKCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSwgbnVsbCApLmNyZWF0ZUZpbGVTZXQoIGZzLCBzb3VyY2VzLCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIHJlc3VsdC5nZXRFeGNsdWRlcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNpemUoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJzdWJtb2R1bGUvKioiLCByZXN1bHQuZ2V0RXhjbHVkZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCAwICkgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXhlY3V0ZV9TaG91bGRTa2lwSWZOb01vZHVsZVNldHNGb3VuZCgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseS5zZXRJbmNsdWRlQmFzZURpcmVjdG9yeSggZmFsc2UgKTsKLQotICAgICAgICBjcmVhdGVQaGFzZSggbnVsbCwgbnVsbCApLmV4ZWN1dGUoIGFzc2VtYmx5LCBudWxsLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVfU2hvdWxkQWRkT25lTW9kdWxlU2V0V2l0aE9uZU1vZHVsZUluSXQoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgbnVsbCApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrIG1hY1Rhc2sgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2soIG1tLCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZSA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJtb2R1bGUiLCAidmVyc2lvbiIsIHByb2plY3QgKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgbW9kdWxlQXJ0aWZhY3RNb2NrID0gbmV3IEFydGlmYWN0TW9jayggbW0sICJncm91cCIsICJtb2R1bGUiLCAidmVyc2lvbiIsICJqYXIiLCBmYWxzZSApOwotICAgICAgICBmaW5hbCBGaWxlIG1vZHVsZUFydGlmYWN0RmlsZSA9IG1vZHVsZUFydGlmYWN0TW9jay5zZXROZXdGaWxlKCk7Ci0gICAgICAgIG1vZHVsZS5zZXRBcnRpZmFjdCggbW9kdWxlQXJ0aWZhY3RNb2NrLmdldEFydGlmYWN0KCkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PE1hdmVuUHJvamVjdD4oKTsKLQotICAgICAgICBwcm9qZWN0cy5hZGQoIG1vZHVsZSApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0UmVhY3RvclByb2plY3RzKCBwcm9qZWN0cyApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldEZpbmFsTmFtZSggImZpbmFsLW5hbWUiICk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0RGVzdEZpbGUoIG5ldyBGaWxlKCAianVuayIgKSApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldE1vZGUoIDA3NzcsIDA3NzcgKTsKLQotCi0gICAgICAgIGZpbmFsIGludCBtb2RlID0gVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0QWRkRmlsZSggbW9kdWxlQXJ0aWZhY3RGaWxlLCAib3V0L2FydGlmYWN0IiwgbW9kZSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIGFzc2VtYmx5LnNldEluY2x1ZGVCYXNlRGlyZWN0b3J5KCBmYWxzZSApOwotCi0gICAgICAgIGZpbmFsIE1vZHVsZVNldCBtcyA9IG5ldyBNb2R1bGVTZXQoKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVCaW5hcmllcyBiaW4gPSBuZXcgTW9kdWxlQmluYXJpZXMoKTsKLQotICAgICAgICBiaW4uc2V0T3V0cHV0RmlsZU5hbWVNYXBwaW5nKCAiYXJ0aWZhY3QiICk7Ci0gICAgICAgIGJpbi5zZXRPdXRwdXREaXJlY3RvcnkoICJvdXQiICk7Ci0gICAgICAgIGJpbi5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLSAgICAgICAgYmluLnNldFVucGFjayggZmFsc2UgKTsKLSAgICAgICAgYmluLnNldEluY2x1ZGVEZXBlbmRlbmNpZXMoIGZhbHNlICk7Ci0KLSAgICAgICAgbXMuc2V0QmluYXJpZXMoIGJpbiApOwotCi0gICAgICAgIGFzc2VtYmx5LmFkZE1vZHVsZVNldCggbXMgKTsKLQotICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RSZXNvbHZlRGVwZW5kZW5jeVNldHMoKTsKLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXRBc3NlbWJseVBoYXNlIHBoYXNlID0gY3JlYXRlUGhhc2UoIGxvZ2dlciwgbWFjVGFzay5kZXBlbmRlbmN5UmVzb2x2ZXIsIG51bGwpOwotICAgICAgICBwaGFzZS5leGVjdXRlKCBhc3NlbWJseSwgbWFjVGFzay5hcmNoaXZlciwgbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTW9kdWxlQmluYXJpZXNfU2hvdWxkUmV0dXJuSW1tZWRpYXRlbHlXaGVuQmluYXJpZXNJc051bGwoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLAotICAgICAgICBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgY3JlYXRlUGhhc2UoIG51bGwsIG51bGwgKS5hZGRNb2R1bGVCaW5hcmllcyggbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRNb2R1bGVCaW5hcmllc19TaG91bGRGaWx0ZXJQb21Nb2R1bGUoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzayBtYWNUYXNrID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrKCBtbSApOwotCi0gICAgICAgIGZpbmFsIE1vZHVsZUJpbmFyaWVzIGJpbmFyaWVzID0gbmV3IE1vZHVsZUJpbmFyaWVzKCk7Ci0KLSAgICAgICAgYmluYXJpZXMuc2V0VW5wYWNrKCBmYWxzZSApOwotICAgICAgICBiaW5hcmllcy5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLSAgICAgICAgYmluYXJpZXMuc2V0T3V0cHV0RGlyZWN0b3J5KCAib3V0IiApOwotICAgICAgICBiaW5hcmllcy5zZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoICJhcnRpZmFjdCIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgbnVsbCApOwotICAgICAgICBwcm9qZWN0LnNldFBhY2thZ2luZyggInBvbSIgKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgYXJ0aWZhY3RNb2NrID0gbmV3IEFydGlmYWN0TW9jayggbW0sICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgInBvbSIsIGZhbHNlICk7Ci0gICAgICAgIHByb2plY3Quc2V0QXJ0aWZhY3QoIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMgPSBzaW5nbGV0b24oIHByb2plY3QgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBjcmVhdGVQaGFzZSggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICksIG51bGwgKS5hZGRNb2R1bGVCaW5hcmllcyggbnVsbCwgbnVsbCwgYmluYXJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY1Rhc2suYXJjaGl2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRNb2R1bGVCaW5hcmllc19TaG91bGRBZGRPbmVNb2R1bGVBdHRhY2htZW50QXJ0aWZhY3RBbmROb0RlcHMoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzayBtYWNUYXNrID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrKCBtbSwgbnVsbCApOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhcnRpZmFjdE1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtbSwgImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCAiamFyIiwgInRlc3QiLCBmYWxzZSApOwotICAgICAgICBmaW5hbCBGaWxlIGFydGlmYWN0RmlsZSA9IGFydGlmYWN0TW9jay5zZXROZXdGaWxlKCk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRGaW5hbE5hbWUoICJmaW5hbC1uYW1lIiApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldERlc3RGaWxlKCBuZXcgRmlsZSggImp1bmsiICkgKTsKLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRNb2RlKCAwMjIyLCAwMjIyICk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0QWRkRmlsZSggYXJ0aWZhY3RGaWxlLCAib3V0L2FydGlmYWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggIjc3NyIsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICkgKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVCaW5hcmllcyBiaW5hcmllcyA9IG5ldyBNb2R1bGVCaW5hcmllcygpOwotCi0gICAgICAgIGJpbmFyaWVzLnNldEluY2x1ZGVEZXBlbmRlbmNpZXMoIGZhbHNlICk7Ci0gICAgICAgIGJpbmFyaWVzLnNldFVucGFjayggZmFsc2UgKTsKLSAgICAgICAgYmluYXJpZXMuc2V0RmlsZU1vZGUoICI3NzciICk7Ci0gICAgICAgIGJpbmFyaWVzLnNldE91dHB1dERpcmVjdG9yeSggIm91dCIgKTsKLSAgICAgICAgYmluYXJpZXMuc2V0T3V0cHV0RmlsZU5hbWVNYXBwaW5nKCAiYXJ0aWZhY3QiICk7Ci0gICAgICAgIGJpbmFyaWVzLnNldEF0dGFjaG1lbnRDbGFzc2lmaWVyKCAidGVzdCIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgbnVsbCApOwotICAgICAgICBwcm9qZWN0LmFkZEF0dGFjaGVkQXJ0aWZhY3QoIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMgPSBzaW5nbGV0b24oIHByb2plY3QgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdFJlc29sdmVEZXBlbmRlbmN5U2V0cygpOwotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKTsKLQotICAgICAgICBjcmVhdGVQaGFzZSggbG9nZ2VyLCBtYWNUYXNrLmRlcGVuZGVuY3lSZXNvbHZlciwgbnVsbCApLmFkZE1vZHVsZUJpbmFyaWVzKCBudWxsLCBudWxsLCBiaW5hcmllcywgcHJvamVjdHMsIG1hY1Rhc2suYXJjaGl2ZXIsIG1hY1Rhc2suY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE1vZHVsZUJpbmFyaWVzX1Nob3VsZEZhaWxXaGVuT25lTW9kdWxlRG9lc250SGF2ZUF0dGFjaG1lbnRXaXRoTWF0Y2hpbmdDbGFzc2lmaWVyKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzayBtYWNUYXNrID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrKCBtbSApOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhcnRpZmFjdE1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtbSwgImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCAiamFyIiwgInRlc3QiLCBmYWxzZSApOwotICAgICAgICBhcnRpZmFjdE1vY2suc2V0TmV3RmlsZSgpOwotCi0gICAgICAgIGZpbmFsIE1vZHVsZUJpbmFyaWVzIGJpbmFyaWVzID0gbmV3IE1vZHVsZUJpbmFyaWVzKCk7Ci0KLSAgICAgICAgYmluYXJpZXMuc2V0VW5wYWNrKCBmYWxzZSApOwotICAgICAgICBiaW5hcmllcy5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLSAgICAgICAgYmluYXJpZXMuc2V0T3V0cHV0RGlyZWN0b3J5KCAib3V0IiApOwotICAgICAgICBiaW5hcmllcy5zZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoICJhcnRpZmFjdCIgKTsKLSAgICAgICAgYmluYXJpZXMuc2V0QXR0YWNobWVudENsYXNzaWZpZXIoICJ0ZXN0IiApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCBudWxsICk7Ci0gICAgICAgIHByb2plY3Quc2V0QXJ0aWZhY3QoIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMgPSBzaW5nbGV0b24oIHByb2plY3QgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNyZWF0ZVBoYXNlKCBsb2dnZXIsIG51bGwgKS5hZGRNb2R1bGVCaW5hcmllcyggbnVsbCwgbnVsbCwgYmluYXJpZXMsIHByb2plY3RzLCBtYWNUYXNrLmFyY2hpdmVyLCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgICAgICBmYWlsKCAiU2hvdWxkIHRocm93IGFuIGludmFsaWQgY29uZmlndXJhdGlvbiBleGNlcHRpb24gYmVjYXVzZSBvZiBtb2R1bGUgd2l0aCBtaXNzaW5nIGF0dGFjaG1lbnQuIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIHNob3VsZCB0aHJvdyB0aGlzIGJlY2F1c2Ugb2YgbWlzc2luZyBhdHRhY2htZW50LgotICAgICAgICB9Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE1vZHVsZUJpbmFyaWVzX1Nob3VsZEFkZE9uZU1vZHVsZUFydGlmYWN0QW5kTm9EZXBzKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2sgbWFjVGFzayA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzayggbW0gKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgYXJ0aWZhY3RNb2NrID0gbmV3IEFydGlmYWN0TW9jayggbW0sICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgImphciIsIGZhbHNlICk7Ci0gICAgICAgIGZpbmFsIEZpbGUgYXJ0aWZhY3RGaWxlID0gYXJ0aWZhY3RNb2NrLnNldE5ld0ZpbGUoKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldEZpbmFsTmFtZSggImZpbmFsLW5hbWUiICk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0RGVzdEZpbGUoIG5ldyBGaWxlKCAianVuayIgKSApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEFkZEZpbGUoIGFydGlmYWN0RmlsZSwgIm91dC9hcnRpZmFjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApICk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0TW9kZSggMDIyMiwgMDIyMiApOwotCi0gICAgICAgIGZpbmFsIE1vZHVsZUJpbmFyaWVzIGJpbmFyaWVzID0gbmV3IE1vZHVsZUJpbmFyaWVzKCk7Ci0KLSAgICAgICAgYmluYXJpZXMuc2V0SW5jbHVkZURlcGVuZGVuY2llcyggZmFsc2UgKTsKLSAgICAgICAgYmluYXJpZXMuc2V0VW5wYWNrKCBmYWxzZSApOwotICAgICAgICBiaW5hcmllcy5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLSAgICAgICAgYmluYXJpZXMuc2V0T3V0cHV0RGlyZWN0b3J5KCAib3V0IiApOwotICAgICAgICBiaW5hcmllcy5zZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoICJhcnRpZmFjdCIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgbnVsbCApOwotICAgICAgICBwcm9qZWN0LnNldEFydGlmYWN0KCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApOwotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IHByb2plY3RzID0gc2luZ2xldG9uKCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RSZXNvbHZlRGVwZW5kZW5jeVNldHMoKTsKLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0KLSAgICAgICAgY3JlYXRlUGhhc2UoIGxvZ2dlciwgbWFjVGFzay5kZXBlbmRlbmN5UmVzb2x2ZXIsIG51bGwgKS5hZGRNb2R1bGVCaW5hcmllcyggbnVsbCwgbnVsbCwgYmluYXJpZXMsIHByb2plY3RzLCBtYWNUYXNrLmFyY2hpdmVyLCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE1vZHVsZUFydGlmYWN0X1Nob3VsZFRocm93RXhjZXB0aW9uV2hlbkFydGlmYWN0RmlsZUlzTnVsbCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RNb2NrIGFydGlmYWN0TW9jayA9IG5ldyBBcnRpZmFjdE1vY2soIG1tLCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAidmVyc2lvbiIsICJ0eXBlIiwgZmFsc2UgKTsKLSAgICAgICAgYXJ0aWZhY3RNb2NrLnNldE51bGxGaWxlKCk7Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNyZWF0ZVBoYXNlKCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSwgbnVsbCApLmFkZE1vZHVsZUFydGlmYWN0KCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgKTsKLQotICAgICAgICAgICAgZmFpbCggIkV4cGVjdGVkIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiBzaW5jZSBhcnRpZmFjdCBmaWxlIGlzIG51bGwuIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleHBlY3RlZAotICAgICAgICB9Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZE1vZHVsZUFydGlmYWN0X1Nob3VsZEFkZE9uZUFydGlmYWN0KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrIG1hY1Rhc2sgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2soIG1tICk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RNb2NrIGFydGlmYWN0TW9jayA9IG5ldyBBcnRpZmFjdE1vY2soIG1tLCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAidmVyc2lvbiIsICJ0eXBlIiwgZmFsc2UgKTsKLSAgICAgICAgZmluYWwgRmlsZSBhcnRpZmFjdEZpbGUgPSBhcnRpZmFjdE1vY2suc2V0TmV3RmlsZSgpOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCBudWxsICk7Ci0gICAgICAgIHByb2plY3Quc2V0QXJ0aWZhY3QoIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRGaW5hbE5hbWUoICJmaW5hbC1uYW1lIiApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldERlc3RGaWxlKCBuZXcgRmlsZSggImp1bmsiICkgKTsKLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRNb2RlKCAwMjIyLCAwMjIyICk7Ci0KLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEFkZEZpbGUoIGFydGlmYWN0RmlsZSwgIm91dC9hcnRpZmFjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApICk7Ci0KLSAgICAgICAgZmluYWwgTW9kdWxlQmluYXJpZXMgYmluYXJpZXMgPSBuZXcgTW9kdWxlQmluYXJpZXMoKTsKLSAgICAgICAgYmluYXJpZXMuc2V0T3V0cHV0RGlyZWN0b3J5KCAib3V0IiApOwotICAgICAgICBiaW5hcmllcy5zZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoICJhcnRpZmFjdCIgKTsKLSAgICAgICAgYmluYXJpZXMuc2V0VW5wYWNrKCBmYWxzZSApOwotICAgICAgICBiaW5hcmllcy5zZXRGaWxlTW9kZSggIjc3NyIgKTsKLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBjcmVhdGVQaGFzZSggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICksIG51bGwgKS5hZGRNb2R1bGVBcnRpZmFjdCggYXJ0aWZhY3RNb2NrLmdldEFydGlmYWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjVGFzay5hcmNoaXZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY1Rhc2suY29uZmlnU291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmluYXJpZXMgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTW9kdWxlU291cmNlRmlsZVNldHNfU2hvdWxkUmV0dXJuSW1tZWRpYXRlbHlJZlNvdXJjZXNJc051bGwoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBjcmVhdGVQaGFzZSggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICksIG51bGwgKS5hZGRNb2R1bGVTb3VyY2VGaWxlU2V0cyggbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTW9kdWxlU291cmNlRmlsZVNldHNfU2hvdWxkQWRkT25lU291cmNlRGlyZWN0b3J5KCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBZGRGaWxlU2V0c1Rhc2sgbWFjVGFzayA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFkZEZpbGVTZXRzVGFzayggbW0sIGZpbGVNYW5hZ2VyICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAidmVyc2lvbiIsIG51bGwgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldFByb2plY3QoIHByb2plY3QgKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgYXJ0aWZhY3RNb2NrID0gbmV3IEFydGlmYWN0TW9jayggbW0sICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgImphciIsIGZhbHNlICk7Ci0KLSAgICAgICAgcHJvamVjdC5zZXRBcnRpZmFjdCggYXJ0aWZhY3RNb2NrLmdldEFydGlmYWN0KCkgKTsKLQotICAgICAgICBmaW5hbCBTZXQ8TWF2ZW5Qcm9qZWN0PiBwcm9qZWN0cyA9IHNpbmdsZXRvbiggcHJvamVjdCApOwotCi0gICAgICAgIGZpbmFsIE1vZHVsZVNvdXJjZXMgc291cmNlcyA9IG5ldyBNb2R1bGVTb3VyY2VzKCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgIGZzLnNldERpcmVjdG9yeSggIi9zcmMiICk7Ci0gICAgICAgIGZzLnNldERpcmVjdG9yeU1vZGUoICI3NzciICk7Ci0gICAgICAgIGZzLnNldEZpbGVNb2RlKCAiNzc3IiApOwotCi0gICAgICAgIHNvdXJjZXMuYWRkRmlsZVNldCggZnMgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldEFyY2hpdmVCYXNlRGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgZmluYWwgaW50IG1vZGUgPSBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggIjc3NyIsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICk7Ci0gICAgICAgIGZpbmFsIGludFtdIG1vZGVzID0geyAtMSwgLTEsIG1vZGUsIG1vZGUgfTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEFkZGl0aW9uT2ZTaW5nbGVGaWxlU2V0KCBwcm9qZWN0LCAiZmluYWwtbmFtZSIsIGZhbHNlLCBtb2RlcywgMSwgdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgKTsKLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0KLSAgICAgICAgY3JlYXRlUGhhc2UoIGxvZ2dlciwgbnVsbCApLmFkZE1vZHVsZVNvdXJjZUZpbGVTZXRzKCBzb3VyY2VzLCBwcm9qZWN0cywgbWFjVGFzay5hcmNoaXZlciwgbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlUHJvamVjdHNfU2hvdWxkUmV0dXJuTm90aGluZ1doZW5SZWFjdG9yQ29udGFpbnNPbmx5Q3VycmVudFByb2plY3QoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAidmVyc2lvbiIsIG51bGwgKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayBtYWNUYXNrID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBtbSwgcHJvamVjdCApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiBwcm9qZWN0cyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIHByb2plY3QgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldFJlYWN0b3JQcm9qZWN0cyggcHJvamVjdHMgKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXQgbW9kdWxlU2V0ID0gbmV3IE1vZHVsZVNldCgpOwotICAgICAgICBtb2R1bGVTZXQuc2V0SW5jbHVkZVN1Yk1vZHVsZXMoIHRydWUgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBTZXQ8TWF2ZW5Qcm9qZWN0PiBtb2R1bGVQcm9qZWN0cyA9Ci0gICAgICAgICAgICBNb2R1bGVTZXRBc3NlbWJseVBoYXNlLmdldE1vZHVsZVByb2plY3RzKCBtb2R1bGVTZXQsIG1hY1Rhc2suY29uZmlnU291cmNlLCBsb2dnZXIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBtb2R1bGVQcm9qZWN0cy5pc0VtcHR5KCkgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlUHJvamVjdHNfU2hvdWxkUmV0dXJuTm90aGluZ1doZW5SZWFjdG9yQ29udGFpbnNUd29TaWJsaW5nUHJvamVjdHMoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAidmVyc2lvbiIsIG51bGwgKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayBtYWNUYXNrID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBtbSwgcHJvamVjdCApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0MiA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdDIiLCAidmVyc2lvbiIsIG51bGwgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PE1hdmVuUHJvamVjdD4oKTsKLSAgICAgICAgcHJvamVjdHMuYWRkKCBwcm9qZWN0ICk7Ci0gICAgICAgIHByb2plY3RzLmFkZCggcHJvamVjdDIgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldFJlYWN0b3JQcm9qZWN0cyggcHJvamVjdHMgKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXQgbW9kdWxlU2V0ID0gbmV3IE1vZHVsZVNldCgpOwotICAgICAgICBtb2R1bGVTZXQuc2V0SW5jbHVkZVN1Yk1vZHVsZXMoIHRydWUgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBTZXQ8TWF2ZW5Qcm9qZWN0PiBtb2R1bGVQcm9qZWN0cyA9Ci0gICAgICAgICAgICBNb2R1bGVTZXRBc3NlbWJseVBoYXNlLmdldE1vZHVsZVByb2plY3RzKCBtb2R1bGVTZXQsIG1hY1Rhc2suY29uZmlnU291cmNlLCBsb2dnZXIgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBtb2R1bGVQcm9qZWN0cy5pc0VtcHR5KCkgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlUHJvamVjdHNfU2hvdWxkUmV0dXJuTW9kdWxlT2ZDdXJyZW50UHJvamVjdCgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgbnVsbCApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrIG1hY1Rhc2sgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2soIG1tLCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QyID0gY3JlYXRlUHJvamVjdCggImdyb3VwIiwgImFydGlmYWN0MiIsICJ2ZXJzaW9uIiwgcHJvamVjdCApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiBwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8TWF2ZW5Qcm9qZWN0PigpOwotICAgICAgICBwcm9qZWN0cy5hZGQoIHByb2plY3QgKTsKLSAgICAgICAgcHJvamVjdHMuYWRkKCBwcm9qZWN0MiApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0UmVhY3RvclByb2plY3RzKCBwcm9qZWN0cyApOwotCi0gICAgICAgIGZpbmFsIE1vZHVsZVNldCBtb2R1bGVTZXQgPSBuZXcgTW9kdWxlU2V0KCk7Ci0gICAgICAgIG1vZHVsZVNldC5zZXRJbmNsdWRlU3ViTW9kdWxlcyggdHJ1ZSApOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IG1vZHVsZVByb2plY3RzID0KLSAgICAgICAgICAgIE1vZHVsZVNldEFzc2VtYmx5UGhhc2UuZ2V0TW9kdWxlUHJvamVjdHMoIG1vZHVsZVNldCwgbWFjVGFzay5jb25maWdTb3VyY2UsIGxvZ2dlciApOwotCi0gICAgICAgIGFzc2VydEZhbHNlKCBtb2R1bGVQcm9qZWN0cy5pc0VtcHR5KCkgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcmVzdWx0ID0gbW9kdWxlUHJvamVjdHMuaXRlcmF0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImFydGlmYWN0MiIsIHJlc3VsdC5nZXRBcnRpZmFjdElkKCkgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TW9kdWxlUHJvamVjdHNfU2hvdWxkUmV0dXJuRGVzY2VuZGVudE1vZHVsZXNPZkN1cnJlbnRQcm9qZWN0KCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCBudWxsICk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2sgbWFjVGFzayA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayggbW0sIHByb2plY3QgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdDIgPSBjcmVhdGVQcm9qZWN0KCAiZ3JvdXAiLCAiYXJ0aWZhY3QyIiwgInZlcnNpb24iLCBwcm9qZWN0ICk7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0MyA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdDMiLCAidmVyc2lvbiIsIHByb2plY3QyICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IHByb2plY3RzID0gbmV3IEFycmF5TGlzdDxNYXZlblByb2plY3Q+KCk7Ci0gICAgICAgIHByb2plY3RzLmFkZCggcHJvamVjdCApOwotICAgICAgICBwcm9qZWN0cy5hZGQoIHByb2plY3QyICk7Ci0gICAgICAgIHByb2plY3RzLmFkZCggcHJvamVjdDMgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldFJlYWN0b3JQcm9qZWN0cyggcHJvamVjdHMgKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXQgbW9kdWxlU2V0ID0gbmV3IE1vZHVsZVNldCgpOwotICAgICAgICBtb2R1bGVTZXQuc2V0SW5jbHVkZVN1Yk1vZHVsZXMoIHRydWUgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBTZXQ8TWF2ZW5Qcm9qZWN0PiBtb2R1bGVQcm9qZWN0cyA9Ci0gICAgICAgICAgICBNb2R1bGVTZXRBc3NlbWJseVBoYXNlLmdldE1vZHVsZVByb2plY3RzKCBtb2R1bGVTZXQsIG1hY1Rhc2suY29uZmlnU291cmNlLCBsb2dnZXIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIDIsIG1vZHVsZVByb2plY3RzLnNpemUoKSApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiBjaGVjayA9IG5ldyBBcnJheUxpc3Q8TWF2ZW5Qcm9qZWN0PigpOwotICAgICAgICBjaGVjay5hZGQoIHByb2plY3QyICk7Ci0gICAgICAgIGNoZWNrLmFkZCggcHJvamVjdDMgKTsKLQotICAgICAgICB2ZXJpZnlSZXN1bHRJcyggY2hlY2ssIG1vZHVsZVByb2plY3RzICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE1vZHVsZVByb2plY3RzX1Nob3VsZEV4Y2x1ZGVNb2R1bGVBbmREZXNjZW5kZW50c1RyYW5zaXRpdmVseSgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtbSA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgbnVsbCApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrIG1hY1Rhc2sgPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2soIG1tLCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgYWRkQXJ0aWZhY3QoIHByb2plY3QsIG1tLCBmYWxzZSApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0MiA9IGNyZWF0ZVByb2plY3QoICJncm91cCIsICJhcnRpZmFjdDIiLCAidmVyc2lvbiIsIHByb2plY3QgKTsKLSAgICAgICAgYWRkQXJ0aWZhY3QoIHByb2plY3QyLCBtbSwgZmFsc2UgKTsKLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QzID0gY3JlYXRlUHJvamVjdCggImdyb3VwIiwgImFydGlmYWN0MyIsICJ2ZXJzaW9uIiwgcHJvamVjdDIgKTsKLSAgICAgICAgYWRkQXJ0aWZhY3QoIHByb2plY3QzLCBtbSwgdHJ1ZSApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiBwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8TWF2ZW5Qcm9qZWN0PigpOwotICAgICAgICBwcm9qZWN0cy5hZGQoIHByb2plY3QgKTsKLSAgICAgICAgcHJvamVjdHMuYWRkKCBwcm9qZWN0MiApOwotICAgICAgICBwcm9qZWN0cy5hZGQoIHByb2plY3QzICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRSZWFjdG9yUHJvamVjdHMoIHByb2plY3RzICk7Ci0KLSAgICAgICAgZmluYWwgTW9kdWxlU2V0IG1vZHVsZVNldCA9IG5ldyBNb2R1bGVTZXQoKTsKLSAgICAgICAgbW9kdWxlU2V0LnNldEluY2x1ZGVTdWJNb2R1bGVzKCB0cnVlICk7Ci0KLSAgICAgICAgbW9kdWxlU2V0LmFkZEV4Y2x1ZGUoICJncm91cDphcnRpZmFjdDIiICk7Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gbW9kdWxlUHJvamVjdHMgPQotICAgICAgICAgICAgTW9kdWxlU2V0QXNzZW1ibHlQaGFzZS5nZXRNb2R1bGVQcm9qZWN0cyggbW9kdWxlU2V0LCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSwgbG9nZ2VyICk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggbW9kdWxlUHJvamVjdHMuaXNFbXB0eSgpICk7Ci0KLSAgICAgICAgbW0udmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBcnRpZmFjdE1vY2sgYWRkQXJ0aWZhY3QoIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0LCBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0sIGZpbmFsIGJvb2xlYW4gZXhwZWN0RGVwVHJhaWxDaGVjayApCi0gICAgewotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgbWFjQXJ0aWZhY3QgPQotICAgICAgICAgICAgbmV3IEFydGlmYWN0TW9jayggbW0sIHByb2plY3QuZ2V0R3JvdXBJZCgpLCBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSwgcHJvamVjdC5nZXRWZXJzaW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldFBhY2thZ2luZygpLCBmYWxzZSApOwotCi0gICAgICAgIGlmICggZXhwZWN0RGVwVHJhaWxDaGVjayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBkZXBUcmFpbCA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKLQotICAgICAgICAgICAgTWF2ZW5Qcm9qZWN0IHBhcmVudCA9IHByb2plY3QuZ2V0UGFyZW50KCk7Ci0gICAgICAgICAgICB3aGlsZSAoIHBhcmVudCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZXBUcmFpbC5hZGRMYXN0KCBwYXJlbnQuZ2V0SWQoKSApOwotCi0gICAgICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtYWNBcnRpZmFjdC5zZXREZXBlbmRlbmN5VHJhaWwoIGRlcFRyYWlsICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm9qZWN0LnNldEFydGlmYWN0KCBtYWNBcnRpZmFjdC5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgcmV0dXJuIG1hY0FydGlmYWN0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlSZXN1bHRJcyggZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IGNoZWNrLCBmaW5hbCBTZXQ8TWF2ZW5Qcm9qZWN0PiBtb2R1bGVQcm9qZWN0cyApCi0gICAgewotICAgICAgICBib29sZWFuIGZhaWxlZCA9IGZhbHNlOwotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IGNoZWNrVG9vTWFueSA9IG5ldyBIYXNoU2V0PE1hdmVuUHJvamVjdD4oIG1vZHVsZVByb2plY3RzICk7Ci0gICAgICAgIGNoZWNrVG9vTWFueS5yZW1vdmVBbGwoIGNoZWNrICk7Ci0KLSAgICAgICAgaWYgKCAhY2hlY2tUb29NYW55LmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIlVuZXhwZWN0ZWQgcHJvamVjdHMgaW4gb3V0cHV0OiAiICk7Ci0KLSAgICAgICAgICAgIGZvciAoZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgOiBjaGVja1Rvb01hbnkpIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJvamVjdC5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IGNoZWNrVG9vRmV3ID0gbmV3IEhhc2hTZXQ8TWF2ZW5Qcm9qZWN0PiggY2hlY2sgKTsKLSAgICAgICAgY2hlY2tUb29GZXcucmVtb3ZlQWxsKCBtb2R1bGVQcm9qZWN0cyApOwotCi0gICAgICAgIGlmICggIWNoZWNrVG9vRmV3LmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7Ci0KLSAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbiggIkV4cGVjdGVkIHByb2plY3RzIG1pc3NpbmcgZnJvbSBvdXRwdXQ6ICIgKTsKLQotICAgICAgICAgICAgZm9yIChmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA6IGNoZWNrVG9vTWFueSkgewotICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcm9qZWN0LmdldElkKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBmYWlsZWQgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCggIlNlZSBzeXN0ZW0gb3V0cHV0IGZvciBtb3JlIGluZm9ybWF0aW9uLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IGNyZWF0ZVByb2plY3QoIGZpbmFsIFN0cmluZyBncm91cElkLCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgZmluYWwgU3RyaW5nIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHBhcmVudFByb2plY3QgKQotICAgIHsKLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggYXJ0aWZhY3RJZCApOwotICAgICAgICBtb2RlbC5zZXRHcm91cElkKCBncm91cElkICk7Ci0gICAgICAgIG1vZGVsLnNldFZlcnNpb24oIHZlcnNpb24gKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0KLSAgICAgICAgRmlsZSBwb21GaWxlOwotICAgICAgICBpZiAoIHBhcmVudFByb2plY3QgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLSAgICAgICAgICAgIHBvbUZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInBvbS54bWwiICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIHBhcmVudEJhc2UgPSBwYXJlbnRQcm9qZWN0LmdldEJhc2VkaXIoKTsKLSAgICAgICAgICAgIHBvbUZpbGUgPSBuZXcgRmlsZSggcGFyZW50QmFzZSwgYXJ0aWZhY3RJZCArICIvcG9tLnhtbCIgKTsKLQotICAgICAgICAgICAgcGFyZW50UHJvamVjdC5nZXRNb2RlbCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1vZHVsZSggYXJ0aWZhY3RJZCApOwotICAgICAgICAgICAgcHJvamVjdC5zZXRQYXJlbnQoIHBhcmVudFByb2plY3QgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2plY3Quc2V0RmlsZSggcG9tRmlsZSApOwotCi0gICAgICAgIHJldHVybiBwcm9qZWN0OwotICAgIH0KLQotICAgIHByaXZhdGUgTW9kdWxlU2V0QXNzZW1ibHlQaGFzZSBjcmVhdGVQaGFzZSggZmluYWwgTG9nZ2VyIGxvZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrIG1hY1Rhc2sgKQotICAgIHsKLSAgICAgICAgTWF2ZW5Qcm9qZWN0QnVpbGRlciBwcm9qZWN0QnVpbGRlciA9IG51bGw7Ci0KLSAgICAgICAgaWYgKCBtYWNUYXNrICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBwcm9qZWN0QnVpbGRlciA9IG1hY1Rhc2sucHJvamVjdEJ1aWxkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBEZXBlbmRlbmN5UmVzb2x2ZXIgZHIgPSBFYXN5TW9jay5jcmVhdGVNb2NrKCBEZXBlbmRlbmN5UmVzb2x2ZXIuY2xhc3MgKTsKLSAgICAgICAgcmV0dXJuIG5ldyBNb2R1bGVTZXRBc3NlbWJseVBoYXNlKCBwcm9qZWN0QnVpbGRlciwgZHIsIGxvZ2dlciApOwotICAgIH0KLQotICAgIHByaXZhdGUgTW9kdWxlU2V0QXNzZW1ibHlQaGFzZSBjcmVhdGVQaGFzZSggZmluYWwgTG9nZ2VyIGxvZ2dlciwgRGVwZW5kZW5jeVJlc29sdmVyIGRyLCBNYXZlblByb2plY3RCdWlsZGVyIHByb2plY3RCdWlsZGVyMSApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IE1vZHVsZVNldEFzc2VtYmx5UGhhc2UoIHByb2plY3RCdWlsZGVyMSwgZHIsIGxvZ2dlciApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3BoYXNlL1JlcG9zaXRvcnlBc3NlbWJseVBoYXNlVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvUmVwb3NpdG9yeUFzc2VtYmx5UGhhc2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjOWIyNDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvcGhhc2UvUmVwb3NpdG9yeUFzc2VtYmx5UGhhc2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnBoYXNlOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdHV0aWxzLlRlc3RGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlscy5UeXBlQ29udmVyc2lvblV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQucmVwb3NpdG9yeS5SZXBvc2l0b3J5QXNzZW1ibGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUFzc2VtYmx5RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLnJlcG9zaXRvcnkuUmVwb3NpdG9yeUJ1aWxkZXJDb25maWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQucmVwb3NpdG9yeS5tb2RlbC5SZXBvc2l0b3J5SW5mbzsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5GaWxlU2V0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIudXRpbC5EZWZhdWx0RmlsZVNldDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmludGVycG9sYXRpb24uZml4ZWQuRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuY29uc29sZS5Db25zb2xlTG9nZ2VyOwotaW1wb3J0IG9yZy5lYXN5bW9jay5jbGFzc2V4dGVuc2lvbi5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5hbnlPYmplY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci0KLXB1YmxpYyBjbGFzcyBSZXBvc2l0b3J5QXNzZW1ibHlQaGFzZVRlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwcml2YXRlIGZpbmFsIFRlc3RGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9IG5ldyBUZXN0RmlsZU1hbmFnZXIoICJyZXBvc2l0b3J5LXBoYXNlLnRlc3QuIiwgIiIgKTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaWxlTWFuYWdlci5jbGVhblVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVfU2hvdWxkTm90SW5jbHVkZVJlcG9zaXRvcnlJZk5vblNwZWNpZmllZEluQXNzZW1ibHkoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JSZXBvc2l0b3J5QXNzZW1ibGVyIG1hY1JlcG8gPSBuZXcgTW9ja0FuZENvbnRyb2xGb3JSZXBvc2l0b3J5QXNzZW1ibGVyKCBtbSApOwotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyIG1hY0FyY2hpdmVyID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQXJjaGl2ZXIoIG1tICk7Ci0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQ29uZmlnU291cmNlIG1hY0NTID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQ29uZmlnU291cmNlKCBtbSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgdGVtcFJvb3QgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgbWFjQ1MuZXhwZWN0R2V0VGVtcG9yYXJ5Um9vdERpcmVjdG9yeSggdGVtcFJvb3QgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIGFzc2VtYmx5LnNldElkKCAidGVzdCIgKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBjcmVhdGVQaGFzZSggbWFjUmVwby5yZXBvc2l0b3J5QXNzZW1ibGVyLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApLmV4ZWN1dGUoIGFzc2VtYmx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0FyY2hpdmVyLmFyY2hpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0NTLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlX1Nob3VsZEluY2x1ZGVPbmVSZXBvc2l0b3J5KCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yUmVwb3NpdG9yeUFzc2VtYmxlciBtYWNSZXBvID0gbmV3IE1vY2tBbmRDb250cm9sRm9yUmVwb3NpdG9yeUFzc2VtYmxlciggbW0gKTsKLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JBcmNoaXZlciBtYWNBcmNoaXZlciA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyKCBtbSApOwotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSBtYWNDUyA9IG5ldyBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSggbW0gKTsKLQotICAgICAgICBmaW5hbCBGaWxlIHRlbXBSb290ID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIG1hY0NTLmV4cGVjdEdldFRlbXBvcmFyeVJvb3REaXJlY3RvcnkoIHRlbXBSb290ICk7Ci0gICAgICAgIG1hY0NTLmV4cGVjdEdldFByb2plY3QoIG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICkgKTsKLSAgICAgICAgbWFjQ1MuZXhwZWN0R2V0RmluYWxOYW1lKCAiZmluYWwtbmFtZSIgKTsKLSAgICAgICAgbWFjQ1MuZXhwZWN0SW50ZXJwb2xhdG9ycygpOwotCi0KLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLQotICAgICAgICBhc3NlbWJseS5zZXRJZCggInRlc3QiICk7Ci0KLSAgICAgICAgZmluYWwgUmVwb3NpdG9yeSByZXBvID0gbmV3IFJlcG9zaXRvcnkoKTsKLQotICAgICAgICByZXBvLnNldE91dHB1dERpcmVjdG9yeSggIm91dCIgKTsKLSAgICAgICAgcmVwby5zZXREaXJlY3RvcnlNb2RlKCAiNzc3IiApOwotICAgICAgICByZXBvLnNldEZpbGVNb2RlKCAiNzc3IiApOwotCi0gICAgICAgIGZpbmFsIGludCBtb2RlID0gVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgb3V0RGlyID0gbmV3IEZpbGUoIHRlbXBSb290LCAib3V0IiApOwotCi0gICAgICAgIG1hY0FyY2hpdmVyLmV4cGVjdE1vZGVDaGFuZ2UoIC0xLCAtMSwgbW9kZSwgbW9kZSwgdHJ1ZSApOwotICAgICAgICBtYWNBcmNoaXZlci5leHBlY3RBZGREaXJlY3RvcnkoIG91dERpciwgIm91dC8iLCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgbWFjUmVwby5leHBlY3RBc3NlbWJsZSgpOwotCi0gICAgICAgIGFzc2VtYmx5LmFkZFJlcG9zaXRvcnkoIHJlcG8gKTsKLQotICAgICAgICBtbS5yZXBsYXlBbGwoKTsKLQotICAgICAgICBjcmVhdGVQaGFzZSggbWFjUmVwby5yZXBvc2l0b3J5QXNzZW1ibGVyLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApLmV4ZWN1dGUoIGFzc2VtYmx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0FyY2hpdmVyLmFyY2hpdmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY0NTLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVwb3NpdG9yeUFzc2VtYmx5UGhhc2UgY3JlYXRlUGhhc2UoIGZpbmFsIFJlcG9zaXRvcnlBc3NlbWJsZXIgcmVwb3NpdG9yeUFzc2VtYmxlciwgZmluYWwgTG9nZ2VyIGxvZ2dlciApCi0gICAgewotICAgICAgICBmaW5hbCBSZXBvc2l0b3J5QXNzZW1ibHlQaGFzZSBwaGFzZSA9IG5ldyBSZXBvc2l0b3J5QXNzZW1ibHlQaGFzZSggcmVwb3NpdG9yeUFzc2VtYmxlciApOwotICAgICAgICBwaGFzZS5lbmFibGVMb2dnaW5nKCBsb2dnZXIgKTsKLQotICAgICAgICByZXR1cm4gcGhhc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNb2NrQW5kQ29udHJvbEZvckFyY2hpdmVyCi0gICAgewotICAgICAgICBmaW5hbCBBcmNoaXZlciBhcmNoaXZlcjsKLQotICAgICAgICBwdWJsaWMgTW9ja0FuZENvbnRyb2xGb3JBcmNoaXZlciggZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1vY2tNYW5hZ2VyICkKLSAgICAgICAgewotCi0gICAgICAgICAgICBhcmNoaXZlciA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2sgKEFyY2hpdmVyLmNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGV4cGVjdEFkZERpcmVjdG9yeSggZmluYWwgRmlsZSBvdXREaXIsIGZpbmFsIFN0cmluZyBsb2NhdGlvbiwgZmluYWwgU3RyaW5nW10gaW5jbHVkZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZXhjbHVkZXMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBEZWZhdWx0RmlsZVNldCBmcyA9IG5ldyBEZWZhdWx0RmlsZVNldCgpOwotICAgICAgICAgICAgICAgIGZzLnNldERpcmVjdG9yeSggb3V0RGlyICk7Ci0gICAgICAgICAgICAgICAgZnMuc2V0UHJlZml4KCBsb2NhdGlvbiApOwotICAgICAgICAgICAgICAgIGZzLnNldEluY2x1ZGVzKCBpbmNsdWRlcyApOwotICAgICAgICAgICAgICAgIGZzLnNldEV4Y2x1ZGVzKCBleGNsdWRlcyApOwotCi0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZVNldCggKEZpbGVTZXQpYW55T2JqZWN0KCkgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZXJFeGNlcHRpb24gZSApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoICJTaG91bGQgbmV2ZXIgaGFwcGVuLiIgKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hdExlYXN0T25jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBleHBlY3RNb2RlQ2hhbmdlKCBmaW5hbCBpbnQgZGVmYXVsdERpck1vZGUsIGZpbmFsIGludCBkZWZhdWx0RmlsZU1vZGUsIGZpbmFsIGludCBkaXJNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBmaWxlTW9kZSwgZmluYWwgYm9vbGVhbiBleHBlY3RUd29TZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KCBhcmNoaXZlci5nZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKSkuYW5kUmV0dXJuKCBkZWZhdWx0RGlyTW9kZSApOwotCi0gICAgICAgICAgICBleHBlY3QoIGFyY2hpdmVyLmdldE92ZXJyaWRlRmlsZU1vZGUoKSkuYW5kUmV0dXJuKCBkZWZhdWx0RmlsZU1vZGUgKTsKLQotICAgICAgICAgICAgaWYgKCBleHBlY3RUd29TZXRzICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcmNoaXZlci5zZXREaXJlY3RvcnlNb2RlKCBkaXJNb2RlICk7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RmlsZU1vZGUoIGZpbGVNb2RlICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGFyY2hpdmVyLnNldERpcmVjdG9yeU1vZGUoIGRlZmF1bHREaXJNb2RlICk7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXRGaWxlTW9kZSggZGVmYXVsdEZpbGVNb2RlICk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwdWJsaWMgdm9pZCBleHBlY3RBZGRGaWxlKCBGaWxlIGZpbGUsIFN0cmluZyBvdXRwdXRMb2NhdGlvbiwgaW50IGZpbGVNb2RlICkKLSAgICAgICAgLy8gewotICAgICAgICAvLyB0cnkKLSAgICAgICAgLy8gewotICAgICAgICAvLyBhcmNoaXZlci5hZGRGaWxlKCBmaWxlLCBvdXRwdXRMb2NhdGlvbiwgZmlsZU1vZGUgKTsKLSAgICAgICAgLy8gfQotICAgICAgICAvLyBjYXRjaCAoIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICAvLyB7Ci0gICAgICAgIC8vIEFzc2VydC5mYWlsKCAiU2hvdWxkIG5ldmVyIGhhcHBlbi4iICk7Ci0gICAgICAgIC8vIH0KLSAgICAgICAgLy8gfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTW9ja0FuZENvbnRyb2xGb3JDb25maWdTb3VyY2UKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlOwotCi0gICAgICAgIHB1YmxpYyBNb2NrQW5kQ29udHJvbEZvckNvbmZpZ1NvdXJjZSggZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1vY2tNYW5hZ2VyICkKLSAgICAgICAgewotICAgICAgICAgICAgY29uZmlnU291cmNlID0gbW9ja01hbmFnZXIuY3JlYXRlTW9jayhBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlLmNsYXNzKTsKLQotICAgICAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0TWF2ZW5TZXNzaW9uKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBleHBlY3RHZXRQcm9qZWN0KCBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpKS5hbmRSZXR1cm4oIHByb2plY3QgKS5hdExlYXN0T25jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXhwZWN0R2V0RmluYWxOYW1lKCBmaW5hbCBTdHJpbmcgZmluYWxOYW1lICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRGaW5hbE5hbWUoKSkuYW5kUmV0dXJuKCBmaW5hbE5hbWUgKS5hdExlYXN0T25jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXhwZWN0SW50ZXJwb2xhdG9ycyggKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldENvbW1hbmRMaW5lUHJvcHNJbnRlcnBvbGF0b3IoKSkuYW5kUmV0dXJuKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5lbXB0eSgpICkuYW55VGltZXMoKTsKLSAgICAgICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0RW52SW50ZXJwb2xhdG9yKCkpLmFuZFJldHVybiggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuZW1wdHkoKSApLmFueVRpbWVzKCk7Ci0gICAgICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldE1haW5Qcm9qZWN0SW50ZXJwb2xhdG9yKCkpLmFuZFJldHVybiggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuZW1wdHkoKSApLmFueVRpbWVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBleHBlY3RHZXRUZW1wb3JhcnlSb290RGlyZWN0b3J5KCBmaW5hbCBGaWxlIHRlbXBSb290ICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRUZW1wb3JhcnlSb290RGlyZWN0b3J5KCkpLmFuZFJldHVybiggdGVtcFJvb3QgKS5hdExlYXN0T25jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8KLSAgICAgICAgLy8gcHVibGljIHZvaWQgZXhwZWN0R2V0QmFzZWRpciggRmlsZSBiYXNlZGlyICkKLSAgICAgICAgLy8gewotICAgICAgICAvLyBjb25maWdTb3VyY2UuZ2V0QmFzZWRpcigpOwotICAgICAgICAvLyBjb250cm9sLnNldFJldHVyblZhbHVlKCBiYXNlZGlyLCBNb2NrQ29udHJvbC5PTkVfT1JfTU9SRSApOwotICAgICAgICAvLyB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNb2NrQW5kQ29udHJvbEZvclJlcG9zaXRvcnlBc3NlbWJsZXIKLSAgICB7Ci0gICAgICAgIGZpbmFsIFJlcG9zaXRvcnlBc3NlbWJsZXIgcmVwb3NpdG9yeUFzc2VtYmxlcjsKLQotICAgICAgICBNb2NrQW5kQ29udHJvbEZvclJlcG9zaXRvcnlBc3NlbWJsZXIoIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtb2NrTWFuYWdlciApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJlcG9zaXRvcnlBc3NlbWJsZXIgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKFJlcG9zaXRvcnlBc3NlbWJsZXIuY2xhc3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZXhwZWN0QXNzZW1ibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXBvc2l0b3J5QXNzZW1ibGVyLmJ1aWxkUmVtb3RlUmVwb3NpdG9yeSggKEZpbGUpYW55T2JqZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZXBvc2l0b3J5SW5mbykgYW55T2JqZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggUmVwb3NpdG9yeUJ1aWxkZXJDb25maWdTb3VyY2UpYW55T2JqZWN0KCkgKTsKLSAgICAgICAgICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmF0TGVhc3RPbmNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoIGZpbmFsIFJlcG9zaXRvcnlBc3NlbWJseUV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCggIlNob3VsZCBuZXZlciBoYXBwZW4iICk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay9BZGRBcnRpZmFjdFRhc2tUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FkZEFydGlmYWN0VGFza1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1ZDUzZS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FkZEFydGlmYWN0VGFza1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzazsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrLnRlc3R1dGlscy5BcnRpZmFjdE1vY2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrLnRlc3R1dGlscy5Nb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkRlcGVuZGVuY3lTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudXRpbHMuVHlwZUNvbnZlcnNpb25VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZWRGaWxlU2V0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuY29uc29sZS5Db25zb2xlTG9nZ2VyOwotaW1wb3J0IG9yZy5lYXN5bW9jay5jbGFzc2V4dGVuc2lvbi5FYXN5TW9ja1N1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suYW55T2JqZWN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncyggIk9jdGFsSW50ZWdlciIgKQotcHVibGljIGNsYXNzIEFkZEFydGlmYWN0VGFza1Rlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwcml2YXRlIEVhc3lNb2NrU3VwcG9ydCBtb2NrTWFuYWdlcjsKLQotICAgIHByaXZhdGUgTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2sgbWFjOwotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIG1vY2tNYW5hZ2VyID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cCIgKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggIm1haW4iICk7Ci0gICAgICAgIG1vZGVsLnNldFZlcnNpb24oICIxMDAwIiApOwotCi0gICAgICAgIE1hdmVuUHJvamVjdCBtYWluUHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0KLSAgICAgICAgbWFjID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkQXJ0aWZhY3RUYXNrKCBtb2NrTWFuYWdlciwgbWFpblByb2plY3QgKTsKLSAgICAgICAgbWFjLmV4cGVjdEdldEZpbmFsTmFtZSggImZpbmFsLW5hbWUiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEFkZEFyY2hpdmVGaWxlV2l0aG91dFVucGFja2luZygpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyBvdXRwdXRMb2NhdGlvbiA9ICJhcnRpZmFjdCI7Ci0KLSAgICAgICAgQXJ0aWZhY3RNb2NrIGFydGlmYWN0TW9jayA9IG5ldyBBcnRpZmFjdE1vY2soIG1vY2tNYW5hZ2VyLCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAidmVyc2lvbiIsICJqYXIiLCBmYWxzZSApOwotICAgICAgICBGaWxlIGFydGlmYWN0RmlsZSA9IGFydGlmYWN0TW9jay5zZXROZXdGaWxlKCk7Ci0KLSAgICAgICAgbWFjLmV4cGVjdEdldE1vZGUoIDAyMjIsIDAyMjIgKTsKLSAgICAgICAgbWFjLmV4cGVjdEdldERlc3RGaWxlKCBuZXcgRmlsZSggImp1bmsiICkgKTsKLSAgICAgICAgbWFjLmV4cGVjdEFkZEZpbGUoIGFydGlmYWN0RmlsZSwgb3V0cHV0TG9jYXRpb24gKTsKLSAgICAgICAgbWFjLmV4cGVjdEludGVycG9sYXRvcnMoKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBBZGRBcnRpZmFjdFRhc2sgdGFzayA9IGNyZWF0ZVRhc2soIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgdGFzay5leGVjdXRlKCBtYWMuYXJjaGl2ZXIsIG1hYy5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkQWRkQXJjaGl2ZUZpbGVXaXRoRGVmYXVsdE91dHB1dExvY2F0aW9uKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIGFydGlmYWN0SWQgPSAibXlBcnRpZmFjdCI7Ci0gICAgICAgIFN0cmluZyB2ZXJzaW9uID0gIjEiOwotICAgICAgICBTdHJpbmcgZXh0ID0gImphciI7Ci0gICAgICAgIFN0cmluZyBvdXRwdXREaXIgPSAidG1wLyI7Ci0KLSAgICAgICAgQXJ0aWZhY3RNb2NrIG1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtb2NrTWFuYWdlciwgImdyb3VwIiwgYXJ0aWZhY3RJZCwgdmVyc2lvbiwgZXh0LCBmYWxzZSApOwotCi0gICAgICAgIEZpbGUgZmlsZSA9IG1vY2suc2V0TmV3RmlsZSgpOwotICAgICAgICBtb2NrLnNldEV4dGVuc2lvbiggZXh0ICk7Ci0KLSAgICAgICAgbWFjLmV4cGVjdEdldE1vZGUoIDAyMjIsIDAyMjIgKTsKLQotICAgICAgICBtYWMuZXhwZWN0R2V0RGVzdEZpbGUoIG5ldyBGaWxlKCAianVuayIgKSApOwotICAgICAgICBtYWMuZXhwZWN0QWRkRmlsZSggZmlsZSwgb3V0cHV0RGlyICsgYXJ0aWZhY3RJZCArICItIiArIHZlcnNpb24gKyAiLiIgKyBleHQgKTsKLSAgICAgICAgbWFjLmV4cGVjdEludGVycG9sYXRvcnMoKTsKLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgQWRkQXJ0aWZhY3RUYXNrIHRhc2sgPQotICAgICAgICAgICAgbmV3IEFkZEFydGlmYWN0VGFzayggbW9jay5nZXRBcnRpZmFjdCgpLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSwgbnVsbCApOwotICAgICAgICB0YXNrLnNldE91dHB1dERpcmVjdG9yeSggb3V0cHV0RGlyICk7Ci0gICAgICAgIHRhc2suc2V0RmlsZU5hbWVNYXBwaW5nKCBuZXcgRGVwZW5kZW5jeVNldCgpLmdldE91dHB1dEZpbGVOYW1lTWFwcGluZygpICk7Ci0KLSAgICAgICAgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggYXJ0aWZhY3RJZCApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0KLSAgICAgICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCBtb2RlbCApOwotICAgICAgICB0YXNrLnNldFByb2plY3QoIHByb2plY3QgKTsKLQotICAgICAgICB0YXNrLmV4ZWN1dGUoIG1hYy5hcmNoaXZlciwgbWFjLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgQWRkQXJ0aWZhY3RUYXNrIGNyZWF0ZVRhc2soIEFydGlmYWN0IGFydGlmYWN0ICkKLSAgICB7Ci0gICAgICAgIEFkZEFydGlmYWN0VGFzayB0YXNrID0gbmV3IEFkZEFydGlmYWN0VGFzayggYXJ0aWZhY3QsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApLCBudWxsICk7Ci0KLSAgICAgICAgdGFzay5zZXRGaWxlTmFtZU1hcHBpbmcoICJhcnRpZmFjdCIgKTsKLQotICAgICAgICByZXR1cm4gdGFzazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkQWRkQXJjaGl2ZUZpbGVXaXRoVW5wYWNrKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWFjLmV4cGVjdE1vZGVDaGFuZ2UoIC0xLCAtMSwgLTEsIC0xLCAxICk7Ci0gICAgICAgIG1hYy5leHBlY3RJbnRlcnBvbGF0b3JzKCk7Ci0KLSAgICAgICAgQXJ0aWZhY3RNb2NrIGFydGlmYWN0TW9jayA9IG5ldyBBcnRpZmFjdE1vY2soIG1vY2tNYW5hZ2VyLCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAidmVyc2lvbiIsICJqYXIiLCBmYWxzZSApOwotICAgICAgICBGaWxlIGFydGlmYWN0RmlsZSA9IGFydGlmYWN0TW9jay5zZXROZXdGaWxlKCk7Ci0KLSAgICAgICAgU3RyaW5nIG91dHB1dExvY2F0aW9uID0gIiI7Ci0KLSAgICAgICAgbWFjLmV4cGVjdEdldERlc3RGaWxlKCBuZXcgRmlsZSggImp1bmsiICkgKTsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLS8vICAgICAgICAgICAgbWFjLmFyY2hpdmVyLmFkZEFyY2hpdmVkRmlsZVNldCggYXJ0aWZhY3RGaWxlLCBvdXRwdXRMb2NhdGlvbiwgQWRkQXJ0aWZhY3RUYXNrLkRFRkFVTFRfSU5DTFVERVNfQVJSQVksCi0vLyBudWxsICk7Ci0gICAgICAgICAgICBtYWMuYXJjaGl2ZXIuYWRkQXJjaGl2ZWRGaWxlU2V0KCAoQXJjaGl2ZWRGaWxlU2V0KSBhbnlPYmplY3QoKSwgKENoYXJzZXQpIGFueU9iamVjdCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCggIlNob3VsZCBuZXZlciBoYXBwZW4uIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgQWRkQXJ0aWZhY3RUYXNrIHRhc2sgPSBjcmVhdGVUYXNrKCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApOwotCi0gICAgICAgIHRhc2suc2V0VW5wYWNrKCB0cnVlICk7Ci0KLSAgICAgICAgdGFzay5leGVjdXRlKCBtYWMuYXJjaGl2ZXIsIG1hYy5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkQWRkQXJjaGl2ZUZpbGVXaXRoVW5wYWNrQW5kTW9kZXMoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbnQgZGlyZWN0b3J5TW9kZSA9IFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCAiNzc3IiwgbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKTsKLSAgICAgICAgaW50IGZpbGVNb2RlID0gVHlwZUNvbnZlcnNpb25VdGlscy5tb2RlVG9JbnQoICI3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApOwotCi0gICAgICAgIG1hYy5leHBlY3RNb2RlQ2hhbmdlKCAtMSwgLTEsIGRpcmVjdG9yeU1vZGUsIGZpbGVNb2RlLCAyICk7Ci0gICAgICAgIG1hYy5leHBlY3RJbnRlcnBvbGF0b3JzKCk7Ci0KLS8vICAgICAgICBtYWMuZXhwZWN0SXNTbmFwc2hvdCggZmFsc2UgKTsKLQotICAgICAgICBTdHJpbmcgb3V0cHV0TG9jYXRpb24gPSAiIjsKLQotICAgICAgICBBcnRpZmFjdE1vY2sgYXJ0aWZhY3RNb2NrID0gbmV3IEFydGlmYWN0TW9jayggbW9ja01hbmFnZXIsICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgImphciIsIGZhbHNlICk7Ci0gICAgICAgIEZpbGUgYXJ0aWZhY3RGaWxlID0gYXJ0aWZhY3RNb2NrLnNldE5ld0ZpbGUoKTsKLQotICAgICAgICBtYWMuZXhwZWN0R2V0RGVzdEZpbGUoIG5ldyBGaWxlKCAianVuayIgKSApOwotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgbWFjLmFyY2hpdmVyLmFkZEFyY2hpdmVkRmlsZVNldCggKEFyY2hpdmVkRmlsZVNldCkgYW55T2JqZWN0KCksIChDaGFyc2V0KSBhbnlPYmplY3QoKSAgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsKCAiU2hvdWxkIG5ldmVyIGhhcHBlbi4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBBZGRBcnRpZmFjdFRhc2sgdGFzayA9IGNyZWF0ZVRhc2soIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgdGFzay5zZXRVbnBhY2soIHRydWUgKTsKLQotICAgICAgICB0YXNrLnNldERpcmVjdG9yeU1vZGUoIGRpcmVjdG9yeU1vZGUgKTsKLSAgICAgICAgdGFzay5zZXRGaWxlTW9kZSggZmlsZU1vZGUgKTsKLQotICAgICAgICB0YXNrLmV4ZWN1dGUoIG1hYy5hcmNoaXZlciwgbWFjLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRBZGRBcmNoaXZlRmlsZVdpdGhVbnBhY2tJbmNsdWRlc0FuZEV4Y2x1ZGVzKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWFjLmV4cGVjdE1vZGVDaGFuZ2UoIC0xLCAtMSwgLTEsIC0xLCAxICk7Ci0KLSAgICAgICAgU3RyaW5nW10gaW5jbHVkZXMgPSB7ICIqKi8qLnR4dCIgfTsKLSAgICAgICAgU3RyaW5nW10gZXhjbHVkZXMgPSB7ICIqKi9SRUFETUUudHh0IiB9OwotCi0gICAgICAgIEFydGlmYWN0TW9jayBhcnRpZmFjdE1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtb2NrTWFuYWdlciwgImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCAiamFyIiwgZmFsc2UgKTsKLSAgICAgICAgYXJ0aWZhY3RNb2NrLnNldE5ld0ZpbGUoKTsKLQotICAgICAgICBtYWMuZXhwZWN0R2V0RGVzdEZpbGUoIG5ldyBGaWxlKCAianVuayIgKSApOwotICAgICAgICBtYWMuZXhwZWN0QWRkQXJjaGl2ZWRGaWxlU2V0KCk7Ci0gICAgICAgIG1hYy5leHBlY3RJbnRlcnBvbGF0b3JzKCk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgQWRkQXJ0aWZhY3RUYXNrIHRhc2sgPSBjcmVhdGVUYXNrKCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApOwotCi0gICAgICAgIHRhc2suc2V0VW5wYWNrKCB0cnVlICk7Ci0gICAgICAgIHRhc2suc2V0SW5jbHVkZXMoIEFycmF5cy5hc0xpc3QoIGluY2x1ZGVzICkgKTsKLSAgICAgICAgdGFzay5zZXRFeGNsdWRlcyggQXJyYXlzLmFzTGlzdCggZXhjbHVkZXMgKSApOwotCi0gICAgICAgIHRhc2suZXhlY3V0ZSggbWFjLmFyY2hpdmVyLCBtYWMuY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FkZERlcGVuZGVuY3lTZXRzVGFza1Rlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkRGVwZW5kZW5jeVNldHNUYXNrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2EyMTI2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkRGVwZW5kZW5jeVNldHNUYXNrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHMuQXJ0aWZhY3RNb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHMuTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2s7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LkFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0LlByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5jb25zb2xlLkNvbnNvbGVMb2dnZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1AU3VwcHJlc3NXYXJuaW5ncyggIk9jdGFsSW50ZWdlciIgKQotcHVibGljIGNsYXNzIEFkZERlcGVuZGVuY3lTZXRzVGFza1Rlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwcml2YXRlIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtb2NrTWFuYWdlciA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREZXBlbmRlbmN5U2V0X1Nob3VsZEludGVycG9sYXRlRGVmYXVsdE91dHB1dEZpbGVOYW1lTWFwcGluZygpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgb3V0RGlyID0gInRtcC8iOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWFpbkFpZCA9ICJtYWluIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIG1haW5HaWQgPSAib3JnLm1haW5ncnAiOwotICAgICAgICBmaW5hbCBTdHJpbmcgbWFpblZlciA9ICI5IjsKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlcEFpZCA9ICJkZXAiOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVwR2lkID0gIm9yZy5kZXBncnAiOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVwVmVyID0gIjEiOwotICAgICAgICBmaW5hbCBTdHJpbmcgZGVwRXh0ID0gIndhciI7Ci0KLSAgICAgICAgZmluYWwgRGVwZW5kZW5jeVNldCBkcyA9IG5ldyBEZXBlbmRlbmN5U2V0KCk7Ci0gICAgICAgIGRzLnNldE91dHB1dERpcmVjdG9yeSggb3V0RGlyICk7Ci0gICAgICAgIGRzLnNldERpcmVjdG9yeU1vZGUoIEludGVnZXIudG9TdHJpbmcoIDEwLCA4ICkgKTsKLSAgICAgICAgZHMuc2V0RmlsZU1vZGUoIEludGVnZXIudG9TdHJpbmcoIDEwLCA4ICkgKTsKLQotICAgICAgICBmaW5hbCBNb2RlbCBtYWluTW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbWFpbk1vZGVsLnNldEFydGlmYWN0SWQoIG1haW5BaWQgKTsKLSAgICAgICAgbWFpbk1vZGVsLnNldEdyb3VwSWQoIG1haW5HaWQgKTsKLSAgICAgICAgbWFpbk1vZGVsLnNldFZlcnNpb24oIG1haW5WZXIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbWFpblByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCBtYWluTW9kZWwgKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgbWFpbkFydGlmYWN0TW9jayA9IG5ldyBBcnRpZmFjdE1vY2soIG1vY2tNYW5hZ2VyLCBtYWluR2lkLCBtYWluQWlkLCBtYWluVmVyLCAiamFyIiwgZmFsc2UgKTsKLQotICAgICAgICBtYWluUHJvamVjdC5zZXRBcnRpZmFjdCggbWFpbkFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgZmluYWwgTW9kZWwgZGVwTW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgZGVwTW9kZWwuc2V0QXJ0aWZhY3RJZCggZGVwQWlkICk7Ci0gICAgICAgIGRlcE1vZGVsLnNldEdyb3VwSWQoIGRlcEdpZCApOwotICAgICAgICBkZXBNb2RlbC5zZXRWZXJzaW9uKCBkZXBWZXIgKTsKLSAgICAgICAgZGVwTW9kZWwuc2V0UGFja2FnaW5nKCBkZXBFeHQgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgZGVwUHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIGRlcE1vZGVsICk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RNb2NrIGRlcEFydGlmYWN0TW9jayA9IG5ldyBBcnRpZmFjdE1vY2soIG1vY2tNYW5hZ2VyLCBkZXBHaWQsIGRlcEFpZCwgZGVwVmVyLCBkZXBFeHQsIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBuZXdGaWxlID0gZGVwQXJ0aWZhY3RNb2NrLnNldE5ld0ZpbGUoKTsKLQotICAgICAgICBkZXBQcm9qZWN0LnNldEFydGlmYWN0KCBkZXBBcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrIG1hY1Rhc2sgPQotICAgICAgICAgICAgbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBtb2NrTWFuYWdlciwgbWFpblByb2plY3QgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEJ1aWxkRnJvbVJlcG9zaXRvcnkoIGRlcFByb2plY3QgKTsKLSAgICAgICAgbWFjVGFzay5leHBlY3RDU0dldEZpbmFsTmFtZSggbWFpbkFpZCArICItIiArIG1haW5WZXIgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdENTR2V0UmVwb3NpdG9yaWVzKCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXREZXN0RmlsZSggbmV3IEZpbGUoICJqdW5rIiApICk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0QWRkRmlsZSggbmV3RmlsZSwgb3V0RGlyICsgZGVwQWlkICsgIi0iICsgZGVwVmVyICsgIi4iICsgZGVwRXh0LCAxMCApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0U2Vzc2lvbiggbnVsbCApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldE1vZGUoIDAyMjIsIDAyMjIgKTsKLQotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApOwotCi0gICAgICAgIGZpbmFsIEFkZERlcGVuZGVuY3lTZXRzVGFzayB0YXNrID0KLSAgICAgICAgICAgIG5ldyBBZGREZXBlbmRlbmN5U2V0c1Rhc2soIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGRzICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGRlcEFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICksIGRlcFByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWNUYXNrLnByb2plY3RCdWlsZGVyLCBsb2dnZXIgKTsKLQotICAgICAgICB0YXNrLmFkZERlcGVuZGVuY3lTZXQoIGRzLCBtYWNUYXNrLmFyY2hpdmVyLCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREZXBlbmRlbmN5U2V0X1Nob3VsZE5vdEFkZERlcGVuZGVuY2llc1doZW5Qcm9qZWN0SGFzTm9uZSgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayBtYWNUYXNrID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBtb2NrTWFuYWdlciApOwotCi0gICAgICAgIGZpbmFsIERlcGVuZGVuY3lTZXQgZHMgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgICAgICBkcy5zZXRPdXRwdXREaXJlY3RvcnkoICIvb3V0IiApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKTsKLQotICAgICAgICBmaW5hbCBBZGREZXBlbmRlbmN5U2V0c1Rhc2sgdGFzayA9Ci0gICAgICAgICAgICBuZXcgQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCBkcyApLCBudWxsLCBwcm9qZWN0LCBtYWNUYXNrLnByb2plY3RCdWlsZGVyLCBsb2dnZXIgKTsKLQotICAgICAgICB0YXNrLmFkZERlcGVuZGVuY3lTZXQoIGRzLCBudWxsLCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIC8vIFRPRE86IEZpbmQgYSBiZXR0ZXIgd2F5IG9mIHRlc3RpbmcgdGhlIHByb2plY3Qtc3R1YmJpbmcgYmVoYXZpb3Igd2hlbiBhIFByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbiB0YWtlcyBwbGFjZS4KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRGVwZW5kZW5jeVNldF9TaG91bGROb3RBZGREZXBlbmRlbmNpZXNXaGVuUHJvamVjdElzU3R1YmJlZCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24sIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sCi0gICAgICAgIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICk7Ci0KLSAgICAgICAgZmluYWwgUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uIHBiZSA9IG5ldyBQcm9qZWN0QnVpbGRpbmdFeGNlcHRpb24oICJ0ZXN0IiwgIlRlc3QgZXJyb3IuIiApOwotCi0gICAgICAgIGZpbmFsIE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrIG1hY1Rhc2sgPQotICAgICAgICAgICAgbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBtb2NrTWFuYWdlciwgbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKSApOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBnaWQgPSAib3JnLnRlc3QiOwotICAgICAgICBmaW5hbCBTdHJpbmcgYWlkID0gInRlc3QtZGVwIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24gPSAiMi4wLVNOQVBTSE9UIjsKLSAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUgPSAiamFyIjsKLQotICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZSggImRlcC1hcnRpZmFjdC5qYXIiICk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RNb2NrIGRlcE1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtb2NrTWFuYWdlciwgZ2lkLCBhaWQsIHZlcnNpb24sIHR5cGUsIHRydWUgKTsKLSAgICAgICAgZGVwTW9jay5zZXRCYXNlVmVyc2lvbiggdmVyc2lvbiApOwotICAgICAgICBkZXBNb2NrLnNldEZpbGUoIGZpbGUgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGRlc3RGaWxlID0gbmV3IEZpbGUoICJhc3NlbWJseS1kZXAtc2V0LnppcCIgKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldERlc3RGaWxlKCBkZXN0RmlsZSApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEJ1aWxkRnJvbVJlcG9zaXRvcnkoIHBiZSApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdENTR2V0UmVwb3NpdG9yaWVzKCBudWxsLCBudWxsICk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0Q1NHZXRGaW5hbE5hbWUoICJmaW5hbC1uYW1lIiApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEFkZEZpbGUoIGZpbGUsICJvdXQvIiArIGFpZCArICItIiArIHZlcnNpb24gKyAiLiIgKyB0eXBlICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRNb2RlKCAwMjIyLCAwMjIyICk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0U2Vzc2lvbiggbnVsbCApOwotCi0gICAgICAgIGZpbmFsIERlcGVuZGVuY3lTZXQgZHMgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgICAgICBkcy5zZXRPdXRwdXREaXJlY3RvcnkoICIvb3V0IiApOwotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKTsKLQotICAgICAgICBmaW5hbCBBZGREZXBlbmRlbmN5U2V0c1Rhc2sgdGFzayA9Ci0gICAgICAgICAgICBuZXcgQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCBkcyApLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGRlcE1vY2suZ2V0QXJ0aWZhY3QoKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdCwgbWFjVGFzay5wcm9qZWN0QnVpbGRlciwgbG9nZ2VyICk7Ci0KLSAgICAgICAgdGFzay5hZGREZXBlbmRlbmN5U2V0KCBkcywgbWFjVGFzay5hcmNoaXZlciwgbWFjVGFzay5jb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRGVwZW5kZW5jeVNldF9TaG91bGRBZGRPbmVEZXBlbmRlbmN5RnJvbVByb2plY3RXaXRob3V0VW5wYWNraW5nKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKLSAgICAgICAgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU9uZURlcGVuZGVuY3lBZGRlZCggIm91dCIsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZERlcGVuZGVuY3lTZXRfU2hvdWxkQWRkT25lRGVwZW5kZW5jeUZyb21Qcm9qZWN0VW5wYWNrZWQoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T25lRGVwZW5kZW5jeUFkZGVkKCAib3V0IiwgdHJ1ZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlPbmVEZXBlbmRlbmN5QWRkZWQoIGZpbmFsIFN0cmluZyBvdXRwdXRMb2NhdGlvbiwgZmluYWwgYm9vbGVhbiB1bnBhY2sgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLCBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLAotICAgICAgICBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCBuZXcgTW9kZWwoKSApOwotCi0gICAgICAgIGZpbmFsIERlcGVuZGVuY3lTZXQgZHMgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgICAgICBkcy5zZXRPdXRwdXREaXJlY3RvcnkoIG91dHB1dExvY2F0aW9uICk7Ci0gICAgICAgIGRzLnNldE91dHB1dEZpbGVOYW1lTWFwcGluZyggImFydGlmYWN0IiApOwotICAgICAgICBkcy5zZXRVbnBhY2soIHVucGFjayApOwotICAgICAgICBkcy5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfQ09NUElMRSApOwotCi0gICAgICAgIGRzLnNldERpcmVjdG9yeU1vZGUoIEludGVnZXIudG9TdHJpbmcoIDEwLCA4ICkgKTsKLSAgICAgICAgZHMuc2V0RmlsZU1vZGUoIEludGVnZXIudG9TdHJpbmcoIDEwLCA4ICkgKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayBtYWNUYXNrID0KLSAgICAgICAgICAgIG5ldyBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayggbW9ja01hbmFnZXIsIG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICkgKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgYXJ0aWZhY3RNb2NrID0gbmV3IEFydGlmYWN0TW9jayggbW9ja01hbmFnZXIsICJncm91cCIsICJhcnRpZmFjdCIsICJ2ZXJzaW9uIiwgImphciIsIGZhbHNlICk7Ci0gICAgICAgIGZpbmFsIEZpbGUgYXJ0aWZhY3RGaWxlID0gYXJ0aWZhY3RNb2NrLnNldE5ld0ZpbGUoKTsKLQotICAgICAgICBpZiAoIHVucGFjayApCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1hY1Rhc2suZXhwZWN0QWRkQXJjaGl2ZWRGaWxlU2V0KCk7Ci0vLyAgICAgICAgICAgIG1hY1Rhc2suZXhwZWN0TW9kZUNoYW5nZSggLTEsIC0xLCAxMCwgMTAsIDIgKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1hY1Rhc2suZXhwZWN0QWRkRmlsZSggYXJ0aWZhY3RGaWxlLCBvdXRwdXRMb2NhdGlvbiArICIvYXJ0aWZhY3QiLCAxMCApOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXREZXN0RmlsZSggbmV3IEZpbGUoICJqdW5rIiApICk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0Q1NHZXRGaW5hbE5hbWUoICJmaW5hbC1uYW1lIiApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdENTR2V0UmVwb3NpdG9yaWVzKCBudWxsLCBudWxsICk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRTZXNzaW9uKCBudWxsICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IGRlcFByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCBuZXcgTW9kZWwoKSApOwotCi0gICAgICAgIG1hY1Rhc2suZXhwZWN0QnVpbGRGcm9tUmVwb3NpdG9yeSggZGVwUHJvamVjdCApOwotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldE1vZGUoIDAyMjIsIDAyMjIgKTsKLQotICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0KLSAgICAgICAgZmluYWwgQWRkRGVwZW5kZW5jeVNldHNUYXNrIHRhc2sgPQotICAgICAgICAgICAgbmV3IEFkZERlcGVuZGVuY3lTZXRzVGFzayggQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggZHMgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYXJ0aWZhY3RNb2NrLmdldEFydGlmYWN0KCkgKSwgcHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hY1Rhc2sucHJvamVjdEJ1aWxkZXIsIGxvZ2dlciApOwotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIHRhc2suYWRkRGVwZW5kZW5jeVNldCggZHMsIG1hY1Rhc2suYXJjaGl2ZXIsIG1hY1Rhc2suY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldERlcGVuZGVuY3lBcnRpZmFjdHNfU2hvdWxkR2V0T25lRGVwZW5kZW5jeUFydGlmYWN0KCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKTsKLQotICAgICAgICBmaW5hbCBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayBtYWNUYXNrID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBtb2NrTWFuYWdlciApOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhcnRpZmFjdE1vY2sgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtb2NrTWFuYWdlciwgImdyb3VwIiwgImFydGlmYWN0IiwgInZlcnNpb24iLCAiamFyIiwgZmFsc2UgKTsKLQotICAgICAgICBwcm9qZWN0LnNldEFydGlmYWN0cyggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApICk7Ci0KLSAgICAgICAgZmluYWwgRGVwZW5kZW5jeVNldCBkZXBlbmRlbmN5U2V0ID0gbmV3IERlcGVuZGVuY3lTZXQoKTsKLQotICAgICAgICBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgQWRkRGVwZW5kZW5jeVNldHNUYXNrIHRhc2sgPQotICAgICAgICAgICAgbmV3IEFkZERlcGVuZGVuY3lTZXRzVGFzayggQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggZGVwZW5kZW5jeVNldCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApLCBwcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjVGFzay5wcm9qZWN0QnVpbGRlciwgbG9nZ2VyICk7Ci0KLSAgICAgICAgZmluYWwgU2V0PEFydGlmYWN0PiByZXN1bHQgPSB0YXNrLnJlc29sdmVEZXBlbmRlbmN5QXJ0aWZhY3RzKCBkZXBlbmRlbmN5U2V0ICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggcmVzdWx0ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMSwgcmVzdWx0LnNpemUoKSApOwotICAgICAgICBhc3NlcnRTYW1lKCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSwgcmVzdWx0Lml0ZXJhdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwZW5kZW5jeUFydGlmYWN0c19TaG91bGRGaWx0ZXJPbmVEZXBlbmRlbmN5QXJ0aWZhY3RWaWFJbmNsdWRlKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKTsKLQotICAgICAgICBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IGFydGlmYWN0cyA9IG5ldyBIYXNoU2V0PEFydGlmYWN0PigpOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhbSA9IG5ldyBBcnRpZmFjdE1vY2soIG1vY2tNYW5hZ2VyLCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAiMS4wIiwgImphciIsIGZhbHNlICk7Ci0gICAgICAgIGFtLnNldERlcGVuZGVuY3lUcmFpbCggQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggcHJvamVjdC5nZXRJZCgpICkgKTsKLSAgICAgICAgYXJ0aWZhY3RzLmFkZCggYW0uZ2V0QXJ0aWZhY3QoKSApOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhbTIgPSBuZXcgQXJ0aWZhY3RNb2NrKCBtb2NrTWFuYWdlciwgImdyb3VwMiIsICJhcnRpZmFjdDIiLCAiMS4wIiwgImphciIsIGZhbHNlICk7Ci0gICAgICAgIGFtMi5zZXREZXBlbmRlbmN5VHJhaWwoIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIHByb2plY3QuZ2V0SWQoKSApICk7Ci0gICAgICAgIGFydGlmYWN0cy5hZGQoIGFtMi5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgZmluYWwgRGVwZW5kZW5jeVNldCBkZXBlbmRlbmN5U2V0ID0gbmV3IERlcGVuZGVuY3lTZXQoKTsKLQotICAgICAgICBkZXBlbmRlbmN5U2V0LmFkZEluY2x1ZGUoICJncm91cDphcnRpZmFjdCIgKTsKLSAgICAgICAgZGVwZW5kZW5jeVNldC5zZXRVc2VUcmFuc2l0aXZlRmlsdGVyaW5nKCB0cnVlICk7Ci0KLSAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEFkZERlcGVuZGVuY3lTZXRzVGFzayB0YXNrID0KLSAgICAgICAgICAgIG5ldyBBZGREZXBlbmRlbmN5U2V0c1Rhc2soIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGRlcGVuZGVuY3lTZXQgKSwgYXJ0aWZhY3RzLCBwcm9qZWN0LCBudWxsLCBsb2dnZXIgKTsKLQotICAgICAgICBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IHJlc3VsdCA9IHRhc2sucmVzb2x2ZURlcGVuZGVuY3lBcnRpZmFjdHMoIGRlcGVuZGVuY3lTZXQgKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCByZXN1bHQgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCByZXN1bHQuc2l6ZSgpICk7Ci0gICAgICAgIGFzc2VydFNhbWUoIGFtLmdldEFydGlmYWN0KCksIHJlc3VsdC5pdGVyYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVwZW5kZW5jeUFydGlmYWN0c19TaG91bGRJZ25vcmVUcmFuc2l0aXZlUGF0aEZpbHRlcmluZ1doZW5JbmNsdWRlTm90VHJhbnNpdGl2ZSgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICk7Ci0KLSAgICAgICAgZmluYWwgU2V0PEFydGlmYWN0PiBhcnRpZmFjdHMgPSBuZXcgSGFzaFNldDxBcnRpZmFjdD4oKTsKLQotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2sgYW0gPSBuZXcgQXJ0aWZhY3RNb2NrKCBtb2NrTWFuYWdlciwgImdyb3VwIiwgImFydGlmYWN0IiwgIjEuMCIsICJqYXIiLCBmYWxzZSApOwotICAgICAgICBhcnRpZmFjdHMuYWRkKCBhbS5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RNb2NrIGFtMiA9IG5ldyBBcnRpZmFjdE1vY2soIG1vY2tNYW5hZ2VyLCAiZ3JvdXAyIiwgImFydGlmYWN0MiIsICIxLjAiLCAiamFyIiwgZmFsc2UgKTsKLSAgICAgICAgYXJ0aWZhY3RzLmFkZCggYW0yLmdldEFydGlmYWN0KCkgKTsKLQotICAgICAgICBmaW5hbCBEZXBlbmRlbmN5U2V0IGRlcGVuZGVuY3lTZXQgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotCi0gICAgICAgIGRlcGVuZGVuY3lTZXQuYWRkSW5jbHVkZSggImdyb3VwOmFydGlmYWN0IiApOwotICAgICAgICBkZXBlbmRlbmN5U2V0LnNldFVzZVRyYW5zaXRpdmVGaWx0ZXJpbmcoIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEFkZERlcGVuZGVuY3lTZXRzVGFzayB0YXNrID0KLSAgICAgICAgICAgIG5ldyBBZGREZXBlbmRlbmN5U2V0c1Rhc2soIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGRlcGVuZGVuY3lTZXQgKSwgYXJ0aWZhY3RzLCBwcm9qZWN0LCBudWxsLCBsb2dnZXIgKTsKLQotICAgICAgICBmaW5hbCBTZXQ8QXJ0aWZhY3Q+IHJlc3VsdCA9IHRhc2sucmVzb2x2ZURlcGVuZGVuY3lBcnRpZmFjdHMoIGRlcGVuZGVuY3lTZXQgKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCByZXN1bHQgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCByZXN1bHQuc2l6ZSgpICk7Ci0gICAgICAgIGFzc2VydFNhbWUoIGFtLmdldEFydGlmYWN0KCksIHJlc3VsdC5pdGVyYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkRGlyZWN0b3J5VGFza1Rlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkRGlyZWN0b3J5VGFza1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZmYTFkNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FkZERpcmVjdG9yeVRhc2tUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLnRhc2s7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0dXRpbHMuVGVzdEZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrU3VwcG9ydDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suYW55T2JqZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotCi1wdWJsaWMgY2xhc3MgQWRkRGlyZWN0b3J5VGFza1Rlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwcml2YXRlIEVhc3lNb2NrU3VwcG9ydCBtb2NrTWFuYWdlcjsKLQotICAgIHByaXZhdGUgVGVzdEZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBBcmNoaXZlciBhcmNoaXZlcjsKLQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKQotICAgIHsKLSAgICAgICAgZmlsZU1hbmFnZXIgPSBuZXcgVGVzdEZpbGVNYW5hZ2VyKCAiQXJjaGl2ZUFzc2VtYmx5VXRpbHMudGVzdC4iLCAiIiApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0KLSAgICAgICAgYXJjaGl2ZXIgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKEFyY2hpdmVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmlsZU1hbmFnZXIuY2xlYW5VcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGREaXJlY3RvcnlfU2hvdWxkTm90QWRkRGlyZWN0b3J5SWZOb25FeGlzdGVudCgpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgZGlyID0gbmV3IEZpbGUoIFN5c3RlbS5nZXRQcm9wZXJ0eSggImphdmEuaW8udG1wZGlyIiApLCAibm9uLWV4aXN0ZW50LiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSApOwotCi0gICAgICAgIGNvbmZpZ3VyZU1vZGVFeHBlY3RhdGlvbnMoIC0xLCAtMSwgLTEsIC0xLCBmYWxzZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIEFkZERpcmVjdG9yeVRhc2sgdGFzayA9IG5ldyBBZGREaXJlY3RvcnlUYXNrKCBkaXIgKTsKLQotICAgICAgICB0YXNrLmV4ZWN1dGUoIGFyY2hpdmVyICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZERpcmVjdG9yeV9TaG91bGRBZGREaXJlY3RvcnkoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIGRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZVNldCggKEZpbGVTZXQpIGFueU9iamVjdCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCggIlNob3VsZCBuZXZlciBoYXBwZW4uIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uZmlndXJlTW9kZUV4cGVjdGF0aW9ucyggLTEsIC0xLCAtMSwgLTEsIGZhbHNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgQWRkRGlyZWN0b3J5VGFzayB0YXNrID0gbmV3IEFkZERpcmVjdG9yeVRhc2soIGRpciApOwotCi0gICAgICAgIHRhc2suc2V0T3V0cHV0RGlyZWN0b3J5KCAiZGlyIiApOwotCi0gICAgICAgIHRhc2suZXhlY3V0ZSggYXJjaGl2ZXIgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkRGlyZWN0b3J5X1Nob3VsZEFkZERpcmVjdG9yeVdpdGhEaXJNb2RlKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgRmlsZSBkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyLmFkZEZpbGVTZXQoIChGaWxlU2V0KSBhbnlPYmplY3QoKSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggQXJjaGl2ZXJFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoICJTaG91bGQgbmV2ZXIgaGFwcGVuLiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBkaXJNb2RlID0gSW50ZWdlci5wYXJzZUludCggIjc3NyIsIDggKTsKLSAgICAgICAgaW50IGZpbGVNb2RlID0gSW50ZWdlci5wYXJzZUludCggIjc3NyIsIDggKTsKLQotICAgICAgICBjb25maWd1cmVNb2RlRXhwZWN0YXRpb25zKCAtMSwgLTEsIGRpck1vZGUsIGZpbGVNb2RlLCB0cnVlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgQWRkRGlyZWN0b3J5VGFzayB0YXNrID0gbmV3IEFkZERpcmVjdG9yeVRhc2soIGRpciApOwotCi0gICAgICAgIHRhc2suc2V0RGlyZWN0b3J5TW9kZSggZGlyTW9kZSApOwotICAgICAgICB0YXNrLnNldEZpbGVNb2RlKCBmaWxlTW9kZSApOwotICAgICAgICB0YXNrLnNldE91dHB1dERpcmVjdG9yeSggImRpciIgKTsKLQotICAgICAgICB0YXNrLmV4ZWN1dGUoIGFyY2hpdmVyICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZERpcmVjdG9yeV9TaG91bGRBZGREaXJlY3RvcnlXaXRoSW5jbHVkZXNBbmRFeGNsdWRlcygpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIEZpbGUgZGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlci5hZGRGaWxlU2V0KCAoRmlsZVNldCkgYW55T2JqZWN0KCkgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmYWlsKCAiU2hvdWxkIG5ldmVyIGhhcHBlbi4iICk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25maWd1cmVNb2RlRXhwZWN0YXRpb25zKCAtMSwgLTEsIC0xLCAtMSwgZmFsc2UgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBBZGREaXJlY3RvcnlUYXNrIHRhc2sgPSBuZXcgQWRkRGlyZWN0b3J5VGFzayggZGlyICk7Ci0KLSAgICAgICAgdGFzay5zZXRJbmNsdWRlcyggQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggIioqLyoudHh0IiApICk7Ci0gICAgICAgIHRhc2suc2V0RXhjbHVkZXMoIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoICIqKi9SRUFETUUudHh0IiApICk7Ci0gICAgICAgIHRhc2suc2V0T3V0cHV0RGlyZWN0b3J5KCAiZGlyIiApOwotCi0gICAgICAgIHRhc2suZXhlY3V0ZSggYXJjaGl2ZXIgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29uZmlndXJlTW9kZUV4cGVjdGF0aW9ucyggaW50IGRlZmF1bHREaXJNb2RlLCBpbnQgZGVmYXVsdEZpbGVNb2RlLCBpbnQgZGlyTW9kZSwgaW50IGZpbGVNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGV4cGVjdFR3b1NldHMgKQotICAgIHsKLSAgICAgICAgZXhwZWN0KGFyY2hpdmVyLmdldE92ZXJyaWRlRGlyZWN0b3J5TW9kZSgpKS5hbmRSZXR1cm4oIGRlZmF1bHREaXJNb2RlICk7Ci0gICAgICAgIGV4cGVjdChhcmNoaXZlci5nZXRPdmVycmlkZUZpbGVNb2RlKCkpLmFuZFJldHVybiggZGVmYXVsdEZpbGVNb2RlICk7Ci0KLSAgICAgICAgaWYgKCBleHBlY3RUd29TZXRzICkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCBkaXJNb2RlID4gLTEgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFyY2hpdmVyLnNldERpcmVjdG9yeU1vZGUoIGRpck1vZGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKCBmaWxlTW9kZSA+IC0xICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcmNoaXZlci5zZXRGaWxlTW9kZSggZmlsZU1vZGUgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZGlyTW9kZSA+IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RGlyZWN0b3J5TW9kZSggZGVmYXVsdERpck1vZGUgKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCBmaWxlTW9kZSA+IC0xICkKLSAgICAgICAgewotICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RmlsZU1vZGUoIGRlZmF1bHRGaWxlTW9kZSApOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL0FkZEZpbGVTZXRzVGFza1Rlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkRmlsZVNldHNUYXNrVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWI2NDY2Li4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svQWRkRmlsZVNldHNUYXNrVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg0ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5BcmNoaXZlQ3JlYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5EZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrLnRlc3R1dGlscy5Nb2NrQW5kQ29udHJvbEZvckFkZEZpbGVTZXRzVGFzazsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQuQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdHV0aWxzLlRlc3RGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLmNvbnNvbGUuQ29uc29sZUxvZ2dlcjsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci0KLUBTdXBwcmVzc1dhcm5pbmdzKCJSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkIikKLXB1YmxpYyBjbGFzcyBBZGRGaWxlU2V0c1Rhc2tUZXN0Ci0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gICAgcHJpdmF0ZSBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXI7Ci0KLSAgICBwcml2YXRlIFRlc3RGaWxlTWFuYWdlciBmaWxlTWFuYWdlcjsKLQotICAgIHByaXZhdGUgTW9ja0FuZENvbnRyb2xGb3JBZGRGaWxlU2V0c1Rhc2sgbWFjVGFzazsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkKLSAgICB7Ci0gICAgICAgIG1vY2tNYW5hZ2VyID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbGVNYW5hZ2VyID0gbmV3IFRlc3RGaWxlTWFuYWdlciggImFkZC1maWxlc2V0LnRlc3QuIiwgIiIgKTsKLQotICAgICAgICBtYWNUYXNrID0gbmV3IE1vY2tBbmRDb250cm9sRm9yQWRkRmlsZVNldHNUYXNrKCBtb2NrTWFuYWdlciwgZmlsZU1hbmFnZXIgKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmlsZU1hbmFnZXIuY2xlYW5VcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWxlU2V0RGlyZWN0b3J5X1Nob3VsZFJldHVybkFic29sdXRlU291cmNlRGlyKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBmaW5hbCBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKLQotICAgICAgICBmcy5zZXREaXJlY3RvcnkoIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgcmVzdWx0ID0gbmV3IEFkZEZpbGVTZXRzVGFzayggbmV3IEFycmF5TGlzdDxGaWxlU2V0PigpICkuZ2V0RmlsZVNldERpcmVjdG9yeSggZnMsIG51bGwsIG51bGwgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGRpci5nZXRBYnNvbHV0ZVBhdGgoKSwgcmVzdWx0LmdldEFic29sdXRlUGF0aCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEZpbGVTZXREaXJlY3RvcnlfU2hvdWxkUmV0dXJuQmFzZWRpcigpCi0gICAgICAgIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSByZXN1bHQgPSBuZXcgQWRkRmlsZVNldHNUYXNrKCBuZXcgQXJyYXlMaXN0PEZpbGVTZXQ+KCkgKS5nZXRGaWxlU2V0RGlyZWN0b3J5KCBmcywgZGlyLCBudWxsICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBkaXIuZ2V0QWJzb2x1dGVQYXRoKCksIHJlc3VsdC5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWxlU2V0RGlyZWN0b3J5X1Nob3VsZFJldHVybkRpckZyb21CYXNlZGlyQW5kU291cmNlRGlyKCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgc3JjUGF0aCA9ICJzb3VyY2UiOwotCi0gICAgICAgIGZpbmFsIEZpbGUgc3JjRGlyID0gbmV3IEZpbGUoIGRpciwgc3JjUGF0aCApOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotCi0gICAgICAgIGZzLnNldERpcmVjdG9yeSggc3JjUGF0aCApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgcmVzdWx0ID0gbmV3IEFkZEZpbGVTZXRzVGFzayggbmV3IEFycmF5TGlzdDxGaWxlU2V0PigpICkuZ2V0RmlsZVNldERpcmVjdG9yeSggZnMsIGRpciwgbnVsbCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggc3JjRGlyLmdldEFic29sdXRlUGF0aCgpLCByZXN1bHQuZ2V0QWJzb2x1dGVQYXRoKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmlsZVNldERpcmVjdG9yeV9TaG91bGRSZXR1cm5EaXJGcm9tQXJjaGl2ZUJhc2VkaXJBbmRTb3VyY2VEaXIoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGUgZGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBzcmNQYXRoID0gInNvdXJjZSI7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBzcmNEaXIgPSBuZXcgRmlsZSggZGlyLCBzcmNQYXRoICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0KLSAgICAgICAgZnMuc2V0RGlyZWN0b3J5KCBzcmNQYXRoICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSByZXN1bHQgPSBuZXcgQWRkRmlsZVNldHNUYXNrKCBuZXcgQXJyYXlMaXN0PEZpbGVTZXQ+KCkgKS5nZXRGaWxlU2V0RGlyZWN0b3J5KCBmcywgbnVsbCwgZGlyICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBzcmNEaXIuZ2V0QWJzb2x1dGVQYXRoKCksIHJlc3VsdC5nZXRBYnNvbHV0ZVBhdGgoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRGaWxlU2V0X1Nob3VsZEFkZERpcmVjdG9yeSgpIHRocm93cyBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGRpcm5hbWUgPSAiZGlyIjsKLQotICAgICAgICBmcy5zZXREaXJlY3RvcnkoIGRpcm5hbWUgKTsKLSAgICAgICAgZnMuc2V0T3V0cHV0RGlyZWN0b3J5KCAiZGlyMiIgKTsKLQotICAgICAgICAvLyBlbnN1cmUgdGhpcyBleGlzdHMsIHNvIHRoZSBkaXJlY3RvcnkgYWRkaXRpb24gd2lsbCBwcm9jZWVkLgotICAgICAgICBmaW5hbCBGaWxlIHNyY0RpciA9IG5ldyBGaWxlKCBtYWNUYXNrLmFyY2hpdmVCYXNlRGlyLCBkaXJuYW1lICk7Ci0gICAgICAgIHNyY0Rpci5ta2RpcnMoKTsKLQotICAgICAgICBmaW5hbCBpbnRbXSBtb2RlcyA9IHsgLTEsIC0xLCAtMSwgLTEgfTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEFkZGl0aW9uT2ZTaW5nbGVGaWxlU2V0KCBudWxsLCBudWxsLCB0cnVlLCBtb2RlcywgMSwgdHJ1ZSwgZmFsc2UgKTsKLQotLy8gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0UHJvamVjdCggbnVsbCApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKTsKLQotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBBZGRGaWxlU2V0c1Rhc2sgdGFzayA9IG5ldyBBZGRGaWxlU2V0c1Rhc2soIG5ldyBBcnJheUxpc3Q8RmlsZVNldD4oKSApOwotCi0gICAgICAgIHRhc2suc2V0TG9nZ2VyKCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApOwotICAgICAgICB0YXNrLnNldFByb2plY3QoIHByb2plY3QgKTsKLQotICAgICAgICB0YXNrLmFkZEZpbGVTZXQoIGZzLCBtYWNUYXNrLmFyY2hpdmVyLCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSwgbWFjVGFzay5hcmNoaXZlQmFzZURpciApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRGaWxlU2V0X1Nob3VsZEFkZERpcmVjdG9yeVVzaW5nU291cmNlRGlyTmFtZUZvckRlc3REaXIoKQotICAgICAgICB0aHJvd3MgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBkaXJuYW1lID0gImRpciI7Ci0KLSAgICAgICAgZnMuc2V0RGlyZWN0b3J5KCBkaXJuYW1lICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBhcmNoaXZlQmFzZURpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICAvLyBlbnN1cmUgdGhpcyBleGlzdHMsIHNvIHRoZSBkaXJlY3RvcnkgYWRkaXRpb24gd2lsbCBwcm9jZWVkLgotICAgICAgICBmaW5hbCBGaWxlIHNyY0RpciA9IG5ldyBGaWxlKCBhcmNoaXZlQmFzZURpciwgZGlybmFtZSApOwotICAgICAgICBzcmNEaXIubWtkaXJzKCk7Ci0KLSAgICAgICAgZmluYWwgaW50W10gbW9kZXMgPSB7IC0xLCAtMSwgLTEsIC0xIH07Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RBZGRpdGlvbk9mU2luZ2xlRmlsZVNldCggbnVsbCwgbnVsbCwgdHJ1ZSwgbW9kZXMsIDEsIHRydWUsIGZhbHNlICk7Ci0KLSAgICAgICAgLy9tYWNUYXNrLmV4cGVjdEdldFByb2plY3QoIG51bGwgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICk7Ci0gICAgICAgIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5zZXR1cEludGVycG9sYXRvcnMoIG1hY1Rhc2suY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgQWRkRmlsZVNldHNUYXNrIHRhc2sgPSBuZXcgQWRkRmlsZVNldHNUYXNrKCBuZXcgQXJyYXlMaXN0PEZpbGVTZXQ+KCkgKTsKLQotICAgICAgICB0YXNrLnNldExvZ2dlciggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKTsKLSAgICAgICAgdGFzay5zZXRQcm9qZWN0KCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgdGFzay5hZGRGaWxlU2V0KCBmcywgbWFjVGFzay5hcmNoaXZlciwgbWFjVGFzay5jb25maWdTb3VyY2UsIGFyY2hpdmVCYXNlRGlyICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZEZpbGVTZXRfU2hvdWxkTm90QWRkRGlyZWN0b3J5V2hlblNvdXJjZURpck5vbkV4aXN0ZW50KCkKLSAgICAgICAgdGhyb3dzIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiwgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgZGlybmFtZSA9ICJkaXIiOwotCi0gICAgICAgIGZzLnNldERpcmVjdG9yeSggZGlybmFtZSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYXJjaGl2ZUJhc2VEaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgbWFjVGFzay5leHBlY3RHZXRGaW5hbE5hbWUoICJmaW5hbE5hbWUiICk7Ci0KLSAgICAgICAgLy9tYWNUYXNrLmV4cGVjdEdldFByb2plY3QoIG51bGwgKTsKLQotICAgICAgICBleHBlY3QobWFjVGFzay5hcmNoaXZlci5nZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKSkuYW5kUmV0dXJuKCAtMSApOwotICAgICAgICBleHBlY3QobWFjVGFzay5hcmNoaXZlci5nZXRPdmVycmlkZUZpbGVNb2RlKCkpLmFuZFJldHVybiggLTEgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICk7Ci0gICAgICAgIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5zZXR1cEludGVycG9sYXRvcnMoIG1hY1Rhc2suY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgQWRkRmlsZVNldHNUYXNrIHRhc2sgPSBuZXcgQWRkRmlsZVNldHNUYXNrKCBuZXcgQXJyYXlMaXN0PEZpbGVTZXQ+KCkgKTsKLQotICAgICAgICB0YXNrLnNldExvZ2dlciggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKTsKLSAgICAgICAgdGFzay5zZXRQcm9qZWN0KCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgdGFzay5hZGRGaWxlU2V0KCBmcywgbWFjVGFzay5hcmNoaXZlciwgbWFjVGFzay5jb25maWdTb3VyY2UsIGFyY2hpdmVCYXNlRGlyICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV4ZWN1dGVfU2hvdWxkVGhyb3dFeGNlcHRpb25JZkFyY2hpdmVCYXNlZGlyUHJvdmlkZWRJc05vbkV4aXN0ZW50KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgbWFjVGFzay5hcmNoaXZlQmFzZURpci5kZWxldGUoKTsKLQotICAgICAgICBtYWNUYXNrLmV4cGVjdEdldEFyY2hpdmVCYXNlRGlyZWN0b3J5KCk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgQWRkRmlsZVNldHNUYXNrIHRhc2sgPSBuZXcgQWRkRmlsZVNldHNUYXNrKCBuZXcgQXJyYXlMaXN0PEZpbGVTZXQ+KCkgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgdGFzay5leGVjdXRlKCBtYWNUYXNrLmFyY2hpdmVyLCBtYWNUYXNrLmNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgICAgICBmYWlsKCAiU2hvdWxkIHRocm93IGV4Y2VwdGlvbiBkdWUgdG8gbm9uLWV4aXN0ZW50IGFyY2hpdmVCYXNlZGlyIGxvY2F0aW9uIHRoYXQgd2FzIHByb3ZpZGVkLiIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2hvdWxkIGRvIHRoaXMsIGJlY2F1c2UgaXQgY2Fubm90IHVzZSB0aGUgcHJvdmlkZSBhcmNoaXZlQmFzZWRpci4KLSAgICAgICAgfQotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRlX1Nob3VsZFRocm93RXhjZXB0aW9uSWZBcmNoaXZlQmFzZWRpclByb3ZpZGVkSXNOb3RBRGlyZWN0b3J5KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICB7Ci0KLSAgICAgICAgbWFjVGFzay5hcmNoaXZlQmFzZURpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBGaWxlKCk7Ci0gICAgICAgIG1hY1Rhc2suZXhwZWN0R2V0QXJjaGl2ZUJhc2VEaXJlY3RvcnkoKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBBZGRGaWxlU2V0c1Rhc2sgdGFzayA9IG5ldyBBZGRGaWxlU2V0c1Rhc2soIG5ldyBBcnJheUxpc3Q8RmlsZVNldD4oKSApOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB0YXNrLmV4ZWN1dGUoIG1hY1Rhc2suYXJjaGl2ZXIsIG1hY1Rhc2suY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgICAgIGZhaWwoICJTaG91bGQgdGhyb3cgZXhjZXB0aW9uIGR1ZSB0byBub24tZGlyZWN0b3J5IGFyY2hpdmVCYXNlZGlyIGxvY2F0aW9uIHRoYXQgd2FzIHByb3ZpZGVkLiIgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEFyY2hpdmVDcmVhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gc2hvdWxkIGRvIHRoaXMsIGJlY2F1c2UgaXQgY2Fubm90IHVzZSB0aGUgcHJvdmlkZSBhcmNoaXZlQmFzZWRpci4KLSAgICAgICAgfQotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay90ZXN0dXRpbHMvQXJ0aWZhY3RNb2NrLmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL3Rlc3R1dGlscy9BcnRpZmFjdE1vY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ2MDA1MS4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL3Rlc3R1dGlscy9BcnRpZmFjdE1vY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHM7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5oYW5kbGVyLkFydGlmYWN0SGFuZGxlcjsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci0KLXB1YmxpYyBjbGFzcyBBcnRpZmFjdE1vY2sKLXsKLQotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnRpZmFjdCBhcnRpZmFjdDsKLQotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnRpZmFjdEhhbmRsZXIgaGFuZGxlcjsKLQotICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwSWQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBhcnRpZmFjdElkOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYmFzZVZlcnNpb247Ci0KLSAgICBwcml2YXRlIEZpbGUgZmlsZTsKLQotICAgIHByaXZhdGUgQm9vbGVhbiBpc1NuYXBzaG90OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdmVyc2lvbjsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlcGVuZGVuY3lUcmFpbDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgZGVwZW5kZW5jeUNvbmZsaWN0SWQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlQW5kRXh0OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NpZmllcjsKLQotICAgIHB1YmxpYyBBcnRpZmFjdE1vY2soIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtb2NrTWFuYWdlciwgZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uLCBmaW5hbCBTdHJpbmcgdHlwZSwgZmluYWwgYm9vbGVhbiBpc1NuYXBzaG90ICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIG1vY2tNYW5hZ2VyLCBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uLCB0eXBlLCBudWxsLCBpc1NuYXBzaG90LCBudWxsLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIEFydGlmYWN0TW9jayggZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1vY2tNYW5hZ2VyLCBmaW5hbCBTdHJpbmcgZ3JvdXBJZCwgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24sIGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBib29sZWFuIGlzU25hcHNob3QsIGZpbmFsIFN0cmluZyBiYXNlVmVyc2lvbiApCi0gICAgewotICAgICAgICB0aGlzKCBtb2NrTWFuYWdlciwgZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgdmVyc2lvbiwgdHlwZSwgbnVsbCwgaXNTbmFwc2hvdCwgYmFzZVZlcnNpb24sIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJ0aWZhY3RNb2NrKCBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIsIGZpbmFsIFN0cmluZyBncm91cElkLCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIFN0cmluZyBjbGFzc2lmaWVyLCBmaW5hbCBib29sZWFuIGlzU25hcHNob3QgKQotICAgIHsKLSAgICAgICAgdGhpcyggbW9ja01hbmFnZXIsIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHR5cGUsIGNsYXNzaWZpZXIsIGlzU25hcHNob3QsIG51bGwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXJ0aWZhY3RNb2NrKCBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIsIGZpbmFsIFN0cmluZyBncm91cElkLCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIFN0cmluZyBjbGFzc2lmaWVyLCBmaW5hbCBib29sZWFuIGlzU25hcHNob3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJhc2VWZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIG1vY2tNYW5hZ2VyLCBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uLCB0eXBlLCBjbGFzc2lmaWVyLCBpc1NuYXBzaG90LCBiYXNlVmVyc2lvbiwgbnVsbCApOwotICAgIH0KLQotICAgIHByaXZhdGUgQXJ0aWZhY3RNb2NrKCBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIsIGZpbmFsIFN0cmluZyBncm91cElkLCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24sIGZpbmFsIFN0cmluZyB0eXBlLCBmaW5hbCBTdHJpbmcgY2xhc3NpZmllciwgZmluYWwgYm9vbGVhbiBpc1NuYXBzaG90LAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZVZlcnNpb24sIFN0cmluZyBzY29wZSApCi0gICAgewotCi0gICAgICAgIGFydGlmYWN0ID0gbW9ja01hbmFnZXIuY3JlYXRlTW9jayggQXJ0aWZhY3QuY2xhc3MgKTsKLQotICAgICAgICBpZiAoIHNjb3BlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBzY29wZSA9IEFydGlmYWN0LlNDT1BFX0NPTVBJTEU7Ci0gICAgICAgIH0KLQotICAgICAgICBleHBlY3QoIGFydGlmYWN0LmdldFNjb3BlKCkpLmFuZFJldHVybiggc2NvcGUgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGhhbmRsZXIgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKCBBcnRpZmFjdEhhbmRsZXIuY2xhc3MgKTsKLQotICAgICAgICBleHBlY3QoYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RIYW5kbGVyKCkpLmFuZFJldHVybiggaGFuZGxlciApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgdGhpcy5jbGFzc2lmaWVyID0gY2xhc3NpZmllcjsKLSAgICAgICAgZXhwZWN0KGFydGlmYWN0LmdldENsYXNzaWZpZXIoKSkuYW5kUmV0dXJuKCBjbGFzc2lmaWVyICkuYW55VGltZXMoKTsKLQotICAgICAgICBzZXRTbmFwc2hvdCggaXNTbmFwc2hvdCApOwotICAgICAgICBzZXRHcm91cElkKCBncm91cElkICk7Ci0gICAgICAgIHNldEFydGlmYWN0SWQoIGFydGlmYWN0SWQgKTsKLSAgICAgICAgc2V0VmVyc2lvbiggdmVyc2lvbiApOwotICAgICAgICBzZXRCYXNlVmVyc2lvbiggYmFzZVZlcnNpb24gKTsKLSAgICAgICAgc2V0VHlwZSggdHlwZSApOwotCi0gICAgICAgIHNldElkKCk7Ci0gICAgICAgIHNldERlcGVuZGVuY3lDb25mbGljdElkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXh0ZW5zaW9uKCBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uICkKLSAgICB7Ci0gICAgICAgIHNldFR5cGVBbmRFeHQoIGV4dGVuc2lvbiApOwotICAgIH0KLQotICAgIHB1YmxpYyBBcnRpZmFjdCBnZXRBcnRpZmFjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gYXJ0aWZhY3Q7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRBcnRpZmFjdElkKCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCApCi0gICAgewotICAgICAgICBpZiAoICggYXJ0aWZhY3RJZCAhPSBudWxsICkgJiYgKCB0aGlzLmFydGlmYWN0SWQgPT0gbnVsbCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KGFydGlmYWN0LmdldEFydGlmYWN0SWQoKSkuYW5kUmV0dXJuKCBhcnRpZmFjdElkICkuYW55VGltZXMoKTsKLSAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RJZCA9IGFydGlmYWN0SWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRCYXNlVmVyc2lvbiggZmluYWwgU3RyaW5nIGJhc2VWZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGlmICggKCBiYXNlVmVyc2lvbiAhPSBudWxsICkgJiYgKCB0aGlzLmJhc2VWZXJzaW9uID09IG51bGwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdChhcnRpZmFjdC5nZXRCYXNlVmVyc2lvbigpKS5hbmRSZXR1cm4oIGJhc2VWZXJzaW9uICkuYW55VGltZXMoKTsKLQotICAgICAgICAgICAgdGhpcy5iYXNlVmVyc2lvbiA9IGJhc2VWZXJzaW9uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmlsZSggZmluYWwgRmlsZSBkZXN0aW5hdGlvbiApCi0gICAgewotICAgICAgICBpZiAoICggZGVzdGluYXRpb24gIT0gbnVsbCApICYmICggZmlsZSA9PSBudWxsICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoYXJ0aWZhY3QuZ2V0RmlsZSgpKS5hbmRSZXR1cm4oIGRlc3RpbmF0aW9uICkuYW55VGltZXMoKTsKLSAgICAgICAgICAgIGZpbGUgPSBkZXN0aW5hdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0R3JvdXBJZCggZmluYWwgU3RyaW5nIGdyb3VwSWQgKQotICAgIHsKLSAgICAgICAgaWYgKCAoIGdyb3VwSWQgIT0gbnVsbCApICYmICggdGhpcy5ncm91cElkID09IG51bGwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdChhcnRpZmFjdC5nZXRHcm91cElkKCkpLmFuZFJldHVybiggZ3JvdXBJZCApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgICAgIHRoaXMuZ3JvdXBJZCA9IGdyb3VwSWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldFZlcnNpb24oIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGlmICggKCB2ZXJzaW9uICE9IG51bGwgKSAmJiAoIHRoaXMudmVyc2lvbiA9PSBudWxsICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoYXJ0aWZhY3QuZ2V0VmVyc2lvbigpKS5hbmRSZXR1cm4oIHZlcnNpb24gKS5hbnlUaW1lcygpOwotCi0gICAgICAgICAgICB0aGlzLnZlcnNpb24gPSB2ZXJzaW9uOwotCi0gICAgICAgICAgICBpZiAoIGlzU25hcHNob3QgIT0gQm9vbGVhbi5UUlVFICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZXRCYXNlVmVyc2lvbiggdmVyc2lvbiApOwotICAgICAgICAgICAgICAgIHNldFNuYXBzaG90KCBmYWxzZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVwZW5kZW5jeVRyYWlsKCBmaW5hbCBMaXN0PFN0cmluZz4gZGVwZW5kZW5jeVRyYWlsICkKLSAgICB7Ci0gICAgICAgIGlmICggKCBkZXBlbmRlbmN5VHJhaWwgIT0gbnVsbCApICYmICggdGhpcy5kZXBlbmRlbmN5VHJhaWwgPT0gbnVsbCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KGFydGlmYWN0LmdldERlcGVuZGVuY3lUcmFpbCgpKS5hbmRSZXR1cm4oIGRlcGVuZGVuY3lUcmFpbCApLmFueVRpbWVzKCk7Ci0gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lUcmFpbCA9IGRlcGVuZGVuY3lUcmFpbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0SWQoIGZpbmFsIFN0cmluZyBpZCApCi0gICAgewotICAgICAgICBpZiAoICggaWQgIT0gbnVsbCApICYmICggdGhpcy5pZCA9PSBudWxsICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoYXJ0aWZhY3QuZ2V0SWQoKSkuYW5kUmV0dXJuKCBpZCApLmFueVRpbWVzKCk7Ci0gICAgICAgICAgICB0aGlzLmlkID0gaWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHNldERlcGVuZGVuY3lDb25mbGljdElkKCBmaW5hbCBTdHJpbmcgaWQgKQotICAgIHsKLSAgICAgICAgaWYgKCAoIGlkICE9IG51bGwgKSAmJiAoIGRlcGVuZGVuY3lDb25mbGljdElkID09IG51bGwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgZXhwZWN0KCBhcnRpZmFjdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpKS5hbmRSZXR1cm4oIGlkICkuYW55VGltZXMoKTsKLQotICAgICAgICAgICAgZGVwZW5kZW5jeUNvbmZsaWN0SWQgPSBpZDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0U25hcHNob3QoIGZpbmFsIGJvb2xlYW4gc25hcHNob3QgKQotICAgIHsKLSAgICAgICAgaWYgKCBpc1NuYXBzaG90ID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgIGV4cGVjdChhcnRpZmFjdC5pc1NuYXBzaG90KCkpLmFuZFJldHVybiggc25hcHNob3QgKS5hbnlUaW1lcygpOwotICAgICAgICAgICAgaXNTbmFwc2hvdCA9IHNuYXBzaG90OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgc2V0TmV3RmlsZSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCBmaWxlID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIG5ld0ZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCAiQXJ0aWZhY3RNb2NrLnRlc3QuIiwgIiIgKTsKLSAgICAgICAgICAgIG5ld0ZpbGUuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgICAgICBleHBlY3QoIGFydGlmYWN0LmdldEZpbGUoKSkuYW5kUmV0dXJuKCBuZXdGaWxlICkuYW55VGltZXMoKTsKLSAgICAgICAgICAgIGZpbGUgPSBuZXdGaWxlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgdm9pZCBzZXRUeXBlKCBmaW5hbCBTdHJpbmcgdHlwZSApCi0gICAgewotICAgICAgICBzZXRUeXBlQW5kRXh0KCB0eXBlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldFR5cGVBbmRFeHQoIGZpbmFsIFN0cmluZyB0eXBlICkKLSAgICB7Ci0gICAgICAgIGlmICggKCB0eXBlICE9IG51bGwgKSAmJiAoIHR5cGVBbmRFeHQgPT0gbnVsbCApICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KGFydGlmYWN0LmdldFR5cGUoKSkuYW5kUmV0dXJuKCB0eXBlICkuYW55VGltZXMoKTsKLSAgICAgICAgICAgIGV4cGVjdChoYW5kbGVyLmdldEV4dGVuc2lvbigpKS5hbmRSZXR1cm4oIHR5cGUgKS5hbnlUaW1lcygpOwotICAgICAgICAgICAgdHlwZUFuZEV4dCA9IHR5cGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKQotICAgIHsKLSAgICAgICAgaWYgKCAoIGdyb3VwSWQgIT0gbnVsbCApICYmICggYXJ0aWZhY3RJZCAhPSBudWxsICkgJiYgKCB0eXBlQW5kRXh0ICE9IG51bGwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9Ci0gICAgICAgICAgICAgICAgZ3JvdXBJZCArICI6IiArIGFydGlmYWN0SWQgKyAiOiIgKyB0eXBlQW5kRXh0ICsgKCBjbGFzc2lmaWVyID09IG51bGwgPyAiIiA6ICI6IiArIGNsYXNzaWZpZXIgKTsKLSAgICAgICAgICAgIHNldERlcGVuZGVuY3lDb25mbGljdElkKCBpZCApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNldElkKCkKLSAgICB7Ci0gICAgICAgIGlmICggKCBncm91cElkICE9IG51bGwgKSAmJiAoIGFydGlmYWN0SWQgIT0gbnVsbCApICYmICggdHlwZUFuZEV4dCAhPSBudWxsICkgJiYgKCB2ZXJzaW9uICE9IG51bGwgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9Ci0gICAgICAgICAgICAgICAgZ3JvdXBJZCArICI6IiArIGFydGlmYWN0SWQgKyAiOiIgKyB2ZXJzaW9uICsgIjoiICsgdHlwZUFuZEV4dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICggY2xhc3NpZmllciA9PSBudWxsID8gIiIgOiAiOiIgKyBjbGFzc2lmaWVyICk7Ci0gICAgICAgICAgICBzZXRJZCggaWQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE51bGxGaWxlKCkKLSAgICB7Ci0gICAgICAgIGV4cGVjdChhcnRpZmFjdC5nZXRGaWxlKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZmlsZSA9IG5ldyBGaWxlKCAic2V0LXRvLW51bGwiICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL3Rlc3R1dGlscy9Nb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzay5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay90ZXN0dXRpbHMvTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk4NjRjMi4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJjaGl2ZS90YXNrL3Rlc3R1dGlscy9Nb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS50YXNrLnRlc3R1dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5Bc3NlcnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJjaGl2ZS5EZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuYXJ0aWZhY3QuRGVwZW5kZW5jeVJlc29sdmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkRlcGVuZGVuY3lTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuTW9kdWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlZEZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5lYXN5bW9jay5FYXN5TW9jazsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5hbnlJbnQ7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5hbnlPYmplY3Q7Ci1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci0KLXB1YmxpYyBjbGFzcyBNb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzawotewotCi0gICAgcHVibGljIGZpbmFsIEFyY2hpdmVyIGFyY2hpdmVyOwotCi0gICAgcHVibGljIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlOwotCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdCA9IG51bGw7Ci0KLSAgICBwdWJsaWMgZmluYWwgIERlcGVuZGVuY3lSZXNvbHZlciBkZXBlbmRlbmN5UmVzb2x2ZXI7Ci0KLSAgICBwdWJsaWMgTW9ja0FuZENvbnRyb2xGb3JBZGRBcnRpZmFjdFRhc2soIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtb2NrTWFuYWdlciApCi0gICAgewotICAgICAgICB0aGlzKCBtb2NrTWFuYWdlciwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyBNb2NrQW5kQ29udHJvbEZvckFkZEFydGlmYWN0VGFzayggZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1vY2tNYW5hZ2VyLCBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwotCi0gICAgICAgIGFyY2hpdmVyID0gbW9ja01hbmFnZXIuY3JlYXRlTW9jayhBcmNoaXZlci5jbGFzcyk7Ci0gICAgICAgIGNvbmZpZ1NvdXJjZSA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2soQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZS5jbGFzcyk7Ci0gICAgICAgIGRlcGVuZGVuY3lSZXNvbHZlciA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2soIERlcGVuZGVuY3lSZXNvbHZlci5jbGFzcyk7Ci0KLSAgICAgICAgZW5hYmxlRGVmYXVsdEV4cGVjdGF0aW9ucygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbmFibGVEZWZhdWx0RXhwZWN0YXRpb25zKCkKLSAgICB7Ci0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFByb2plY3QoKSkuYW5kUmV0dXJuKCBwcm9qZWN0ICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0TWF2ZW5TZXNzaW9uKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R2V0RmluYWxOYW1lKCBmaW5hbCBTdHJpbmcgZmluYWxOYW1lICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0RmluYWxOYW1lKCkpLmFuZFJldHVybiggZmluYWxOYW1lICkuYXRMZWFzdE9uY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RHZXREZXN0RmlsZSggZmluYWwgRmlsZSBkZXN0RmlsZSApCi0gICAgewotICAgICAgICBleHBlY3QoYXJjaGl2ZXIuZ2V0RGVzdEZpbGUoKSkuYW5kUmV0dXJuKCBkZXN0RmlsZSApLmF0TGVhc3RPbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R2V0TW9kZSggZmluYWwgaW50IG9yaWdpbmFsRGlyTW9kZSwgZmluYWwgaW50IG9yaWdpbmFsRmlsZU1vZGUgKQotICAgIHsKLSAgICAgICAgZXhwZWN0KCBhcmNoaXZlci5nZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKSkuYW5kUmV0dXJuKCBvcmlnaW5hbERpck1vZGUgKTsKLSAgICAgICAgZXhwZWN0KGFyY2hpdmVyLmdldE92ZXJyaWRlRmlsZU1vZGUoKSkuYW5kUmV0dXJuKCBvcmlnaW5hbEZpbGVNb2RlICk7Ci0gICAgICAgIGFyY2hpdmVyLnNldEZpbGVNb2RlKCBhbnlJbnQoKSApOwotICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFueVRpbWVzKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGRBcmNoaXZlZEZpbGVTZXQoKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyLmFkZEFyY2hpdmVkRmlsZVNldCggKEZpbGUpYW55T2JqZWN0KCksIChTdHJpbmcpYW55T2JqZWN0KCksIChTdHJpbmdbXSlhbnlPYmplY3QoKSwgKFN0cmluZ1tdKWFueU9iamVjdCgpICk7Ci0gICAgICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFueVRpbWVzKCk7Ci0gICAgICAgICAgICBhcmNoaXZlci5hZGRBcmNoaXZlZEZpbGVTZXQoKEFyY2hpdmVkRmlsZVNldCkgYW55T2JqZWN0KCksIChDaGFyc2V0KSBhbnlPYmplY3QoKSApOwotICAgICAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hbnlUaW1lcygpOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoICJTaG91bGQgbmV2ZXIgaGFwcGVuLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdE1vZGVDaGFuZ2UoIGZpbmFsIGludCBvcmlnaW5hbERpck1vZGUsIGZpbmFsIGludCBvcmlnaW5hbEZpbGVNb2RlLCBmaW5hbCBpbnQgZGlyTW9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsZU1vZGUsIGZpbmFsIGludCBudW1iZXJPZkNoYW5nZXMgKQotICAgIHsKLSAgICAgICAgZXhwZWN0KCBhcmNoaXZlci5nZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKSkuYW5kUmV0dXJuKCBvcmlnaW5hbERpck1vZGUgKTsKLSAgICAgICAgZXhwZWN0KGFyY2hpdmVyLmdldE92ZXJyaWRlRmlsZU1vZGUoKSkuYW5kUmV0dXJuKCBvcmlnaW5hbEZpbGVNb2RlICk7Ci0KLSAgICAgICAgLy8gb25lIG9mIHRoZSBjaGFuZ2VzIHdpbGwgb2NjdXIgYmVsb3csIHdoZW4gd2UgcmVzdG9yZSB0aGUgb3JpZ2luYWwgbW9kZS4KLSAgICAgICAgaWYgKCBudW1iZXJPZkNoYW5nZXMgPiAxICkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yICggaW50IGkgPSAxOyBpIDwgbnVtYmVyT2ZDaGFuZ2VzOyBpKysgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICggZGlyTW9kZSA+IC0xICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFyY2hpdmVyLnNldERpcmVjdG9yeU1vZGUoIGRpck1vZGUgKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoIGZpbGVNb2RlID4gLTEgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RmlsZU1vZGUoIGZpbGVNb2RlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBkaXJNb2RlID4gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXREaXJlY3RvcnlNb2RlKCBvcmlnaW5hbERpck1vZGUgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggZmlsZU1vZGUgPiAtMSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyLnNldEZpbGVNb2RlKCBvcmlnaW5hbEZpbGVNb2RlICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGRGaWxlKCBmaW5hbCBGaWxlIGZpbGUsIGZpbmFsIFN0cmluZyBvdXRwdXRMb2NhdGlvbiwgZmluYWwgaW50IGZpbGVNb2RlICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlci5hZGRGaWxlKCAoRmlsZSlhbnlPYmplY3QoKSwgKFN0cmluZykgYW55T2JqZWN0KCksIGFueUludCgpICk7Ci0gICAgICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFueVRpbWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoICJTaG91bGQgbmV2ZXIgaGFwcGVuLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0QWRkRmlsZSggZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBTdHJpbmcgb3V0cHV0TG9jYXRpb24gKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyLmFkZEZpbGUoIGZpbGUsIG91dHB1dExvY2F0aW9uICk7Ci0gICAgICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmF0TGVhc3RPbmNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoICJTaG91bGQgbmV2ZXIgaGFwcGVuLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEdldFJlYWN0b3JQcm9qZWN0cyggZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IHByb2plY3RzICkKLSAgICB7Ci0gICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRSZWFjdG9yUHJvamVjdHMoKSkuYW5kUmV0dXJuKCBwcm9qZWN0cyApLmF0TGVhc3RPbmNlKCk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RSZXNvbHZlRGVwZW5kZW5jeVNldHMoKQotICAgICAgICB0aHJvd3MgRGVwZW5kZW5jeVJlc29sdXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGV4cGVjdCggZGVwZW5kZW5jeVJlc29sdmVyLnJlc29sdmVEZXBlbmRlbmN5U2V0cyggKEFzc2VtYmx5KSBhbnlPYmplY3QoKSwgKE1vZHVsZVNldCkgYW55T2JqZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UpIGFueU9iamVjdCgpLCAoTGlzdDxEZXBlbmRlbmN5U2V0PikgYW55T2JqZWN0KCkgKSkKLSAgICAgICAgICAgIC5hbmRSZXR1cm4oIG5ldyBMaW5rZWRIYXNoTWFwPERlcGVuZGVuY3lTZXQsIFNldDxBcnRpZmFjdD4+KCAgKSApLmFueVRpbWVzKCk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RJbnRlcnBvbGF0b3JzKCkKLSAgICB7Ci0gICAgICAgIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5zZXR1cEludGVycG9sYXRvcnMoIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay90ZXN0dXRpbHMvTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2suamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svdGVzdHV0aWxzL01vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjRiNDIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay90ZXN0dXRpbHMvTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHM7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uZXhlY3V0aW9uLk1hdmVuU2Vzc2lvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFydGlmYWN0LkRlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFydGlmYWN0LkRlcGVuZGVuY3lSZXNvbHZlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdEJ1aWxkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0LlByb2plY3RCdWlsZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVkRmlsZVNldDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5tYW5hZ2VyLkFyY2hpdmVyTWFuYWdlcjsKLWltcG9ydCBvcmcuZWFzeW1vY2suRWFzeU1vY2s7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrU3VwcG9ydDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suYW55SW50OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suYW55T2JqZWN0OwotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotCi1wdWJsaWMgY2xhc3MgTW9ja0FuZENvbnRyb2xGb3JBZGREZXBlbmRlbmN5U2V0c1Rhc2sKLXsKLQotICAgIHB1YmxpYyBmaW5hbCBBcmNoaXZlciBhcmNoaXZlcjsKLQotICAgIHB1YmxpYyBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZTsKLQotICAgIHB1YmxpYyBmaW5hbCBNYXZlblByb2plY3RCdWlsZGVyIHByb2plY3RCdWlsZGVyOwotCi0gICAgcHVibGljIGZpbmFsIEFyY2hpdmVyTWFuYWdlciBhcmNoaXZlck1hbmFnZXI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgcHVibGljIGZpbmFsIERlcGVuZGVuY3lSZXNvbHZlciBkZXBlbmRlbmN5UmVzb2x2ZXI7Ci0KLQotICAgIHB1YmxpYyBNb2NrQW5kQ29udHJvbEZvckFkZERlcGVuZGVuY3lTZXRzVGFzayggZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1vY2tNYW5hZ2VyICkKLSAgICB7Ci0gICAgICAgIHRoaXMoIG1vY2tNYW5hZ2VyLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIE1vY2tBbmRDb250cm9sRm9yQWRkRGVwZW5kZW5jeVNldHNUYXNrKCBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIsIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7Ci0KLSAgICAgICAgYXJjaGl2ZXIgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKEFyY2hpdmVyLmNsYXNzKTsKLSAgICAgICAgY29uZmlnU291cmNlID0gbW9ja01hbmFnZXIuY3JlYXRlTW9jayAoQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZS5jbGFzcyk7Ci0KLQotICAgICAgICBwcm9qZWN0QnVpbGRlciA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2soTWF2ZW5Qcm9qZWN0QnVpbGRlci5jbGFzcyk7Ci0KLSAgICAgICAgYXJjaGl2ZXJNYW5hZ2VyID0gbW9ja01hbmFnZXIuY3JlYXRlTW9jayhBcmNoaXZlck1hbmFnZXIuY2xhc3MpOwotCi0gICAgICAgIGRlcGVuZGVuY3lSZXNvbHZlciA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2soIERlcGVuZGVuY3lSZXNvbHZlci5jbGFzcyk7Ci0KLQotICAgICAgICBlbmFibGVEZWZhdWx0RXhwZWN0YXRpb25zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuYWJsZURlZmF1bHRFeHBlY3RhdGlvbnMoKQotICAgIHsKLSAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCkpLmFuZFJldHVybiggcHJvamVjdCApLmFueVRpbWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0QWRkQXJjaGl2ZWRGaWxlU2V0KCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlci5hZGRBcmNoaXZlZEZpbGVTZXQoIChGaWxlKSBhbnlPYmplY3QoKSwgKFN0cmluZykgYW55T2JqZWN0KCksIChTdHJpbmdbXSkgYW55T2JqZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nW10pIGFueU9iamVjdCgpICk7Ci0gICAgICAgICAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpLmFueVRpbWVzKCk7Ci0gICAgICAgICAgICBhcmNoaXZlci5hZGRBcmNoaXZlZEZpbGVTZXQoIChBcmNoaXZlZEZpbGVTZXQpYW55T2JqZWN0KCksIChDaGFyc2V0KSBhbnlPYmplY3QoKSAgKTsKLSAgICAgICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYW55VGltZXMoKTsKLQotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZXJFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCAiU2hvdWxkIG5ldmVyIGhhcHBlbi4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RNb2RlQ2hhbmdlKCBmaW5hbCBpbnQgb3JpZ2luYWxEaXJNb2RlLCBmaW5hbCBpbnQgb3JpZ2luYWxGaWxlTW9kZSwgZmluYWwgaW50IGRpck1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGZpbGVNb2RlLCBmaW5hbCBpbnQgbnVtYmVyT2ZDaGFuZ2VzICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdEdldE1vZGUoIG9yaWdpbmFsRGlyTW9kZSwgb3JpZ2luYWxGaWxlTW9kZSApOwotICAgICAgICAvLyBvbmUgb2YgdGhlIGNoYW5nZXMgd2lsbCBvY2N1ciBiZWxvdywgd2hlbiB3ZSByZXN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlLgotICAgICAgICBpZiAoIG51bWJlck9mQ2hhbmdlcyA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDE7IGkgPCBudW1iZXJPZkNoYW5nZXM7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuc2V0RGlyZWN0b3J5TW9kZSggZGlyTW9kZSApOwotICAgICAgICAgICAgICAgIGFyY2hpdmVyLnNldEZpbGVNb2RlKCBmaWxlTW9kZSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYXJjaGl2ZXIuc2V0RGlyZWN0b3J5TW9kZSggb3JpZ2luYWxEaXJNb2RlICk7Ci0gICAgICAgIGFyY2hpdmVyLnNldEZpbGVNb2RlKCBvcmlnaW5hbEZpbGVNb2RlICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R2V0TW9kZSggZmluYWwgaW50IG9yaWdpbmFsRGlyTW9kZSwgZmluYWwgaW50IG9yaWdpbmFsRmlsZU1vZGUgKQotICAgIHsKLSAgICAgICAgYXJjaGl2ZXIuc2V0RmlsZU1vZGUoIGFueUludCgpICk7Ci0gICAgICAgIEVhc3lNb2NrLmV4cGVjdExhc3RDYWxsKCkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBhcmNoaXZlci5nZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKSkuYW5kUmV0dXJuKCBvcmlnaW5hbERpck1vZGUgKTsKLSAgICAgICAgZXhwZWN0KCBhcmNoaXZlci5nZXRPdmVycmlkZUZpbGVNb2RlKCkgKS5hbmRSZXR1cm4oIG9yaWdpbmFsRmlsZU1vZGUgKTsKLSAgICAgICAgYXJjaGl2ZXIuc2V0RGlyZWN0b3J5TW9kZSggYW55SW50KCkgKTsKLSAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hbnlUaW1lcygpOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0QWRkRmlsZSggZmluYWwgRmlsZSBmaWxlLCBmaW5hbCBTdHJpbmcgb3V0cHV0TG9jYXRpb24gKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyLmFkZEZpbGUoIGZpbGUsIG91dHB1dExvY2F0aW9uICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LmZhaWwoICJTaG91bGQgbmV2ZXIgaGFwcGVuLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEFkZEZpbGUoIGZpbmFsIEZpbGUgZmlsZSwgZmluYWwgU3RyaW5nIG91dHB1dExvY2F0aW9uLCBmaW5hbCBpbnQgZmlsZU1vZGUgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyLmFkZEZpbGUoIGZpbGUsIG91dHB1dExvY2F0aW9uLCBmaWxlTW9kZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgQXJjaGl2ZXJFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCAiU2hvdWxkIG5ldmVyIGhhcHBlbi4iICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGRBbnlGaWxlKCAgKQotICAgIHsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGFyY2hpdmVyLmFkZEZpbGUoIChGaWxlKSBhbnlPYmplY3QoKSwgKFN0cmluZykgYW55T2JqZWN0KCksIGFueUludCgpKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIGZpbmFsIEFyY2hpdmVyRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuZmFpbCggIlNob3VsZCBuZXZlciBoYXBwZW4uIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0R2V0UmVhY3RvclByb2plY3RzKCBmaW5hbCBMaXN0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMgKQotICAgIHsKLSAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRSZWFjdG9yUHJvamVjdHMoKSkuYW5kUmV0dXJuKCBwcm9qZWN0cyApLmFueVRpbWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0Q1NHZXRGaW5hbE5hbWUoIGZpbmFsIFN0cmluZyBmaW5hbE5hbWUgKQotICAgIHsKLSAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRGaW5hbE5hbWUoKSkuYW5kUmV0dXJuKCBmaW5hbE5hbWUgKS5hbnlUaW1lcygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEdldERlc3RGaWxlKCBmaW5hbCBGaWxlIGRlc3RGaWxlICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdChhcmNoaXZlci5nZXREZXN0RmlsZSgpKS5hbmRSZXR1cm4oIGRlc3RGaWxlICkuYW55VGltZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RDU0dldFJlcG9zaXRvcmllcyggZmluYWwgQXJ0aWZhY3RSZXBvc2l0b3J5IGxvY2FsUmVwbywgZmluYWwgTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IHJlbW90ZVJlcG9zICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0TG9jYWxSZXBvc2l0b3J5KCkpLmFuZFJldHVybiggbG9jYWxSZXBvICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRSZW1vdGVSZXBvc2l0b3JpZXMoKSkuYW5kUmV0dXJuKCByZW1vdGVSZXBvcyApLmFueVRpbWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0QnVpbGRGcm9tUmVwb3NpdG9yeSggZmluYWwgUHJvamVjdEJ1aWxkaW5nRXhjZXB0aW9uIGVycm9yICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QocHJvamVjdEJ1aWxkZXIuYnVpbGRGcm9tUmVwb3NpdG9yeSggKEFydGlmYWN0KSBhbnlPYmplY3QoKSwgKExpc3QpIGFueU9iamVjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFydGlmYWN0UmVwb3NpdG9yeSkgYW55T2JqZWN0KCkgKSkuYW5kVGhyb3coIGVycm9yICk7Ci0vLyAgICAgICAgICAgIHByb2plY3RCdWlsZGVyQ3RsLnNldFRocm93YWJsZSggZXJyb3IsIE1vY2tDb250cm9sLk9ORV9PUl9NT1JFICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBQcm9qZWN0QnVpbGRpbmdFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCAic2hvdWxkIG5ldmVyIGhhcHBlbiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEJ1aWxkRnJvbVJlcG9zaXRvcnkoIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ICkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QocHJvamVjdEJ1aWxkZXIuYnVpbGRGcm9tUmVwb3NpdG9yeSggKCBBcnRpZmFjdCkgYW55T2JqZWN0KCksIChMaXN0KWFueU9iamVjdCgpLCAoQXJ0aWZhY3RSZXBvc2l0b3J5KWFueU9iamVjdCgpICkpLmFuZFJldHVybiggcHJvamVjdCApLmFueVRpbWVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBQcm9qZWN0QnVpbGRpbmdFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5mYWlsKCAic2hvdWxkIG5ldmVyIGhhcHBlbiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEdldFNlc3Npb24oIGZpbmFsIE1hdmVuU2Vzc2lvbiBzZXNzaW9uICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0TWF2ZW5TZXNzaW9uKCkpLmFuZFJldHVybiggc2Vzc2lvbiApLmFueVRpbWVzKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZXhwZWN0UmVzb2x2ZURlcGVuZGVuY3lTZXRzKCkKLSAgICAgICAgdGhyb3dzIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBleHBlY3QoIGRlcGVuZGVuY3lSZXNvbHZlci5yZXNvbHZlRGVwZW5kZW5jeVNldHMoIChBc3NlbWJseSkgYW55T2JqZWN0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UpIGFueU9iamVjdCgpLCAoTGlzdDxEZXBlbmRlbmN5U2V0PikgYW55T2JqZWN0KCkgKSkKLSAgICAgICAgICAgIC5hbmRSZXR1cm4oIG5ldyBMaW5rZWRIYXNoTWFwPERlcGVuZGVuY3lTZXQsIFNldDxBcnRpZmFjdD4+KCAgKSApLmFueVRpbWVzKCk7Ci0KLSAgICB9Ci0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay90ZXN0dXRpbHMvTW9ja0FuZENvbnRyb2xGb3JBZGRGaWxlU2V0c1Rhc2suamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcmNoaXZlL3Rhc2svdGVzdHV0aWxzL01vY2tBbmRDb250cm9sRm9yQWRkRmlsZVNldHNUYXNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MjYxMjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FyY2hpdmUvdGFzay90ZXN0dXRpbHMvTW9ja0FuZENvbnRyb2xGb3JBZGRGaWxlU2V0c1Rhc2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHM7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdHV0aWxzLlRlc3RGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5BcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lYXN5bW9jay5jbGFzc2V4dGVuc2lvbi5FYXN5TW9ja1N1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmFueU9iamVjdDsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLQotcHVibGljIGNsYXNzIE1vY2tBbmRDb250cm9sRm9yQWRkRmlsZVNldHNUYXNrCi17Ci0KLSAgICBwdWJsaWMgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2U7Ci0KLQotICAgIHB1YmxpYyBBcmNoaXZlciBhcmNoaXZlcjsKLQotICAgIHB1YmxpYyBGaWxlIGFyY2hpdmVCYXNlRGlyOwotCi0gICAgcHVibGljIE1vY2tBbmRDb250cm9sRm9yQWRkRmlsZVNldHNUYXNrKCBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIsIFRlc3RGaWxlTWFuYWdlciBmaWxlTWFuYWdlciApCi0gICAgewotICAgICAgICBjb25maWdTb3VyY2UgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrIChBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlLmNsYXNzKTsKLSAgICAgICAgYXJjaGl2ZXIgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrIChBcmNoaXZlci5jbGFzcyk7Ci0gICAgICAgIGFyY2hpdmVCYXNlRGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0TWF2ZW5TZXNzaW9uKCkpLmFuZFJldHVybiggbnVsbCkuYW55VGltZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RHZXRBcmNoaXZlQmFzZURpcmVjdG9yeSgpCi0gICAgewotICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldEFyY2hpdmVCYXNlRGlyZWN0b3J5KCkpLmFuZFJldHVybiggYXJjaGl2ZUJhc2VEaXIgKS5hbnlUaW1lcygpOwotICAgIH0KLQotICAgIHZvaWQgZXhwZWN0TW9kZUNoYW5nZXMoIGludFtdIG1vZGVzLCBpbnQgbW9kZUNoYW5nZUNvdW50ICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdChhcmNoaXZlci5nZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKSkuYW5kUmV0dXJuKCBtb2Rlc1swXSApOwotICAgICAgICBleHBlY3QoYXJjaGl2ZXIuZ2V0T3ZlcnJpZGVGaWxlTW9kZSgpKS5hbmRSZXR1cm4oIG1vZGVzWzFdICk7Ci0KLQotICAgICAgICBpZiAoIG1vZGVDaGFuZ2VDb3VudCA+IDEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDE7IGkgPCBtb2RlQ2hhbmdlQ291bnQ7IGkrKyApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCBtb2Rlc1syXSA+IC0xICkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGFyY2hpdmVyLnNldERpcmVjdG9yeU1vZGUoIG1vZGVzWzJdICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgIGlmICggbW9kZXNbM10gPiAtMSApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhcmNoaXZlci5zZXRGaWxlTW9kZSggbW9kZXNbM10gKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIG1vZGVzWzJdID4gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXREaXJlY3RvcnlNb2RlKCBtb2Rlc1swXSApOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAoIG1vZGVzWzNdID4gLTEgKQotICAgICAgICB7Ci0gICAgICAgICAgICBhcmNoaXZlci5zZXRGaWxlTW9kZSggbW9kZXNbMV0gKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGV4cGVjdEFkZGl0aW9uT2ZTaW5nbGVGaWxlU2V0KCBNYXZlblByb2plY3QgcHJvamVjdCwgU3RyaW5nIGZpbmFsTmFtZSwgYm9vbGVhbiBzaG91bGRBZGREaXIsIGludFtdIG1vZGVzLCBpbnQgbW9kZUNoYW5nZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRGVidWdFbmFibGVkICkKLSAgICB7Ci0gICAgICAgIGV4cGVjdEFkZGl0aW9uT2ZTaW5nbGVGaWxlU2V0KCBwcm9qZWN0LCBmaW5hbE5hbWUsIHNob3VsZEFkZERpciwgbW9kZXMsIG1vZGVDaGFuZ2VDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzRGVidWdFbmFibGVkLCB0cnVlICk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RBZGRpdGlvbk9mU2luZ2xlRmlsZVNldCggTWF2ZW5Qcm9qZWN0IHByb2plY3QsIFN0cmluZyBmaW5hbE5hbWUsIGJvb2xlYW4gc2hvdWxkQWRkRGlyLCBpbnRbXSBtb2RlcywgaW50IG1vZGVDaGFuZ2VDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RlYnVnRW5hYmxlZCwgYm9vbGVhbiBpc1Byb2plY3RVc2VkICkKLSAgICB7Ci0gICAgICAgIC8vIHRoZSBsb2dnZXIgc2VuZHMgYSBkZWJ1ZyBtZXNzYWdlIHdpdGggdGhpcyBpbmZvIGluc2lkZSB0aGUgYWRkRmlsZVNldCguLikgbWV0aG9kLi4KLSAgICAgICAgaWYgKCBpc0RlYnVnRW5hYmxlZCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdChhcmNoaXZlci5nZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKSkuYW5kUmV0dXJuKCBtb2Rlc1swXSApOwotICAgICAgICAgICAgZXhwZWN0KGFyY2hpdmVyLmdldE92ZXJyaWRlRmlsZU1vZGUoKSkuYW5kUmV0dXJuKCBtb2Rlc1sxXSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBpc1Byb2plY3RVc2VkICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCkpLmFuZFJldHVybiggcHJvamVjdCApLmF0TGVhc3RPbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRGaW5hbE5hbWUoKSkuYW5kUmV0dXJuKCBmaW5hbE5hbWUgKS5hdExlYXN0T25jZSgpOwotCi0gICAgICAgIGlmICggc2hvdWxkQWRkRGlyICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0TW9kZUNoYW5nZXMoIG1vZGVzLCBtb2RlQ2hhbmdlQ291bnQgKTsKLQotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXJjaGl2ZXIuYWRkRmlsZVNldCggKEZpbGVTZXQpIGFueU9iamVjdCgpICk7Ci0gICAgICAgICAgICAgICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKS5hdExlYXN0T25jZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCggIlNob3VsZCBuZXZlciBoYXBwZW4uIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RHZXRQcm9qZWN0KCBNYXZlblByb2plY3QgcHJvamVjdCApCi0gICAgewotICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldFByb2plY3QoKSkuYW5kUmV0dXJuKCBwcm9qZWN0ICkuYXRMZWFzdE9uY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBleHBlY3RHZXRGaW5hbE5hbWUoIFN0cmluZyBmaW5hbE5hbWUgKQotICAgIHsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0RmluYWxOYW1lKCkpLmFuZFJldHVybiggZmluYWxOYW1lICkuYXRMZWFzdE9uY2UoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9hcnRpZmFjdC9EZWZhdWx0RGVwZW5kZW5jeVJlc29sdmVyVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FydGlmYWN0L0RlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhZDlmNGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FydGlmYWN0L0RlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5mYWN0b3J5LkFydGlmYWN0RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0Lm1ldGFkYXRhLkFydGlmYWN0TWV0YWRhdGFTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5RmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkubGF5b3V0LkFydGlmYWN0UmVwb3NpdG9yeUxheW91dDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlc29sdmVyLkFydGlmYWN0UmVzb2x2ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkRlcGVuZGVuY3lTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuTW9kdWxlQmluYXJpZXM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuTW9kdWxlU2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLlJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkucmVzb2x2ZWQuQXNzZW1ibHlJZDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuUGxleHVzVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuY29uc29sZS5Db25zb2xlTG9nZ2VyOwotaW1wb3J0IG9yZy5lYXN5bW9jay5jbGFzc2V4dGVuc2lvbi5FYXN5TW9ja1N1cHBvcnQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotCi1wdWJsaWMgY2xhc3MgRGVmYXVsdERlcGVuZGVuY3lSZXNvbHZlclRlc3QKLSAgICBleHRlbmRzIFBsZXh1c1Rlc3RDYXNlCi17Ci0KLSAgICBwcml2YXRlIEFydGlmYWN0RmFjdG9yeSBmYWN0b3J5OwotCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5IHJlcG9GYWN0b3J5OwotCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlcG9zaXRvcnlMYXlvdXQgbGF5b3V0OwotCi0gICAgcHJpdmF0ZSBBcnRpZmFjdFJlc29sdmVyIHJlc29sdmVyOwotCi0gICAgcHJpdmF0ZSBBcnRpZmFjdE1ldGFkYXRhU291cmNlIG1ldGFkYXRhU291cmNlOwotCi0gICAgcHJpdmF0ZSBDb25zb2xlTG9nZ2VyIGxvZ2dlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuc2V0VXAoKTsKLQotICAgICAgICByZXNvbHZlciA9IChBcnRpZmFjdFJlc29sdmVyKSBsb29rdXAoIEFydGlmYWN0UmVzb2x2ZXIuUk9MRSApOwotICAgICAgICBtZXRhZGF0YVNvdXJjZSA9IChBcnRpZmFjdE1ldGFkYXRhU291cmNlKSBsb29rdXAoIEFydGlmYWN0TWV0YWRhdGFTb3VyY2UuUk9MRSApOwotICAgICAgICBmYWN0b3J5ID0gKEFydGlmYWN0RmFjdG9yeSkgbG9va3VwKCBBcnRpZmFjdEZhY3RvcnkuUk9MRSApOwotICAgICAgICByZXBvRmFjdG9yeSA9IChBcnRpZmFjdFJlcG9zaXRvcnlGYWN0b3J5KSBsb29rdXAoIEFydGlmYWN0UmVwb3NpdG9yeUZhY3RvcnkuUk9MRSApOwotICAgICAgICBsYXlvdXQgPSAoQXJ0aWZhY3RSZXBvc2l0b3J5TGF5b3V0KSBsb29rdXAoIEFydGlmYWN0UmVwb3NpdG9yeUxheW91dC5ST0xFLCAiZGVmYXVsdCIgKTsKLSAgICAgICAgbG9nZ2VyID0gbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXREZXBlbmRlbmN5U2V0UmVzb2x1dGlvblJlcXVpcmVtZW50cygpCi0gICAgICAgIHRocm93cyBEZXBlbmRlbmN5UmVzb2x1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRGVwZW5kZW5jeVNldCBkczEgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgICAgICBkczEuc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKTsKLSAgICAgICAgZHMxLnNldFVzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXMoIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgRGVwZW5kZW5jeVNldCBkczIgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgICAgICBkczIuc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX1NZU1RFTSApOwotICAgICAgICBkczIuc2V0VXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcyggZmFsc2UgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZU1hdmVuUHJvamVjdCggIm1haW4tZ3JvdXAiLCAibWFpbi1hcnRpZmFjdCIsICIxIiwgbnVsbCApOwotCi0gICAgICAgIGZpbmFsIFJlc29sdXRpb25NYW5hZ2VtZW50SW5mbyBpbmZvID0gbmV3IFJlc29sdXRpb25NYW5hZ2VtZW50SW5mbyggcHJvamVjdCApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIG5ldyBEZWZhdWx0RGVwZW5kZW5jeVJlc29sdmVyKCByZXNvbHZlciwgbWV0YWRhdGFTb3VyY2UsIGZhY3RvcnksIGxvZ2dlciApLnVwZGF0ZURlcGVuZGVuY3lTZXRSZXNvbHV0aW9uUmVxdWlyZW1lbnRzKAotICAgICAgICAgICAgZHMxLAotICAgICAgICAgICAgICAgIGluZm8sIEFzc2VtYmx5SWQuY3JlYXRlQXNzZW1ibHlJZCggYXNzZW1ibHkpLAotICAgICAgICAgICAgICAgIHByb2plY3QpOwotCi0gICAgICAgIGFzc2VydFRydWUoIGluZm8uaXNSZXNvbHV0aW9uUmVxdWlyZWQoKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggaW5mby5pc1Jlc29sdmVkVHJhbnNpdGl2ZWx5KCkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBpbmZvLmdldFNjb3BlRmlsdGVyKCkuaXNJbmNsdWRlQ29tcGlsZVNjb3BlKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggaW5mby5nZXRTY29wZUZpbHRlcigpLmlzSW5jbHVkZVN5c3RlbVNjb3BlKCkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBpbmZvLmdldFNjb3BlRmlsdGVyKCkuaXNJbmNsdWRlUHJvdmlkZWRTY29wZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIGluZm8uZ2V0U2NvcGVGaWx0ZXIoKS5pc0luY2x1ZGVSdW50aW1lU2NvcGUoKSApOwotICAgICAgICBhc3NlcnRGYWxzZSggaW5mby5nZXRTY29wZUZpbHRlcigpLmlzSW5jbHVkZVRlc3RTY29wZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdF9nZXRNb2R1bGVTZXRSZXNvbHV0aW9uUmVxdWlyZW1lbnRzKCkKLSAgICAgICAgdGhyb3dzIERlcGVuZGVuY3lSZXNvbHV0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW0gPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjcyA9IG1tLmNyZWF0ZU1vY2soIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIHJvb3REaXIgPSBuZXcgRmlsZSggInJvb3QiICk7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlTWF2ZW5Qcm9qZWN0KCAibWFpbi1ncm91cCIsICJtYWluLWFydGlmYWN0IiwgIjEiLCByb290RGlyICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBtb2R1bGUxRGlyID0gbmV3IEZpbGUoIHJvb3REaXIsICJtb2R1bGUtMSIgKTsKLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZTEgPSBjcmVhdGVNYXZlblByb2plY3QoICJtYWluLWdyb3VwIiwgIm1vZHVsZS0xIiwgIjEiLCBtb2R1bGUxRGlyICk7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBtb2R1bGUxYSA9Ci0gICAgICAgICAgICBjcmVhdGVNYXZlblByb2plY3QoICJncm91cDEiLCAibW9kdWxlLTFhIiwgIjEiLCBuZXcgRmlsZSggbW9kdWxlMURpciwgIm1vZHVsZS0xYSIgKSApOwotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlMWIgPQotICAgICAgICAgICAgY3JlYXRlTWF2ZW5Qcm9qZWN0KCAiZ3JvdXAxLmIiLCAibW9kdWxlLTFiIiwgIjEiLCBuZXcgRmlsZSggbW9kdWxlMURpciwgIm1vZHVsZS0xYiIgKSApOwotCi0gICAgICAgIG1vZHVsZTEuZ2V0TW9kZWwoKS5hZGRNb2R1bGUoIG1vZHVsZTFhLmdldEFydGlmYWN0SWQoKSApOwotICAgICAgICBtb2R1bGUxLmdldE1vZGVsKCkuYWRkTW9kdWxlKCBtb2R1bGUxYi5nZXRBcnRpZmFjdElkKCkgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIG1vZHVsZTJEaXIgPSBuZXcgRmlsZSggcm9vdERpciwgIm1vZHVsZS0yIiApOwotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlMiA9IGNyZWF0ZU1hdmVuUHJvamVjdCggIm1haW4tZ3JvdXAiLCAibW9kdWxlLTIiLCAiMSIsIG1vZHVsZTJEaXIgKTsKLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZTJhID0KLSAgICAgICAgICAgIGNyZWF0ZU1hdmVuUHJvamVjdCggIm1haW4tZ3JvdXAiLCAibW9kdWxlLTJhIiwgIjEiLCBuZXcgRmlsZSggbW9kdWxlMkRpciwgIm1vZHVsZS0yYSIgKSApOwotCi0gICAgICAgIG1vZHVsZTIuZ2V0TW9kZWwoKS5hZGRNb2R1bGUoIG1vZHVsZTJhLmdldEFydGlmYWN0SWQoKSApOwotCi0gICAgICAgIHByb2plY3QuZ2V0TW9kZWwoKS5hZGRNb2R1bGUoIG1vZHVsZTEuZ2V0QXJ0aWZhY3RJZCgpICk7Ci0gICAgICAgIHByb2plY3QuZ2V0TW9kZWwoKS5hZGRNb2R1bGUoIG1vZHVsZTIuZ2V0QXJ0aWZhY3RJZCgpICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IGFsbFByb2plY3RzID0gbmV3IEFycmF5TGlzdDxNYXZlblByb2plY3Q+KCk7Ci0gICAgICAgIGFsbFByb2plY3RzLmFkZCggcHJvamVjdCApOwotICAgICAgICBhbGxQcm9qZWN0cy5hZGQoIG1vZHVsZTEgKTsKLSAgICAgICAgYWxsUHJvamVjdHMuYWRkKCBtb2R1bGUxYSApOwotICAgICAgICBhbGxQcm9qZWN0cy5hZGQoIG1vZHVsZTFiICk7Ci0gICAgICAgIGFsbFByb2plY3RzLmFkZCggbW9kdWxlMiApOwotICAgICAgICBhbGxQcm9qZWN0cy5hZGQoIG1vZHVsZTJhICk7Ci0KLSAgICAgICAgZXhwZWN0KCBjcy5nZXRSZWFjdG9yUHJvamVjdHMoKSkuYW5kUmV0dXJuKCBhbGxQcm9qZWN0cyApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjcy5nZXRQcm9qZWN0KCkpLmFuZFJldHVybiggcHJvamVjdCApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZmluYWwgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvIGluZm8gPSBuZXcgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvKCBwcm9qZWN0ICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxNb2R1bGVTZXQ+IG1vZHVsZVNldHMgPSBuZXcgQXJyYXlMaXN0PE1vZHVsZVNldD4oKTsKLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXQgbXMxID0gbmV3IE1vZHVsZVNldCgpOwotICAgICAgICBmaW5hbCBEZXBlbmRlbmN5U2V0IGRzMSA9IG5ldyBEZXBlbmRlbmN5U2V0KCk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1zMS5hZGRJbmNsdWRlKCAiKm1vZHVsZTEqIiApOwotICAgICAgICAgICAgbXMxLnNldEluY2x1ZGVTdWJNb2R1bGVzKCBmYWxzZSApOwotCi0gICAgICAgICAgICBmaW5hbCBNb2R1bGVCaW5hcmllcyBtYiA9IG5ldyBNb2R1bGVCaW5hcmllcygpOwotCi0gICAgICAgICAgICBkczEuc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKTsKLQotICAgICAgICAgICAgbWIuYWRkRGVwZW5kZW5jeVNldCggZHMxICk7Ci0gICAgICAgICAgICBtczEuc2V0QmluYXJpZXMoIG1iICk7Ci0gICAgICAgICAgICBtb2R1bGVTZXRzLmFkZCggbXMxICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBNb2R1bGVTZXQgbXMyID0gbmV3IE1vZHVsZVNldCgpOwotICAgICAgICBmaW5hbCBEZXBlbmRlbmN5U2V0IGRzMiA9IG5ldyBEZXBlbmRlbmN5U2V0KCk7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1zMi5hZGRJbmNsdWRlKCAibWFpbi1ncm91cDoqIiApOwotICAgICAgICAgICAgbXMyLnNldEluY2x1ZGVTdWJNb2R1bGVzKCB0cnVlICk7Ci0KLSAgICAgICAgICAgIGZpbmFsIE1vZHVsZUJpbmFyaWVzIG1iID0gbmV3IE1vZHVsZUJpbmFyaWVzKCk7Ci0KLSAgICAgICAgICAgIGRzMi5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfVEVTVCApOwotCi0gICAgICAgICAgICBtYi5hZGREZXBlbmRlbmN5U2V0KCBkczIgKTsKLSAgICAgICAgICAgIG1zMi5zZXRCaW5hcmllcyggbWIgKTsKLSAgICAgICAgICAgIG1vZHVsZVNldHMuYWRkKCBtczIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIERlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXIgcmVzb2x2ZXIgPQotICAgICAgICAgICAgbmV3IERlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXIoIHRoaXMucmVzb2x2ZXIsIG1ldGFkYXRhU291cmNlLCBmYWN0b3J5LCBsb2dnZXIgKTsKLSAgICAgICAgcmVzb2x2ZXIuZW5hYmxlTG9nZ2luZyggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseS5zZXRNb2R1bGVTZXRzKCBtb2R1bGVTZXRzICk7Ci0KLSAgICAgICAgcmVzb2x2ZXIudXBkYXRlTW9kdWxlU2V0UmVzb2x1dGlvblJlcXVpcmVtZW50cyhBc3NlbWJseUlkLmNyZWF0ZUFzc2VtYmx5SWQoIGFzc2VtYmx5KSwgbXMxLCBkczEsIGluZm8sIGNzKTsKLSAgICAgICAgcmVzb2x2ZXIudXBkYXRlTW9kdWxlU2V0UmVzb2x1dGlvblJlcXVpcmVtZW50cyhBc3NlbWJseUlkLmNyZWF0ZUFzc2VtYmx5SWQoIGFzc2VtYmx5ICksIG1zMiwgZHMyLCBpbmZvLCBjcyk7Ci0KLSAgICAgICAgYXNzZXJ0VHJ1ZSggaW5mby5pc1Jlc29sdXRpb25SZXF1aXJlZCgpICk7Ci0KLSAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gZW5hYmxlZFByb2plY3RzID0gaW5mby5nZXRFbmFibGVkUHJvamVjdHMoKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggZW5hYmxlZFByb2plY3RzLmNvbnRhaW5zKCBwcm9qZWN0ICkgKTsKLQotICAgICAgICBhc3NlcnRUcnVlKCBlbmFibGVkUHJvamVjdHMuY29udGFpbnMoIG1vZHVsZTEgKSApOwotCi0gICAgICAgIC8vIHRoZXNlIHNob3VsZCBiZSBleGNsdWRlZCBzaW5jZSBzdWItbW9kdWxlcyBhcmUgbm90IHRyYXZlcnNhYmxlCi0gICAgICAgIGFzc2VydEZhbHNlKCBlbmFibGVkUHJvamVjdHMuY29udGFpbnMoIG1vZHVsZTFhICkgKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UoIGVuYWJsZWRQcm9qZWN0cy5jb250YWlucyggbW9kdWxlMWIgKSApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGVuYWJsZWRQcm9qZWN0cy5jb250YWlucyggbW9kdWxlMiApICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGVuYWJsZWRQcm9qZWN0cy5jb250YWlucyggbW9kdWxlMmEgKSApOwotCi0gICAgICAgIC8vIHRoZXNlIGFyZSB0aGUgdHdvIHdlIGRpcmVjdGx5IHNldCBhYm92ZS4KLSAgICAgICAgYXNzZXJ0VHJ1ZSggaW5mby5nZXRTY29wZUZpbHRlcigpLmlzSW5jbHVkZVRlc3RTY29wZSgpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGluZm8uZ2V0U2NvcGVGaWx0ZXIoKS5pc0luY2x1ZGVDb21waWxlU2NvcGUoKSApOwotCi0gICAgICAgIC8vIHRoaXMgY29tYmluYXRpb24gc2hvdWxkIGJlIGltcGxpZWQgYnkgdGhlIHR3byBkaXJlY3Qgc2NvcGVzIHNldCBhYm92ZS4KLSAgICAgICAgYXNzZXJ0VHJ1ZSggaW5mby5nZXRTY29wZUZpbHRlcigpLmlzSW5jbHVkZVJ1bnRpbWVTY29wZSgpICk7Ci0gICAgICAgIGFzc2VydFRydWUoIGluZm8uZ2V0U2NvcGVGaWx0ZXIoKS5pc0luY2x1ZGVQcm92aWRlZFNjb3BlKCkgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggaW5mby5nZXRTY29wZUZpbHRlcigpLmlzSW5jbHVkZVN5c3RlbVNjb3BlKCkgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2dldFJlcG9zaXRvcnlSZXNvbHV0aW9uUmVxdWlyZW1lbnRzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8UmVwb3NpdG9yeT4gcmVwb3NpdG9yaWVzID0gbmV3IEFycmF5TGlzdDxSZXBvc2l0b3J5PigpOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFJlcG9zaXRvcnkgciA9IG5ldyBSZXBvc2l0b3J5KCk7Ci0gICAgICAgICAgICByLnNldFNjb3BlKCBBcnRpZmFjdC5TQ09QRV9DT01QSUxFICk7Ci0gICAgICAgICAgICByZXBvc2l0b3JpZXMuYWRkKCByICk7Ci0gICAgICAgIH0KLQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBSZXBvc2l0b3J5IHIgPSBuZXcgUmVwb3NpdG9yeSgpOwotICAgICAgICAgICAgci5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfU1lTVEVNICk7Ci0gICAgICAgICAgICByZXBvc2l0b3JpZXMuYWRkKCByICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZU1hdmVuUHJvamVjdCggImdyb3VwIiwgImFydGlmYWN0IiwgIjEuMCIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0UmVwb3NpdG9yaWVzKCByZXBvc2l0b3JpZXMgKTsKLQotICAgICAgICBmaW5hbCBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8gaW5mbyA9IG5ldyBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8oIHByb2plY3QgKTsKLSAgICAgICAgbmV3IERlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXIoIHJlc29sdmVyLCBtZXRhZGF0YVNvdXJjZSwgZmFjdG9yeSwgbG9nZ2VyICkudXBkYXRlUmVwb3NpdG9yeVJlc29sdXRpb25SZXF1aXJlbWVudHMoYXNzZW1ibHksCi0gICAgICAgICAgICAgICAgaW5mbwotICAgICAgICApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGluZm8uaXNSZXNvbHV0aW9uUmVxdWlyZWQoKSApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGluZm8uZ2V0U2NvcGVGaWx0ZXIoKS5pc0luY2x1ZGVDb21waWxlU2NvcGUoKSApOwotICAgICAgICBhc3NlcnRUcnVlKCBpbmZvLmdldFNjb3BlRmlsdGVyKCkuaXNJbmNsdWRlU3lzdGVtU2NvcGUoKSApOwotCi0gICAgICAgIGFzc2VydFRydWUoIGluZm8uZ2V0U2NvcGVGaWx0ZXIoKS5pc0luY2x1ZGVQcm92aWRlZFNjb3BlKCkgKTsKLQotICAgICAgICBhc3NlcnRGYWxzZSggaW5mby5nZXRTY29wZUZpbHRlcigpLmlzSW5jbHVkZVJ1bnRpbWVTY29wZSgpICk7Ci0gICAgICAgIGFzc2VydEZhbHNlKCBpbmZvLmdldFNjb3BlRmlsdGVyKCkuaXNJbmNsdWRlVGVzdFNjb3BlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0X2FnZ3JlZ2F0ZVJlbW90ZUFydGlmYWN0UmVwb3NpdG9yaWVzKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiBleHRlcm5hbFJlcG9zID0gbmV3IEFycmF5TGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+KCk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RSZXBvc2l0b3J5IGVyMSA9Ci0gICAgICAgICAgICByZXBvRmFjdG9yeS5jcmVhdGVBcnRpZmFjdFJlcG9zaXRvcnkoICJ0ZXN0LjEiLCAiaHR0cDovL3Rlc3QuY29tL3BhdGgiLCBsYXlvdXQsIG51bGwsIG51bGwgKTsKLSAgICAgICAgZXh0ZXJuYWxSZXBvcy5hZGQoIGVyMSApOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBlcjIgPQotICAgICAgICAgICAgcmVwb0ZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RSZXBvc2l0b3J5KCAidGVzdC4yIiwgImh0dHA6Ly90ZXN0Mi5jb20vcGF0aCIsIGxheW91dCwgbnVsbCwgbnVsbCApOwotICAgICAgICBleHRlcm5hbFJlcG9zLmFkZCggZXIyICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IHByb2plY3RSZXBvcyA9IG5ldyBBcnJheUxpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PigpOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBwcjEgPQotICAgICAgICAgICAgcmVwb0ZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RSZXBvc2l0b3J5KCAicHJvamVjdC4xIiwgImh0dHA6Ly90ZXN0LmNvbS9wcm9qZWN0IiwgbGF5b3V0LCBudWxsLCBudWxsICk7Ci0gICAgICAgIHByb2plY3RSZXBvcy5hZGQoIHByMSApOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBwcjIgPQotICAgICAgICAgICAgcmVwb0ZhY3RvcnkuY3JlYXRlQXJ0aWZhY3RSZXBvc2l0b3J5KCAicHJvamVjdC4yIiwgImh0dHA6Ly90ZXN0Mi5jb20vcGF0aCIsIGxheW91dCwgbnVsbCwgbnVsbCApOwotICAgICAgICBwcm9qZWN0UmVwb3MuYWRkKCBwcjIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZU1hdmVuUHJvamVjdCggImdyb3VwIiwgImFydGlmYWN0IiwgIjEiLCBuZXcgRmlsZSggImJhc2UiICkgKTsKLSAgICAgICAgcHJvamVjdC5zZXRSZW1vdGVBcnRpZmFjdFJlcG9zaXRvcmllcyggcHJvamVjdFJlcG9zICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBcnRpZmFjdFJlcG9zaXRvcnk+IGFnZ3JlZ2F0ZWQgPQotICAgICAgICAgICAgbmV3IERlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXIoIHJlc29sdmVyLCBtZXRhZGF0YVNvdXJjZSwgZmFjdG9yeSwgbG9nZ2VyICkuYWdncmVnYXRlUmVtb3RlQXJ0aWZhY3RSZXBvc2l0b3JpZXMoIGV4dGVybmFsUmVwb3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIHByb2plY3QgKSApOwotCi0gICAgICAgIGFzc2VydFJlcG9zaXRvcnlXaXRoSWQoIGVyMS5nZXRJZCgpLCBhZ2dyZWdhdGVkLCB0cnVlICk7Ci0gICAgICAgIGFzc2VydFJlcG9zaXRvcnlXaXRoSWQoIGVyMi5nZXRJZCgpLCBhZ2dyZWdhdGVkLCB0cnVlICk7Ci0gICAgICAgIGFzc2VydFJlcG9zaXRvcnlXaXRoSWQoIHByMS5nZXRJZCgpLCBhZ2dyZWdhdGVkLCB0cnVlICk7Ci0gICAgICAgIGFzc2VydFJlcG9zaXRvcnlXaXRoSWQoIHByMi5nZXRJZCgpLCBhZ2dyZWdhdGVkLCBmYWxzZSApOwotICAgIH0KLQotICAgIC8vIHB1YmxpYyB2b2lkIHRlc3RfbWFuYWdlQXJ0aWZhY3QoKQotICAgIC8vIHsKLSAgICAvLyBBcnRpZmFjdCBtYW5hZ2VkID0gZmFjdG9yeS5jcmVhdGVBcnRpZmFjdCggImdyb3VwIiwgImFydGlmYWN0IiwgIjEiLCBBcnRpZmFjdC5TQ09QRV9QUk9WSURFRCwgImphciIgKTsKLSAgICAvLwotICAgIC8vIEFydGlmYWN0IHRhcmdldCA9Ci0gICAgLy8gZmFjdG9yeS5jcmVhdGVBcnRpZmFjdCggbWFuYWdlZC5nZXRHcm91cElkKCksIG1hbmFnZWQuZ2V0QXJ0aWZhY3RJZCgpLCAiMiIsIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUsCi0gICAgLy8gbWFuYWdlZC5nZXRUeXBlKCkgKTsKLSAgICAvLwotICAgIC8vIEFydGlmYWN0IHRhcmdldDIgPQotICAgIC8vIGZhY3RvcnkuY3JlYXRlQXJ0aWZhY3QoICJvdGhlci1ncm91cCIsIG1hbmFnZWQuZ2V0QXJ0aWZhY3RJZCgpLCAiMiIsIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUsCi0gICAgLy8gbWFuYWdlZC5nZXRUeXBlKCkgKTsKLSAgICAvLwotICAgIC8vIE1hcCBtYW5hZ2VkVmVyc2lvbnMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25NYXAoIG1hbmFnZWQuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSwgbWFuYWdlZCApOwotICAgIC8vCi0gICAgLy8gRGVmYXVsdERlcGVuZGVuY3lSZXNvbHZlciByZXNvbHZlciA9Ci0gICAgLy8gbmV3IERlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXIoKS5zZXRMb2dnZXIoIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICk7Ci0gICAgLy8KLSAgICAvLyByZXNvbHZlci5tYW5hZ2VBcnRpZmFjdCggdGFyZ2V0LCBtYW5hZ2VkVmVyc2lvbnMgKTsKLSAgICAvLyByZXNvbHZlci5tYW5hZ2VBcnRpZmFjdCggdGFyZ2V0MiwgbWFuYWdlZFZlcnNpb25zICk7Ci0gICAgLy8KLSAgICAvLyBhc3NlcnRFcXVhbHMoIG1hbmFnZWQuZ2V0VmVyc2lvbigpLCB0YXJnZXQuZ2V0VmVyc2lvbigpICk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCBtYW5hZ2VkLmdldFNjb3BlKCksIHRhcmdldC5nZXRTY29wZSgpICk7Ci0gICAgLy8KLSAgICAvLyBhc3NlcnRFcXVhbHMoICIyIiwgdGFyZ2V0Mi5nZXRWZXJzaW9uKCkgKTsKLSAgICAvLyBhc3NlcnRFcXVhbHMoIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUsIHRhcmdldDIuZ2V0U2NvcGUoKSApOwotICAgIC8vIH0KLQotICAgIC8vIHB1YmxpYyB2b2lkIHRlc3RfYnVpbGRNYW5hZ2VkVmVyc2lvbk1hcF9Ob25UcmFuc2l0aXZlUmVzb2x1dGlvbigpCi0gICAgLy8gdGhyb3dzIEFydGlmYWN0UmVzb2x1dGlvbkV4Y2VwdGlvbiwgQXJjaGl2ZUNyZWF0aW9uRXhjZXB0aW9uLCBJbnZhbGlkVmVyc2lvblNwZWNpZmljYXRpb25FeGNlcHRpb24sCi0gICAgLy8gSW52YWxpZERlcGVuZGVuY3lWZXJzaW9uRXhjZXB0aW9uCi0gICAgLy8gewotICAgIC8vIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgLy8KLSAgICAvLyBEZXBlbmRlbmN5U2V0IGRzID0gbmV3IERlcGVuZGVuY3lTZXQoKTsKLSAgICAvLyBkcy5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfUFJPVklERUQgKTsKLSAgICAvLyBkcy5zZXRVc2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKCBmYWxzZSApOwotICAgIC8vCi0gICAgLy8gYXNzZW1ibHkuYWRkRGVwZW5kZW5jeVNldCggZHMgKTsKLSAgICAvLwotICAgIC8vIE1vZHVsZVNldCBtcyA9IG5ldyBNb2R1bGVTZXQoKTsKLSAgICAvLyBNb2R1bGVCaW5hcmllcyBtYiA9IG5ldyBNb2R1bGVCaW5hcmllcygpOwotICAgIC8vIG1zLnNldEJpbmFyaWVzKCBtYiApOwotICAgIC8vCi0gICAgLy8gRGVwZW5kZW5jeVNldCBtZHMgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgIC8vIG1kcy5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfUFJPVklERUQgKTsKLSAgICAvLyBtZHMuc2V0VXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcyggZmFsc2UgKTsKLSAgICAvLwotICAgIC8vIG1iLmFkZERlcGVuZGVuY3lTZXQoIG1kcyApOwotICAgIC8vCi0gICAgLy8gYXNzZW1ibHkuYWRkTW9kdWxlU2V0KCBtcyApOwotICAgIC8vCi0gICAgLy8gTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBjcmVhdGVNYXZlblByb2plY3QoICJncm91cCIsICJhcnRpZmFjdCIsICIxIiwgbmV3IEZpbGUoICJiYXNlIiApICk7Ci0gICAgLy8KLSAgICAvLyBEZXBlbmRlbmN5IGQxID0gbmV3IERlcGVuZGVuY3koKTsKLSAgICAvLyBkMS5zZXRHcm91cElkKCAiZ3JvdXAuZGVwIiApOwotICAgIC8vIGQxLnNldEFydGlmYWN0SWQoICJkZXAxIiApOwotICAgIC8vIGQxLnNldFZlcnNpb24oICIxIiApOwotICAgIC8vIGQxLnNldFNjb3BlKCBBcnRpZmFjdC5TQ09QRV9DT01QSUxFICk7Ci0gICAgLy8KLSAgICAvLyBwcm9qZWN0LmdldE1vZGVsKCkuYWRkRGVwZW5kZW5jeSggZDEgKTsKLSAgICAvLwotICAgIC8vIERlcGVuZGVuY3kgZDIgPSBuZXcgRGVwZW5kZW5jeSgpOwotICAgIC8vIGQyLnNldEdyb3VwSWQoICJncm91cC5kZXAiICk7Ci0gICAgLy8gZDIuc2V0QXJ0aWZhY3RJZCggImRlcDIiICk7Ci0gICAgLy8gZDIuc2V0VmVyc2lvbiggIjEiICk7Ci0gICAgLy8gZDIuc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX1BST1ZJREVEICk7Ci0gICAgLy8KLSAgICAvLyBwcm9qZWN0LmdldE1vZGVsKCkuYWRkRGVwZW5kZW5jeSggZDIgKTsKLSAgICAvLwotICAgIC8vIERlcGVuZGVuY3kgZDMgPSBuZXcgRGVwZW5kZW5jeSgpOwotICAgIC8vIGQzLnNldEdyb3VwSWQoICJncm91cC5kZXAiICk7Ci0gICAgLy8gZDMuc2V0QXJ0aWZhY3RJZCggImRlcDMiICk7Ci0gICAgLy8gZDMuc2V0VmVyc2lvbiggIjEiICk7Ci0gICAgLy8gZDMuc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX1BST1ZJREVEICk7Ci0gICAgLy8KLSAgICAvLyBwcm9qZWN0LmdldE1vZGVsKCkuYWRkRGVwZW5kZW5jeSggZDMgKTsKLSAgICAvLwotICAgIC8vIE1hdmVuUHJvamVjdCBtb2R1bGUgPSBjcmVhdGVNYXZlblByb2plY3QoICJncm91cCIsICJtb2R1bGUiLCAiMSIsIG5ldyBGaWxlKCAiYmFzZS9tb2R1bGUiICkgKTsKLSAgICAvLwotICAgIC8vIHByb2plY3QuZ2V0TW9kZWwoKS5hZGRNb2R1bGUoIG1vZHVsZS5nZXRBcnRpZmFjdElkKCkgKTsKLSAgICAvLwotICAgIC8vIERlcGVuZGVuY3kgbWQgPSBuZXcgRGVwZW5kZW5jeSgpOwotICAgIC8vIG1kLnNldEdyb3VwSWQoICJncm91cC5kZXAiICk7Ci0gICAgLy8gbWQuc2V0QXJ0aWZhY3RJZCggImRlcDMiICk7Ci0gICAgLy8gbWQuc2V0VmVyc2lvbiggIjIiICk7Ci0gICAgLy8gbWQuc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX1BST1ZJREVEICk7Ci0gICAgLy8KLSAgICAvLyBtb2R1bGUuZ2V0TW9kZWwoKS5hZGREZXBlbmRlbmN5KCBtZCApOwotICAgIC8vCi0gICAgLy8gTGlzdCBhbGxQcm9qZWN0cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAvLyBhbGxQcm9qZWN0cy5hZGQoIHByb2plY3QgKTsKLSAgICAvLyBhbGxQcm9qZWN0cy5hZGQoIG1vZHVsZSApOwotICAgIC8vCi0gICAgLy8gTW9ja01hbmFnZXIgbW0gPSBuZXcgTW9ja01hbmFnZXIoKTsKLSAgICAvLwotICAgIC8vIE1vY2tDb250cm9sIGNzQ29udHJvbCA9IE1vY2tDb250cm9sLmNyZWF0ZUNvbnRyb2woIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MgKTsKLSAgICAvLyBtbS5hZGQoIGNzQ29udHJvbCApOwotICAgIC8vCi0gICAgLy8gQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjcyA9IChBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlKSBjc0NvbnRyb2wuZ2V0TW9jaygpOwotICAgIC8vCi0gICAgLy8gY3MuZ2V0UHJvamVjdCgpOwotICAgIC8vIGNzQ29udHJvbC5zZXRSZXR1cm5WYWx1ZSggcHJvamVjdCwgTW9ja0NvbnRyb2wuWkVST19PUl9NT1JFICk7Ci0gICAgLy8KLSAgICAvLyBjcy5nZXRSZWFjdG9yUHJvamVjdHMoKTsKLSAgICAvLyBjc0NvbnRyb2wuc2V0UmV0dXJuVmFsdWUoIGFsbFByb2plY3RzLCBNb2NrQ29udHJvbC5aRVJPX09SX01PUkUgKTsKLSAgICAvLwotICAgIC8vIGNzLmdldFJlbW90ZVJlcG9zaXRvcmllcygpOwotICAgIC8vIGNzQ29udHJvbC5zZXRSZXR1cm5WYWx1ZSggQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgTW9ja0NvbnRyb2wuWkVST19PUl9NT1JFICk7Ci0gICAgLy8KLSAgICAvLyBtbS5yZXBsYXlBbGwoKTsKLSAgICAvLwotICAgIC8vIERlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgRGVmYXVsdERlcGVuZGVuY3lSZXNvbHZlcigpOwotICAgIC8vIHJlc29sdmVyLnNldEFydGlmYWN0RmFjdG9yeSggZmFjdG9yeSApOwotICAgIC8vIHJlc29sdmVyLnNldExvZ2dlciggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKTsKLSAgICAvLwotICAgIC8vIE1hcCBtYW5hZ2VkVmVyc2lvbk1hcCA9IHJlc29sdmVyLmJ1aWxkTWFuYWdlZFZlcnNpb25NYXAoIGFzc2VtYmx5LCBjcyApOwotICAgIC8vCi0gICAgLy8gewotICAgIC8vIERlcGVuZGVuY3kgZCA9IGQxOwotICAgIC8vIEFydGlmYWN0IGEgPSAoQXJ0aWZhY3QpIG1hbmFnZWRWZXJzaW9uTWFwLmdldCggZC5nZXRNYW5hZ2VtZW50S2V5KCkgKTsKLSAgICAvLyBhc3NlcnROdWxsKCBhICk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gewotICAgIC8vIERlcGVuZGVuY3kgZCA9IGQyOwotICAgIC8vIEFydGlmYWN0IGEgPSAoQXJ0aWZhY3QpIG1hbmFnZWRWZXJzaW9uTWFwLmdldCggZC5nZXRNYW5hZ2VtZW50S2V5KCkgKTsKLSAgICAvLyBhc3NlcnROb3ROdWxsKCBhICk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCBkLmdldFZlcnNpb24oKSwgYS5nZXRWZXJzaW9uKCkgKTsKLSAgICAvLyBhc3NlcnRFcXVhbHMoIGQuZ2V0U2NvcGUoKSwgYS5nZXRTY29wZSgpICk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gewotICAgIC8vIERlcGVuZGVuY3kgZCA9IGQzOwotICAgIC8vIEFydGlmYWN0IGEgPSAoQXJ0aWZhY3QpIG1hbmFnZWRWZXJzaW9uTWFwLmdldCggZC5nZXRNYW5hZ2VtZW50S2V5KCkgKTsKLSAgICAvLyBhc3NlcnROb3ROdWxsKCBhICk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCBkLmdldFZlcnNpb24oKSwgYS5nZXRWZXJzaW9uKCkgKTsKLSAgICAvLyBhc3NlcnRFcXVhbHMoIGQuZ2V0U2NvcGUoKSwgYS5nZXRTY29wZSgpICk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gbW0udmVyaWZ5QWxsKCk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gcHVibGljIHZvaWQgdGVzdF9idWlsZE1hbmFnZWRWZXJzaW9uTWFwX1RyYW5zaXRpdmVSZXNvbHV0aW9uKCkKLSAgICAvLyB0aHJvd3MgQXJ0aWZhY3RSZXNvbHV0aW9uRXhjZXB0aW9uLCBBcmNoaXZlQ3JlYXRpb25FeGNlcHRpb24sIEludmFsaWRWZXJzaW9uU3BlY2lmaWNhdGlvbkV4Y2VwdGlvbiwKLSAgICAvLyBJbnZhbGlkRGVwZW5kZW5jeVZlcnNpb25FeGNlcHRpb24KLSAgICAvLyB7Ci0gICAgLy8gQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAvLwotICAgIC8vIERlcGVuZGVuY3lTZXQgZHMgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgIC8vIGRzLnNldFNjb3BlKCBBcnRpZmFjdC5TQ09QRV9DT01QSUxFICk7Ci0gICAgLy8gZHMuc2V0VXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcyggdHJ1ZSApOwotICAgIC8vCi0gICAgLy8gYXNzZW1ibHkuYWRkRGVwZW5kZW5jeVNldCggZHMgKTsKLSAgICAvLwotICAgIC8vIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gY3JlYXRlTWF2ZW5Qcm9qZWN0KCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAiMSIsIG5ldyBGaWxlKCAiYmFzZSIgKSApOwotICAgIC8vCi0gICAgLy8gRGVwZW5kZW5jeSBkMSA9IG5ldyBEZXBlbmRlbmN5KCk7Ci0gICAgLy8gZDEuc2V0R3JvdXBJZCggImdyb3VwLmRlcCIgKTsKLSAgICAvLyBkMS5zZXRBcnRpZmFjdElkKCAiZGVwMSIgKTsKLSAgICAvLyBkMS5zZXRWZXJzaW9uKCAiMSIgKTsKLSAgICAvLyBkMS5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfQ09NUElMRSApOwotICAgIC8vCi0gICAgLy8gcHJvamVjdC5nZXRNb2RlbCgpLmFkZERlcGVuZGVuY3koIGQxICk7Ci0gICAgLy8KLSAgICAvLyBEZXBlbmRlbmN5IGQyID0gbmV3IERlcGVuZGVuY3koKTsKLSAgICAvLyBkMi5zZXRHcm91cElkKCAiZ3JvdXAuZGVwIiApOwotICAgIC8vIGQyLnNldEFydGlmYWN0SWQoICJkZXAyIiApOwotICAgIC8vIGQyLnNldFZlcnNpb24oICIxIiApOwotICAgIC8vIGQyLnNldFNjb3BlKCBBcnRpZmFjdC5TQ09QRV9DT01QSUxFICk7Ci0gICAgLy8gZmluYWwgQXJ0aWZhY3QgYTIgPSBmYWN0b3J5LmNyZWF0ZUFydGlmYWN0KCBkMi5nZXRHcm91cElkKCksIGQyLmdldEFydGlmYWN0SWQoKSwgZDIuZ2V0VmVyc2lvbigpLCBkMi5nZXRTY29wZSgpLAotICAgIC8vICJqYXIiICk7Ci0gICAgLy8KLSAgICAvLyBwcm9qZWN0LmdldE1vZGVsKCkuYWRkRGVwZW5kZW5jeSggZDIgKTsKLSAgICAvLwotICAgIC8vIERlcGVuZGVuY3kgZDMgPSBuZXcgRGVwZW5kZW5jeSgpOwotICAgIC8vIGQzLnNldEdyb3VwSWQoICJncm91cC5kZXAiICk7Ci0gICAgLy8gZDMuc2V0QXJ0aWZhY3RJZCggImRlcDMiICk7Ci0gICAgLy8gZDMuc2V0VmVyc2lvbiggIjEiICk7Ci0gICAgLy8gZDMuc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKTsKLSAgICAvLwotICAgIC8vIHByb2plY3QuZ2V0TW9kZWwoKS5hZGREZXBlbmRlbmN5KCBkMyApOwotICAgIC8vCi0gICAgLy8gZmluYWwgQXJ0aWZhY3QgYTJhID0gZmFjdG9yeS5jcmVhdGVBcnRpZmFjdCggZDMuZ2V0R3JvdXBJZCgpLCBkMy5nZXRBcnRpZmFjdElkKCksICIyIiwgQXJ0aWZhY3QuU0NPUEVfUlVOVElNRSwKLSAgICAvLyAiamFyIiApOwotICAgIC8vCi0gICAgLy8gTW9ja01hbmFnZXIgbW0gPSBuZXcgTW9ja01hbmFnZXIoKTsKLSAgICAvLwotICAgIC8vIE1vY2tDb250cm9sIG1zQ29udHJvbCA9IE1vY2tDb250cm9sLmNyZWF0ZUNvbnRyb2woIEFydGlmYWN0TWV0YWRhdGFTb3VyY2UuY2xhc3MgKTsKLSAgICAvLyBtbS5hZGQoIG1zQ29udHJvbCApOwotICAgIC8vCi0gICAgLy8gQXJ0aWZhY3RNZXRhZGF0YVNvdXJjZSBtcyA9IChBcnRpZmFjdE1ldGFkYXRhU291cmNlKSBtc0NvbnRyb2wuZ2V0TW9jaygpOwotICAgIC8vCi0gICAgLy8gdHJ5Ci0gICAgLy8gewotICAgIC8vIG1zLnJldHJpZXZlKCBudWxsLCBudWxsLCBudWxsICk7Ci0gICAgLy8gfQotICAgIC8vIGNhdGNoICggQXJ0aWZhY3RNZXRhZGF0YVJldHJpZXZhbEV4Y2VwdGlvbiBlICkKLSAgICAvLyB7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gbXNDb250cm9sLnNldERlZmF1bHRSZXR1cm5WYWx1ZSggbmV3IFJlc29sdXRpb25Hcm91cCggbnVsbCwgQ29sbGVjdGlvbnMuRU1QVFlfU0VULCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUICkgKTsKLSAgICAvLyBtc0NvbnRyb2wuc2V0TWF0Y2hlciggbmV3IEFyZ3VtZW50c01hdGNoZXIoKQotICAgIC8vIHsKLSAgICAvLyBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKCBPYmplY3RbXSBleHBlY3RlZCwgT2JqZWN0W10gYWN0dWFsICkKLSAgICAvLyB7Ci0gICAgLy8gQXJ0aWZhY3QgYSA9IChBcnRpZmFjdCkgYWN0dWFsWzBdOwotICAgIC8vCi0gICAgLy8gcmV0dXJuIGEyLmdldEFydGlmYWN0SWQoKS5lcXVhbHMoIGEuZ2V0QXJ0aWZhY3RJZCgpICk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gcHVibGljIFN0cmluZyB0b1N0cmluZyggT2JqZWN0W10gYXJncyApCi0gICAgLy8gewotICAgIC8vIHJldHVybiAid2l0aCBhcnRpZmFjdDogIiArIGFyZ3NbMF0gOwotICAgIC8vIH0KLSAgICAvLwotICAgIC8vIH0gKTsKLSAgICAvLyBtc0NvbnRyb2wuc2V0UmV0dXJuVmFsdWUoIG5ldyBSZXNvbHV0aW9uR3JvdXAoIGEyLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oIGEyYSApLCBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUICkgKTsKLSAgICAvLwotICAgIC8vCi0gICAgLy8gTW9ja0NvbnRyb2wgY3NDb250cm9sID0gTW9ja0NvbnRyb2wuY3JlYXRlQ29udHJvbCggQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZS5jbGFzcyApOwotICAgIC8vIG1tLmFkZCggY3NDb250cm9sICk7Ci0gICAgLy8KLSAgICAvLyBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNzID0gKEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UpIGNzQ29udHJvbC5nZXRNb2NrKCk7Ci0gICAgLy8KLSAgICAvLyBjcy5nZXRQcm9qZWN0KCk7Ci0gICAgLy8gY3NDb250cm9sLnNldFJldHVyblZhbHVlKCBwcm9qZWN0LCBNb2NrQ29udHJvbC5aRVJPX09SX01PUkUgKTsKLSAgICAvLwotICAgIC8vIFN0cmluZyB0bXBEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoICJqYXZhLmlvLnRtcGRpciIgKTsKLSAgICAvLyBBcnRpZmFjdFJlcG9zaXRvcnkgbHIgPSByZXBvRmFjdG9yeS5jcmVhdGVBcnRpZmFjdFJlcG9zaXRvcnkoICJsb2NhbCIsICJmaWxlOi8vIiArIHRtcERpciwgbGF5b3V0LCBudWxsLCBudWxsICk7Ci0gICAgLy8KLSAgICAvLyBjcy5nZXRMb2NhbFJlcG9zaXRvcnkoKTsKLSAgICAvLyBjc0NvbnRyb2wuc2V0UmV0dXJuVmFsdWUoIGxyLCBNb2NrQ29udHJvbC5aRVJPX09SX01PUkUgKTsKLSAgICAvLwotICAgIC8vIGNzLmdldFJlbW90ZVJlcG9zaXRvcmllcygpOwotICAgIC8vIGNzQ29udHJvbC5zZXRSZXR1cm5WYWx1ZSggQ29sbGVjdGlvbnMuRU1QVFlfTElTVCwgTW9ja0NvbnRyb2wuWkVST19PUl9NT1JFICk7Ci0gICAgLy8KLSAgICAvLyBtbS5yZXBsYXlBbGwoKTsKLSAgICAvLwotICAgIC8vIERlZmF1bHREZXBlbmRlbmN5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgRGVmYXVsdERlcGVuZGVuY3lSZXNvbHZlcigpOwotICAgIC8vIHJlc29sdmVyLnNldEFydGlmYWN0TWV0YWRhdGFTb3VyY2UoIG1zICk7Ci0gICAgLy8gcmVzb2x2ZXIuc2V0QXJ0aWZhY3RDb2xsZWN0b3IoIGNvbGxlY3RvciApOwotICAgIC8vIHJlc29sdmVyLnNldEFydGlmYWN0RmFjdG9yeSggZmFjdG9yeSApOwotICAgIC8vIHJlc29sdmVyLnNldExvZ2dlciggbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKTsKLSAgICAvLwotICAgIC8vIE1hcCBtYW5hZ2VkVmVyc2lvbk1hcCA9IHJlc29sdmVyLmJ1aWxkTWFuYWdlZFZlcnNpb25NYXAoIGFzc2VtYmx5LCBjcyApOwotICAgIC8vCi0gICAgLy8gewotICAgIC8vIERlcGVuZGVuY3kgZCA9IGQxOwotICAgIC8vIEFydGlmYWN0IGEgPSAoQXJ0aWZhY3QpIG1hbmFnZWRWZXJzaW9uTWFwLmdldCggZC5nZXRNYW5hZ2VtZW50S2V5KCkgKTsKLSAgICAvLyBhc3NlcnROb3ROdWxsKCBhICk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCBkLmdldFZlcnNpb24oKSwgYS5nZXRWZXJzaW9uKCkgKTsKLSAgICAvLyBhc3NlcnRFcXVhbHMoIGQuZ2V0U2NvcGUoKSwgYS5nZXRTY29wZSgpICk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gewotICAgIC8vIERlcGVuZGVuY3kgZCA9IGQyOwotICAgIC8vIEFydGlmYWN0IGEgPSAoQXJ0aWZhY3QpIG1hbmFnZWRWZXJzaW9uTWFwLmdldCggZC5nZXRNYW5hZ2VtZW50S2V5KCkgKTsKLSAgICAvLyBhc3NlcnROb3ROdWxsKCBhICk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCBkLmdldFZlcnNpb24oKSwgYS5nZXRWZXJzaW9uKCkgKTsKLSAgICAvLyBhc3NlcnRFcXVhbHMoIGQuZ2V0U2NvcGUoKSwgYS5nZXRTY29wZSgpICk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gewotICAgIC8vIERlcGVuZGVuY3kgZCA9IGQzOwotICAgIC8vIEFydGlmYWN0IGEgPSAoQXJ0aWZhY3QpIG1hbmFnZWRWZXJzaW9uTWFwLmdldCggZC5nZXRNYW5hZ2VtZW50S2V5KCkgKTsKLSAgICAvLyBhc3NlcnROb3ROdWxsKCBhICk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCBkLmdldFZlcnNpb24oKSwgYS5nZXRWZXJzaW9uKCkgKTsKLSAgICAvLyBhc3NlcnRFcXVhbHMoIGQuZ2V0U2NvcGUoKSwgYS5nZXRTY29wZSgpICk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gbW0udmVyaWZ5QWxsKCk7Ci0gICAgLy8gfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlcG9zaXRvcnlXaXRoSWQoIGZpbmFsIFN0cmluZyByZXBvSWQsIGZpbmFsIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiByZXBvcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzaG91bGRFeGlzdCApCi0gICAgewotICAgICAgICBpZiAoICggcmVwb3MgPT0gbnVsbCB8fCByZXBvcy5pc0VtcHR5KCkgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICggc2hvdWxkRXhpc3QgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZhaWwoICJSZXBvc2l0b3J5IHdpdGggaWQ6ICIgKyByZXBvSWQgKyAiIHNob3VsZCBiZSBwcmVzZW50LCBidXQgcmVwb3NpdG9yeSBsaXN0IGlzIG51bGwgb3IgZW1wdHkuIiApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChmaW5hbCBBcnRpZmFjdFJlcG9zaXRvcnkgcmVwbyA6IHJlcG9zKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcG9JZC5lcXVhbHMocmVwby5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCBzaG91bGRFeGlzdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggIlJlcG9zaXRvcnkgd2l0aCBpZDogIiArIHJlcG9JZCArICIgc2hvdWxkIGJlIHByZXNlbnQgaW4gcmVwb3NpdG9yeSBsaXN0LiIsIGZvdW5kICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UoICJSZXBvc2l0b3J5IHdpdGggaWQ6ICIgKyByZXBvSWQgKyAiIHNob3VsZCBOT1QgYmUgcHJlc2VudCBpbiByZXBvc2l0b3J5IGxpc3QuIiwgZm91bmQgKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IGNyZWF0ZU1hdmVuUHJvamVjdCggZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLCBmaW5hbCBTdHJpbmcgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciApCi0gICAgewotICAgICAgICBmaW5hbCBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotCi0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoIGdyb3VwSWQgKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggYXJ0aWZhY3RJZCApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0gICAgICAgIG1vZGVsLnNldFBhY2thZ2luZyggInBvbSIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3QgcG9tQXJ0aWZhY3QgPSBmYWN0b3J5LmNyZWF0ZVByb2plY3RBcnRpZmFjdCggZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgdmVyc2lvbiApOwotICAgICAgICBwcm9qZWN0LnNldEFydGlmYWN0KCBwb21BcnRpZmFjdCApOwotCi0gICAgICAgIHByb2plY3Quc2V0RmlsZSggbmV3IEZpbGUoIGJhc2VkaXIsICJwb20ueG1sIiApICk7Ci0KLSAgICAgICAgcmV0dXJuIHByb2plY3Q7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2FydGlmYWN0L1Jlc29sdXRpb25NYW5hZ2VtZW50SW5mb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMxY2U5ZC4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvYXJ0aWZhY3QvUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcnRpZmFjdDsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LkFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuRGVmYXVsdEFydGlmYWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuaGFuZGxlci5EZWZhdWx0QXJ0aWZhY3RIYW5kbGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QudmVyc2lvbmluZy5WZXJzaW9uUmFuZ2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1wdWJsaWMgY2xhc3MgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvVGVzdAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRTaW5nbGVBcnRpZmFjdFdpdGhSZXBsYWNlbWVuKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvIHJtaSA9IG5ldyBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8oIG5ldyBNYXZlblByb2plY3QoICApICk7Ci0gICAgICAgIEFydGlmYWN0IGExID0gbmV3IERlZmF1bHRBcnRpZmFjdCggImdyb3VwaWQiLCAiMSIsIFZlcnNpb25SYW5nZS5jcmVhdGVGcm9tVmVyc2lvbigiMS4wIiksICJ0ZXN0IiwgImphciIsIG51bGwsIG5ldyBEZWZhdWx0QXJ0aWZhY3RIYW5kbGVyKCkgKTsKLSAgICAgICAgcm1pLmFkZEFydGlmYWN0cyggQ29sbGVjdGlvbnMuc2luZ2xldG9uKCBhMSkpOwotICAgICAgICBBcnRpZmFjdCBhMiA9IG5ldyBEZWZhdWx0QXJ0aWZhY3QoICJncm91cGlkIiwgIjEiLCBWZXJzaW9uUmFuZ2UuY3JlYXRlRnJvbVZlcnNpb24oIjEuMCIpLCAiY29tcGlsZSIsICJqYXIiLCBudWxsLCBuZXcgRGVmYXVsdEFydGlmYWN0SGFuZGxlcigpICk7Ci0gICAgICAgIHJtaS5hZGRBcnRpZmFjdHMoIENvbGxlY3Rpb25zLnNpbmdsZXRvbiggYTIpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBybWkuZ2V0QXJ0aWZhY3RzKCkuc2l6ZSgpKTsKLSAgICAgICAgQXJ0aWZhY3QgbmV4dCA9IHJtaS5nZXRBcnRpZmFjdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb21waWxlIiwgbmV4dC5nZXRTY29wZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkTXVsdGlBcnRpZmFjdFdpdGhSZXBsYWNlbWVuKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgUmVzb2x1dGlvbk1hbmFnZW1lbnRJbmZvIHJtaSA9IG5ldyBSZXNvbHV0aW9uTWFuYWdlbWVudEluZm8oIG5ldyBNYXZlblByb2plY3QoICApICk7Ci0gICAgICAgIEFydGlmYWN0IGExID0gbmV3IERlZmF1bHRBcnRpZmFjdCggImdyb3VwaWQiLCAiYTEiLCBWZXJzaW9uUmFuZ2UuY3JlYXRlRnJvbVZlcnNpb24oIjEuMCIpLCAidGVzdCIsICJqYXIiLCBudWxsLCBuZXcgRGVmYXVsdEFydGlmYWN0SGFuZGxlcigpICk7Ci0gICAgICAgIEFydGlmYWN0IGEyID0gbmV3IERlZmF1bHRBcnRpZmFjdCggImdyb3VwaWQiLCAiYTIiLCBWZXJzaW9uUmFuZ2UuY3JlYXRlRnJvbVZlcnNpb24oIjEuMCIpLCAidGVzdCIsICJqYXIiLCBudWxsLCBuZXcgRGVmYXVsdEFydGlmYWN0SGFuZGxlcigpICk7Ci0gICAgICAgIEFydGlmYWN0IGEzID0gbmV3IERlZmF1bHRBcnRpZmFjdCggImdyb3VwaWQiLCAiYTMiLCBWZXJzaW9uUmFuZ2UuY3JlYXRlRnJvbVZlcnNpb24oIjEuMCIpLCAidGVzdCIsICJqYXIiLCBudWxsLCBuZXcgRGVmYXVsdEFydGlmYWN0SGFuZGxlcigpICk7Ci0gICAgICAgIHJtaS5hZGRBcnRpZmFjdHMoIG5ldyBIYXNoU2V0PEFydGlmYWN0PiggQXJyYXlzLmFzTGlzdCggYTEsIGEyLCBhMyApKSk7Ci0gICAgICAgIEFydGlmYWN0IGIyID0gbmV3IERlZmF1bHRBcnRpZmFjdCggImdyb3VwaWQiLCAiYTIiLCBWZXJzaW9uUmFuZ2UuY3JlYXRlRnJvbVZlcnNpb24oIjEuMCIpLCAiY29tcGlsZSIsICJqYXIiLCBudWxsLCBuZXcgRGVmYXVsdEFydGlmYWN0SGFuZGxlcigpICk7Ci0gICAgICAgIEFydGlmYWN0IGIzID0gbmV3IERlZmF1bHRBcnRpZmFjdCggImdyb3VwaWQiLCAiYTMiLCBWZXJzaW9uUmFuZ2UuY3JlYXRlRnJvbVZlcnNpb24oIjEuMCIpLCAiY29tcGlsZSIsICJqYXIiLCBudWxsLCBuZXcgRGVmYXVsdEFydGlmYWN0SGFuZGxlcigpICk7Ci0gICAgICAgIHJtaS5hZGRBcnRpZmFjdHMoIG5ldyBIYXNoU2V0PEFydGlmYWN0PiggQXJyYXlzLmFzTGlzdCggYjIsIGIzKSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIDMsIHJtaS5nZXRBcnRpZmFjdHMoKS5zaXplKCkpOwotICAgICAgICBpbnQgY29tcGlsZSA9IDA7Ci0gICAgICAgIGludCB0ZXN0ID0gMDsKLSAgICAgICAgZm9yICggQXJ0aWZhY3QgYXJ0aWZhY3QgOiBybWkuZ2V0QXJ0aWZhY3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUuZXF1YWxzKCBhcnRpZmFjdC5nZXRTY29wZSgpICkpIGNvbXBpbGUrKzsKLSAgICAgICAgICAgIGVsc2UgdGVzdCsrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBjb21waWxlKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRlc3QpOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZmlsdGVyL0NvbXBvbmVudHNYbWxBcmNoaXZlckZpbGVGaWx0ZXJUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvZmlsdGVyL0NvbXBvbmVudHNYbWxBcmNoaXZlckZpbGVGaWx0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OTMxMWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ZpbHRlci9Db21wb25lbnRzWG1sQXJjaGl2ZXJGaWxlRmlsdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZmlsdGVyOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuemlwLlppcEZpbGU7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS50ZXN0dXRpbHMuVGVzdEZpbGVNYW5hZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZUVudHJ5OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZUZpbmFsaXplcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVkRmlsZVNldDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuQXJjaGl2ZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5hcmNoaXZlci5GaWxlU2V0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuUmVzb3VyY2VJdGVyYXRvcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLmRpYWdzLk5vT3BBcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLnppcC5aaXBBcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudHMuaW8ucmVzb3VyY2VzLlBsZXh1c0lvUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLnJlc291cmNlcy5QbGV4dXNJb1Jlc291cmNlQ29sbGVjdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuUHJldHR5UHJpbnRYTUxXcml0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLnhtbC5YcHAzRG9tOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwucHVsbC5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5qZG9tLkRvY3VtZW50OwotaW1wb3J0IG9yZy5qZG9tLkpET01FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmpkb20uVGV4dDsKLWltcG9ydCBvcmcuamRvbS5pbnB1dC5TQVhCdWlsZGVyOwotaW1wb3J0IG9yZy5qZG9tLnhwYXRoLlhQYXRoOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotCi1wdWJsaWMgY2xhc3MgQ29tcG9uZW50c1htbEFyY2hpdmVyRmlsZUZpbHRlclRlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0gICAgcHJpdmF0ZSBDb21wb25lbnRzWG1sQXJjaGl2ZXJGaWxlRmlsdGVyIGZpbHRlcjsKLQotICAgIHByaXZhdGUgZmluYWwgVGVzdEZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gbmV3IFRlc3RGaWxlTWFuYWdlciggImNvbXBvbmVudHNYbWxBcmNoaXZlckZpbGVGaWx0ZXIudGVzdCIsICIuemlwIiApOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKQotICAgIHsKLSAgICAgICAgZmlsdGVyID0gbmV3IENvbXBvbmVudHNYbWxBcmNoaXZlckZpbGVGaWx0ZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmlsZU1hbmFnZXIuY2xlYW5VcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDb21wb25lbnRzWG1sX1Nob3VsZEFkZENvbXBvbmVudFdpdGhvdXRSb2xlSGludCgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgUmVhZGVyIHJlYWRlciA9IHdyaXRlQ29tcG9uZW50c1htbCgKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIG5ldyBDb21wb25lbnREZWYoICJyb2xlIiwgbnVsbCwgIm9yZy5hcGFjaGUubWF2ZW4uSW1wbCIgKSApICk7Ci0KLSAgICAgICAgZmlsdGVyLmFkZENvbXBvbmVudHNYbWwoIHJlYWRlciApOwotCi0gICAgICAgIGFzc2VydEZhbHNlKCBmaWx0ZXIuY29tcG9uZW50cy5pc0VtcHR5KCkgKTsKLQotICAgICAgICBmaW5hbCBYcHAzRG9tIGNvbXBvbmVudERvbSA9IGZpbHRlci5jb21wb25lbnRzLmdldCggInJvbGUiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAicm9sZSIsIGNvbXBvbmVudERvbS5nZXRDaGlsZCggInJvbGUiICkuZ2V0VmFsdWUoKSApOwotICAgICAgICBhc3NlcnROdWxsKCBjb21wb25lbnREb20uZ2V0Q2hpbGQoICJyb2xlLWhpbnQiICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAib3JnLmFwYWNoZS5tYXZlbi5JbXBsIiwgY29tcG9uZW50RG9tLmdldENoaWxkKCAiaW1wbGVtZW50YXRpb24iICkuZ2V0VmFsdWUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDb21wb25lbnRzWG1sX1Nob3VsZEFkZENvbXBvbmVudFdpdGhSb2xlSGludCgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgUmVhZGVyIHJlYWRlciA9IHdyaXRlQ29tcG9uZW50c1htbCgKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIG5ldyBDb21wb25lbnREZWYoICJyb2xlIiwgImhpbnQiLCAib3JnLmFwYWNoZS5tYXZlbi5JbXBsIiApICkgKTsKLQotICAgICAgICBmaWx0ZXIuYWRkQ29tcG9uZW50c1htbCggcmVhZGVyICk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIGZpbHRlci5jb21wb25lbnRzLmlzRW1wdHkoKSApOwotCi0gICAgICAgIGZpbmFsIFhwcDNEb20gY29tcG9uZW50RG9tID0gZmlsdGVyLmNvbXBvbmVudHMuZ2V0KCAicm9sZWhpbnQiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAicm9sZSIsIGNvbXBvbmVudERvbS5nZXRDaGlsZCggInJvbGUiICkuZ2V0VmFsdWUoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJoaW50IiwgY29tcG9uZW50RG9tLmdldENoaWxkKCAicm9sZS1oaW50IiApLmdldFZhbHVlKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAib3JnLmFwYWNoZS5tYXZlbi5JbXBsIiwgY29tcG9uZW50RG9tLmdldENoaWxkKCAiaW1wbGVtZW50YXRpb24iICkuZ2V0VmFsdWUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRDb21wb25lbnRzWG1sX1Nob3VsZEFkZFR3b0NvbXBvbmVudHNXaXRoUm9sZUhpbnRzKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PENvbXBvbmVudERlZj4gZGVmcyA9IG5ldyBBcnJheUxpc3Q8Q29tcG9uZW50RGVmPigpOwotCi0gICAgICAgIGRlZnMuYWRkKCBuZXcgQ29tcG9uZW50RGVmKCAicm9sZSIsICJoaW50IiwgIm9yZy5hcGFjaGUubWF2ZW4uSW1wbCIgKSApOwotICAgICAgICBkZWZzLmFkZCggbmV3IENvbXBvbmVudERlZiggInJvbGUiLCAiaGludDIiLCAib3JnLmFwYWNoZS5tYXZlbi5JbXBsMiIgKSApOwotCi0gICAgICAgIGZpbmFsIFJlYWRlciByZWFkZXIgPSB3cml0ZUNvbXBvbmVudHNYbWwoIGRlZnMgKTsKLQotICAgICAgICBmaWx0ZXIuYWRkQ29tcG9uZW50c1htbCggcmVhZGVyICk7Ci0KLSAgICAgICAgYXNzZXJ0RmFsc2UoIGZpbHRlci5jb21wb25lbnRzLmlzRW1wdHkoKSApOwotCi0gICAgICAgIFhwcDNEb20gY29tcG9uZW50RG9tID0gZmlsdGVyLmNvbXBvbmVudHMuZ2V0KCAicm9sZWhpbnQiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAicm9sZSIsIGNvbXBvbmVudERvbS5nZXRDaGlsZCggInJvbGUiICkuZ2V0VmFsdWUoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJoaW50IiwgY29tcG9uZW50RG9tLmdldENoaWxkKCAicm9sZS1oaW50IiApLmdldFZhbHVlKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAib3JnLmFwYWNoZS5tYXZlbi5JbXBsIiwgY29tcG9uZW50RG9tLmdldENoaWxkKCAiaW1wbGVtZW50YXRpb24iICkuZ2V0VmFsdWUoKSApOwotCi0gICAgICAgIGNvbXBvbmVudERvbSA9IGZpbHRlci5jb21wb25lbnRzLmdldCggInJvbGVoaW50MiIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJyb2xlIiwgY29tcG9uZW50RG9tLmdldENoaWxkKCAicm9sZSIgKS5nZXRWYWx1ZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggImhpbnQyIiwgY29tcG9uZW50RG9tLmdldENoaWxkKCAicm9sZS1oaW50IiApLmdldFZhbHVlKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAib3JnLmFwYWNoZS5tYXZlbi5JbXBsMiIsIGNvbXBvbmVudERvbS5nZXRDaGlsZCggImltcGxlbWVudGF0aW9uIiApLmdldFZhbHVlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVG9BcmNoaXZlX1Nob3VsZFdyaXRlQ29tcG9uZW50V2l0aG91dEhpbnRUb0ZpbGUoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFyY2hpdmVyRXhjZXB0aW9uLCBKRE9NRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBYcHAzRG9tIGRvbSA9IGNyZWF0ZUNvbXBvbmVudERvbSggbmV3IENvbXBvbmVudERlZiggInJvbGUiLCBudWxsLCAiaW1wbCIgKSApOwotCi0gICAgICAgIGZpbHRlci5jb21wb25lbnRzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBYcHAzRG9tPigpOwotICAgICAgICBmaWx0ZXIuY29tcG9uZW50cy5wdXQoICJyb2xlIiwgZG9tICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZUNhdGNoaW5nQXJjaGl2ZXIgZmNhID0gbmV3IEZpbGVDYXRjaGluZ0FyY2hpdmVyKCk7Ci0KLSAgICAgICAgZmlsdGVyLmZpbmFsaXplQXJjaGl2ZUNyZWF0aW9uKCBmY2EgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIENvbXBvbmVudHNYbWxBcmNoaXZlckZpbGVGaWx0ZXIuQ09NUE9ORU5UU19YTUxfUEFUSCwgZmNhLmdldERlc3RGaWxlTmFtZSgpICk7Ci0KLSAgICAgICAgZmluYWwgU0FYQnVpbGRlciBidWlsZGVyID0gbmV3IFNBWEJ1aWxkZXIoIGZhbHNlICk7Ci0KLSAgICAgICAgZmluYWwgRG9jdW1lbnQgZG9jID0gYnVpbGRlci5idWlsZCggZmNhLmdldEZpbGUoKSApOwotCi0gICAgICAgIGZpbmFsIFhQYXRoIHJvbGUgPSBYUGF0aC5uZXdJbnN0YW5jZSggIi8vY29tcG9uZW50W3Bvc2l0aW9uKCk9MV0vcm9sZS90ZXh0KCkiICk7Ci0gICAgICAgIGZpbmFsIFhQYXRoIGhpbnQgPSBYUGF0aC5uZXdJbnN0YW5jZSggIi8vY29tcG9uZW50W3Bvc2l0aW9uKCk9MV0vcm9sZS1oaW50L3RleHQoKSIgKTsKLSAgICAgICAgZmluYWwgWFBhdGggaW1wbGVtZW50YXRpb24gPSBYUGF0aC5uZXdJbnN0YW5jZSggIi8vY29tcG9uZW50W3Bvc2l0aW9uKCk9MV0vaW1wbGVtZW50YXRpb24vdGV4dCgpIiApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggInJvbGUiLCAoIChUZXh0KSByb2xlLnNlbGVjdFNpbmdsZU5vZGUoIGRvYyApICkuZ2V0VGV4dCgpICk7Ci0gICAgICAgIGFzc2VydE51bGwoIGhpbnQuc2VsZWN0U2luZ2xlTm9kZSggZG9jICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiaW1wbCIsICggKFRleHQpIGltcGxlbWVudGF0aW9uLnNlbGVjdFNpbmdsZU5vZGUoIGRvYyApICkuZ2V0VGV4dCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEFkZFRvQXJjaGl2ZV9TaG91bGRXcml0ZUNvbXBvbmVudFdpdGhIaW50VG9GaWxlKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBcmNoaXZlckV4Y2VwdGlvbiwgSkRPTUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgWHBwM0RvbSBkb20gPSBjcmVhdGVDb21wb25lbnREb20oIG5ldyBDb21wb25lbnREZWYoICJyb2xlIiwgImhpbnQiLCAiaW1wbCIgKSApOwotCi0gICAgICAgIGZpbHRlci5jb21wb25lbnRzID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBYcHAzRG9tPigpOwotICAgICAgICBmaWx0ZXIuY29tcG9uZW50cy5wdXQoICJyb2xlaGludCIsIGRvbSApOwotCi0gICAgICAgIGZpbmFsIEZpbGVDYXRjaGluZ0FyY2hpdmVyIGZjYSA9IG5ldyBGaWxlQ2F0Y2hpbmdBcmNoaXZlcigpOwotCi0gICAgICAgIGZpbHRlci5maW5hbGl6ZUFyY2hpdmVDcmVhdGlvbiggZmNhICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBDb21wb25lbnRzWG1sQXJjaGl2ZXJGaWxlRmlsdGVyLkNPTVBPTkVOVFNfWE1MX1BBVEgsIGZjYS5nZXREZXN0RmlsZU5hbWUoKSApOwotCi0gICAgICAgIGZpbmFsIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCBmYWxzZSApOwotCi0gICAgICAgIGZpbmFsIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoIGZjYS5nZXRGaWxlKCkgKTsKLQotICAgICAgICBmaW5hbCBYUGF0aCByb2xlID0gWFBhdGgubmV3SW5zdGFuY2UoICIvL2NvbXBvbmVudFtwb3NpdGlvbigpPTFdL3JvbGUvdGV4dCgpIiApOwotICAgICAgICBmaW5hbCBYUGF0aCBoaW50ID0gWFBhdGgubmV3SW5zdGFuY2UoICIvL2NvbXBvbmVudFtwb3NpdGlvbigpPTFdL3JvbGUtaGludC90ZXh0KCkiICk7Ci0gICAgICAgIGZpbmFsIFhQYXRoIGltcGxlbWVudGF0aW9uID0gWFBhdGgubmV3SW5zdGFuY2UoICIvL2NvbXBvbmVudFtwb3NpdGlvbigpPTFdL2ltcGxlbWVudGF0aW9uL3RleHQoKSIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJyb2xlIiwgKCAoVGV4dCkgcm9sZS5zZWxlY3RTaW5nbGVOb2RlKCBkb2MgKSApLmdldFRleHQoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJoaW50IiwgKCAoVGV4dCkgaGludC5zZWxlY3RTaW5nbGVOb2RlKCBkb2MgKSApLmdldFRleHQoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJpbXBsIiwgKCAoVGV4dCkgaW1wbGVtZW50YXRpb24uc2VsZWN0U2luZ2xlTm9kZSggZG9jICkgKS5nZXRUZXh0KCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVG9BcmNoaXZlX1Nob3VsZFdyaXRlVHdvQ29tcG9uZW50VG9GaWxlKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBcmNoaXZlckV4Y2VwdGlvbiwgSkRPTUV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmlsdGVyLmNvbXBvbmVudHMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFhwcDNEb20+KCk7Ci0KLSAgICAgICAgZmluYWwgWHBwM0RvbSBkb20gPSBjcmVhdGVDb21wb25lbnREb20oIG5ldyBDb21wb25lbnREZWYoICJyb2xlIiwgImhpbnQiLCAiaW1wbCIgKSApOwotCi0gICAgICAgIGZpbHRlci5jb21wb25lbnRzLnB1dCggInJvbGVoaW50IiwgZG9tICk7Ci0KLSAgICAgICAgZmluYWwgWHBwM0RvbSBkb20yID0gY3JlYXRlQ29tcG9uZW50RG9tKCBuZXcgQ29tcG9uZW50RGVmKCAicm9sZSIsICJoaW50MiIsICJpbXBsIiApICk7Ci0KLSAgICAgICAgZmlsdGVyLmNvbXBvbmVudHMucHV0KCAicm9sZWhpbnQyIiwgZG9tMiApOwotCi0gICAgICAgIGZpbmFsIEZpbGVDYXRjaGluZ0FyY2hpdmVyIGZjYSA9IG5ldyBGaWxlQ2F0Y2hpbmdBcmNoaXZlcigpOwotCi0gICAgICAgIGZpbHRlci5maW5hbGl6ZUFyY2hpdmVDcmVhdGlvbiggZmNhICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBDb21wb25lbnRzWG1sQXJjaGl2ZXJGaWxlRmlsdGVyLkNPTVBPTkVOVFNfWE1MX1BBVEgsIGZjYS5nZXREZXN0RmlsZU5hbWUoKSApOwotCi0gICAgICAgIGZpbmFsIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCBmYWxzZSApOwotCi0gICAgICAgIGZpbmFsIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoIGZjYS5nZXRGaWxlKCkgKTsKLQotICAgICAgICBmaW5hbCBYUGF0aCByb2xlID0gWFBhdGgubmV3SW5zdGFuY2UoICIvL2NvbXBvbmVudFtwb3NpdGlvbigpPTFdL3JvbGUvdGV4dCgpIiApOwotICAgICAgICBmaW5hbCBYUGF0aCBoaW50ID0gWFBhdGgubmV3SW5zdGFuY2UoICIvL2NvbXBvbmVudFtwb3NpdGlvbigpPTFdL3JvbGUtaGludC90ZXh0KCkiICk7Ci0gICAgICAgIGZpbmFsIFhQYXRoIGltcGxlbWVudGF0aW9uID0gWFBhdGgubmV3SW5zdGFuY2UoICIvL2NvbXBvbmVudFtwb3NpdGlvbigpPTFdL2ltcGxlbWVudGF0aW9uL3RleHQoKSIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJyb2xlIiwgKCAoVGV4dCkgcm9sZS5zZWxlY3RTaW5nbGVOb2RlKCBkb2MgKSApLmdldFRleHQoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJoaW50IiwgKCAoVGV4dCkgaGludC5zZWxlY3RTaW5nbGVOb2RlKCBkb2MgKSApLmdldFRleHQoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJpbXBsIiwgKCAoVGV4dCkgaW1wbGVtZW50YXRpb24uc2VsZWN0U2luZ2xlTm9kZSggZG9jICkgKS5nZXRUZXh0KCkgKTsKLQotICAgICAgICBmaW5hbCBYUGF0aCByb2xlMiA9IFhQYXRoLm5ld0luc3RhbmNlKCAiLy9jb21wb25lbnRbcG9zaXRpb24oKT0yXS9yb2xlL3RleHQoKSIgKTsKLSAgICAgICAgZmluYWwgWFBhdGggaGludDIgPSBYUGF0aC5uZXdJbnN0YW5jZSggIi8vY29tcG9uZW50W3Bvc2l0aW9uKCk9Ml0vcm9sZS1oaW50L3RleHQoKSIgKTsKLSAgICAgICAgZmluYWwgWFBhdGggaW1wbGVtZW50YXRpb24yID0gWFBhdGgubmV3SW5zdGFuY2UoICIvL2NvbXBvbmVudFtwb3NpdGlvbigpPTJdL2ltcGxlbWVudGF0aW9uL3RleHQoKSIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJyb2xlIiwgKCAoVGV4dCkgcm9sZTIuc2VsZWN0U2luZ2xlTm9kZSggZG9jICkgKS5nZXRUZXh0KCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiaGludDIiLCAoIChUZXh0KSBoaW50Mi5zZWxlY3RTaW5nbGVOb2RlKCBkb2MgKSApLmdldFRleHQoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJpbXBsIiwgKCAoVGV4dCkgaW1wbGVtZW50YXRpb24yLnNlbGVjdFNpbmdsZU5vZGUoIGRvYyApICkuZ2V0VGV4dCgpICk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkVG9BcmNoaXZlX1Nob3VsZFdyaXRlVHdvQ29tcG9uZW50VG9BcmNoaXZlZEZpbGUoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFyY2hpdmVyRXhjZXB0aW9uLCBKRE9NRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaWx0ZXIuY29tcG9uZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwPFN0cmluZywgWHBwM0RvbT4oKTsKLQotICAgICAgICBmaW5hbCBYcHAzRG9tIGRvbSA9IGNyZWF0ZUNvbXBvbmVudERvbSggbmV3IENvbXBvbmVudERlZiggInJvbGUiLCAiaGludCIsICJpbXBsIiApICk7Ci0KLSAgICAgICAgZmlsdGVyLmNvbXBvbmVudHMucHV0KCAicm9sZWhpbnQiLCBkb20gKTsKLQotICAgICAgICBmaW5hbCBYcHAzRG9tIGRvbTIgPSBjcmVhdGVDb21wb25lbnREb20oIG5ldyBDb21wb25lbnREZWYoICJyb2xlIiwgImhpbnQyIiwgImltcGwiICkgKTsKLQotICAgICAgICBmaWx0ZXIuY29tcG9uZW50cy5wdXQoICJyb2xlaGludDIiLCBkb20yICk7Ci0KLSAgICAgICAgZmluYWwgWmlwQXJjaGl2ZXIgYXJjaGl2ZXIgPSBuZXcgWmlwQXJjaGl2ZXIoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGFyY2hpdmVGaWxlID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcEZpbGUoKTsKLQotICAgICAgICBhcmNoaXZlci5zZXREZXN0RmlsZSggYXJjaGl2ZUZpbGUgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGRlc2NyaXB0b3JGaWxlID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcEZpbGUoKTsKLQotICAgICAgICBhcmNoaXZlci5zZXRBcmNoaXZlRmluYWxpemVycyggQ29sbGVjdGlvbnMuPEFyY2hpdmVGaW5hbGl6ZXI+c2luZ2xldG9uTGlzdCggZmlsdGVyICkgKTsKLQotICAgICAgICBhcmNoaXZlci5jcmVhdGVBcmNoaXZlKCk7Ci0KLSAgICAgICAgZmluYWwgWmlwRmlsZSB6ZiA9IG5ldyBaaXBGaWxlKCBhcmNoaXZlRmlsZSApOwotCi0gICAgICAgIGZpbmFsIFppcEVudHJ5IHplID0gemYuZ2V0RW50cnkoIENvbXBvbmVudHNYbWxBcmNoaXZlckZpbGVGaWx0ZXIuQ09NUE9ORU5UU19YTUxfUEFUSCApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIHplICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZU91dHB1dFN0cmVhbSBmaWxlU3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIGRlc2NyaXB0b3JGaWxlICk7Ci0KLSAgICAgICAgSU9VdGlsLmNvcHkoIHpmLmdldElucHV0U3RyZWFtKCB6ZSApLCBmaWxlU3RyZWFtICk7Ci0gICAgICAgIElPVXRpbC5jbG9zZSggZmlsZVN0cmVhbSApOwotCi0gICAgICAgIGZpbmFsIFNBWEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBTQVhCdWlsZGVyKCBmYWxzZSApOwotCi0gICAgICAgIGZpbmFsIERvY3VtZW50IGRvYyA9IGJ1aWxkZXIuYnVpbGQoIGRlc2NyaXB0b3JGaWxlICk7Ci0KLSAgICAgICAgZmluYWwgWFBhdGggcm9sZSA9IFhQYXRoLm5ld0luc3RhbmNlKCAiLy9jb21wb25lbnRbcG9zaXRpb24oKT0xXS9yb2xlL3RleHQoKSIgKTsKLSAgICAgICAgZmluYWwgWFBhdGggaGludCA9IFhQYXRoLm5ld0luc3RhbmNlKCAiLy9jb21wb25lbnRbcG9zaXRpb24oKT0xXS9yb2xlLWhpbnQvdGV4dCgpIiApOwotICAgICAgICBmaW5hbCBYUGF0aCBpbXBsZW1lbnRhdGlvbiA9IFhQYXRoLm5ld0luc3RhbmNlKCAiLy9jb21wb25lbnRbcG9zaXRpb24oKT0xXS9pbXBsZW1lbnRhdGlvbi90ZXh0KCkiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAicm9sZSIsICggKFRleHQpIHJvbGUuc2VsZWN0U2luZ2xlTm9kZSggZG9jICkgKS5nZXRUZXh0KCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiaGludCIsICggKFRleHQpIGhpbnQuc2VsZWN0U2luZ2xlTm9kZSggZG9jICkgKS5nZXRUZXh0KCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiaW1wbCIsICggKFRleHQpIGltcGxlbWVudGF0aW9uLnNlbGVjdFNpbmdsZU5vZGUoIGRvYyApICkuZ2V0VGV4dCgpICk7Ci0KLSAgICAgICAgZmluYWwgWFBhdGggcm9sZTIgPSBYUGF0aC5uZXdJbnN0YW5jZSggIi8vY29tcG9uZW50W3Bvc2l0aW9uKCk9Ml0vcm9sZS90ZXh0KCkiICk7Ci0gICAgICAgIGZpbmFsIFhQYXRoIGhpbnQyID0gWFBhdGgubmV3SW5zdGFuY2UoICIvL2NvbXBvbmVudFtwb3NpdGlvbigpPTJdL3JvbGUtaGludC90ZXh0KCkiICk7Ci0gICAgICAgIGZpbmFsIFhQYXRoIGltcGxlbWVudGF0aW9uMiA9IFhQYXRoLm5ld0luc3RhbmNlKCAiLy9jb21wb25lbnRbcG9zaXRpb24oKT0yXS9pbXBsZW1lbnRhdGlvbi90ZXh0KCkiICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAicm9sZSIsICggKFRleHQpIHJvbGUyLnNlbGVjdFNpbmdsZU5vZGUoIGRvYyApICkuZ2V0VGV4dCgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggImhpbnQyIiwgKCAoVGV4dCkgaGludDIuc2VsZWN0U2luZ2xlTm9kZSggZG9jICkgKS5nZXRUZXh0KCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiaW1wbCIsICggKFRleHQpIGltcGxlbWVudGF0aW9uMi5zZWxlY3RTaW5nbGVOb2RlKCBkb2MgKSApLmdldFRleHQoKSApOwotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBYcHAzRG9tIGNyZWF0ZUNvbXBvbmVudERvbSggZmluYWwgQ29tcG9uZW50RGVmIGRlZiApCi0gICAgewotICAgICAgICBmaW5hbCBYcHAzRG9tIGRvbSA9IG5ldyBYcHAzRG9tKCAiY29tcG9uZW50IiApOwotCi0gICAgICAgIGZpbmFsIFhwcDNEb20gcm9sZSA9IG5ldyBYcHAzRG9tKCAicm9sZSIgKTsKLSAgICAgICAgcm9sZS5zZXRWYWx1ZSggZGVmLnJvbGUgKTsKLSAgICAgICAgZG9tLmFkZENoaWxkKCByb2xlICk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIGhpbnQgPSBkZWYucm9sZUhpbnQ7Ci0gICAgICAgIGlmICggaGludCAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgWHBwM0RvbSByb2xlSGludCA9IG5ldyBYcHAzRG9tKCAicm9sZS1oaW50IiApOwotICAgICAgICAgICAgcm9sZUhpbnQuc2V0VmFsdWUoIGhpbnQgKTsKLSAgICAgICAgICAgIGRvbS5hZGRDaGlsZCggcm9sZUhpbnQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFhwcDNEb20gaW1wbCA9IG5ldyBYcHAzRG9tKCAiaW1wbGVtZW50YXRpb24iICk7Ci0gICAgICAgIGltcGwuc2V0VmFsdWUoIGRlZi5pbXBsZW1lbnRhdGlvbiApOwotICAgICAgICBkb20uYWRkQ2hpbGQoIGltcGwgKTsKLQotICAgICAgICByZXR1cm4gZG9tOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVhZGVyIHdyaXRlQ29tcG9uZW50c1htbCggZmluYWwgTGlzdDxDb21wb25lbnREZWY+IGNvbXBvbmVudERlZnMgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0KLSAgICAgICAgZmluYWwgUHJldHR5UHJpbnRYTUxXcml0ZXIgeG1sV3JpdGVyID0gbmV3IFByZXR0eVByaW50WE1MV3JpdGVyKCB3cml0ZXIgKTsKLQotICAgICAgICB4bWxXcml0ZXIuc3RhcnRFbGVtZW50KCAiY29tcG9uZW50LXNldCIgKTsKLSAgICAgICAgeG1sV3JpdGVyLnN0YXJ0RWxlbWVudCggImNvbXBvbmVudHMiICk7Ci0KLSAgICAgICAgZm9yICggZmluYWwgQ29tcG9uZW50RGVmIGRlZiA6IGNvbXBvbmVudERlZnMgKQotICAgICAgICB7Ci0gICAgICAgICAgICB4bWxXcml0ZXIuc3RhcnRFbGVtZW50KCAiY29tcG9uZW50IiApOwotCi0gICAgICAgICAgICB4bWxXcml0ZXIuc3RhcnRFbGVtZW50KCAicm9sZSIgKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci53cml0ZVRleHQoIGRlZi5yb2xlICk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgcm9sZUhpbnQgPSBkZWYucm9sZUhpbnQ7Ci0gICAgICAgICAgICBpZiAoIHJvbGVIaW50ICE9IG51bGwgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHhtbFdyaXRlci5zdGFydEVsZW1lbnQoICJyb2xlLWhpbnQiICk7Ci0gICAgICAgICAgICAgICAgeG1sV3JpdGVyLndyaXRlVGV4dCggcm9sZUhpbnQgKTsKLSAgICAgICAgICAgICAgICB4bWxXcml0ZXIuZW5kRWxlbWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB4bWxXcml0ZXIuc3RhcnRFbGVtZW50KCAiaW1wbGVtZW50YXRpb24iICk7Ci0gICAgICAgICAgICB4bWxXcml0ZXIud3JpdGVUZXh0KCBkZWYuaW1wbGVtZW50YXRpb24gKTsKLSAgICAgICAgICAgIHhtbFdyaXRlci5lbmRFbGVtZW50KCk7Ci0KLSAgICAgICAgICAgIHhtbFdyaXRlci5lbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICB4bWxXcml0ZXIuZW5kRWxlbWVudCgpOwotICAgICAgICB4bWxXcml0ZXIuZW5kRWxlbWVudCgpOwotCi0gICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmVhZGVyKCB3cml0ZXIudG9TdHJpbmcoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvbXBvbmVudERlZgotICAgIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJvbGU7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJvbGVIaW50OwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBpbXBsZW1lbnRhdGlvbjsKLQotICAgICAgICBDb21wb25lbnREZWYoIGZpbmFsIFN0cmluZyByb2xlLCBmaW5hbCBTdHJpbmcgcm9sZUhpbnQsIGZpbmFsIFN0cmluZyBpbXBsZW1lbnRhdGlvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucm9sZSA9IHJvbGU7Ci0gICAgICAgICAgICB0aGlzLnJvbGVIaW50ID0gcm9sZUhpbnQ7Ci0gICAgICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uID0gaW1wbGVtZW50YXRpb247Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVDYXRjaGluZ0FyY2hpdmVyCi0gICAgICAgIGV4dGVuZHMgTm9PcEFyY2hpdmVyCi0gICAgewotCi0gICAgICAgIHByaXZhdGUgRmlsZSBpbnB1dEZpbGU7Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGVzdEZpbGVOYW1lOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZERpcmVjdG9yeSggZmluYWwgQE5vbm51bGwgRmlsZSBkaXJlY3RvcnkgKQotICAgICAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGREaXJlY3RvcnkoIGZpbmFsIEBOb25udWxsIEZpbGUgZGlyZWN0b3J5LCBmaW5hbCBTdHJpbmcgcHJlZml4ICkKLSAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBmaW5hbCBATm9ubnVsbCBGaWxlIGRpcmVjdG9yeSwgZmluYWwgU3RyaW5nW10gaW5jbHVkZXMsIGZpbmFsIFN0cmluZ1tdIGV4Y2x1ZGVzICkKLSAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRGlyZWN0b3J5KCBmaW5hbCBATm9ubnVsbCBGaWxlIGRpcmVjdG9yeSwgZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgU3RyaW5nW10gaW5jbHVkZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZXhjbHVkZXMgKQotICAgICAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRGaWxlKCBmaW5hbCBATm9ubnVsbCBGaWxlIGlucHV0RmlsZSwgZmluYWwgQE5vbm51bGwgU3RyaW5nIGRlc3RGaWxlTmFtZSApCi0gICAgICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pbnB1dEZpbGUgPSBpbnB1dEZpbGU7Ci0gICAgICAgICAgICB0aGlzLmRlc3RGaWxlTmFtZSA9IGRlc3RGaWxlTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpbGUgZ2V0RmlsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBpbnB1dEZpbGU7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGVzdEZpbGVOYW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGRlc3RGaWxlTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEZpbGUoIGZpbmFsIEBOb25udWxsIEZpbGUgaW5wdXRGaWxlLCBmaW5hbCBATm9ubnVsbCBTdHJpbmcgZGVzdEZpbGVOYW1lLCBmaW5hbCBpbnQgcGVybWlzc2lvbnMgKQotICAgICAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBjcmVhdGVBcmNoaXZlKCkKLSAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdERpcmVjdG9yeU1vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXREZWZhdWx0RmlsZU1vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEZpbGUgZ2V0RGVzdEZpbGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkU3ltbGluayggU3RyaW5nIHMsIFN0cmluZyBzMiApCi0gICAgICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFN5bWxpbmsoIFN0cmluZyBzLCBpbnQgaSwgU3RyaW5nIHMyICkKLSAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoICJyYXd0eXBlcyIgKQotICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgQXJjaGl2ZUVudHJ5PiBnZXRGaWxlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbmNsdWRlRW1wdHlEaXJzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlZmF1bHREaXJlY3RvcnlNb2RlKCBmaW5hbCBpbnQgbW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0RmlsZU1vZGUoIGZpbmFsIGludCBtb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERlc3RGaWxlKCBmaW5hbCBGaWxlIGRlc3RGaWxlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEluY2x1ZGVFbXB0eURpcnMoIGZpbmFsIGJvb2xlYW4gaW5jbHVkZUVtcHR5RGlycyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBcmNoaXZlZEZpbGVTZXQoIGZpbmFsIEBOb25udWxsIEZpbGUgYXJjaGl2ZUZpbGUgKQotICAgICAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBcmNoaXZlZEZpbGVTZXQoIGZpbmFsIEBOb25udWxsIEZpbGUgYXJjaGl2ZUZpbGUsIGZpbmFsIFN0cmluZyBwcmVmaXggKQotICAgICAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBcmNoaXZlZEZpbGVTZXQoIGZpbmFsIEZpbGUgYXJjaGl2ZUZpbGUsIGZpbmFsIFN0cmluZ1tdIGluY2x1ZGVzLCBmaW5hbCBTdHJpbmdbXSBleGNsdWRlcyApCi0gICAgICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFyY2hpdmVkRmlsZVNldCggZmluYWwgQE5vbm51bGwgRmlsZSBhcmNoaXZlRmlsZSwgZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgU3RyaW5nW10gaW5jbHVkZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gZXhjbHVkZXMgKQotICAgICAgICAgICAgdGhyb3dzIEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JjZWQoIGZpbmFsIGJvb2xlYW4gZm9yY2VkICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRm9yY2VkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3VwcG9ydGluZ0ZvcmNlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREb3RGaWxlRGlyZWN0b3J5KCBmaW5hbCBGaWxlIGRvdEZpbGVEaXJlY3RvcnkgKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRBcmNoaXZlZEZpbGVTZXQoIGZpbmFsIEFyY2hpdmVkRmlsZVNldCBmaWxlU2V0ICkKLSAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkRmlsZVNldCggZmluYWwgQE5vbm51bGwgRmlsZVNldCBmaWxlU2V0ICkKLSAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkUmVzb3VyY2UoIGZpbmFsIFBsZXh1c0lvUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBkZXN0RmlsZU5hbWUsIGZpbmFsIGludCBwZXJtaXNzaW9ucyApCi0gICAgICAgICAgICB0aHJvd3MgQXJjaGl2ZXJFeGNlcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZFJlc291cmNlcyggZmluYWwgUGxleHVzSW9SZXNvdXJjZUNvbGxlY3Rpb24gcmVzb3VyY2VzICkKLSAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljCi0gICAgICAgIEBOb25udWxsCi0gICAgICAgIFJlc291cmNlSXRlcmF0b3IgZ2V0UmVzb3VyY2VzKCkKLSAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlSXRlcmF0b3IoKQotICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyBBcmNoaXZlRW50cnkgbmV4dCgpCi0gICAgICAgICAgICAgICAgICAgIHRocm93cyBBcmNoaXZlckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREdXBsaWNhdGVCZWhhdmlvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBBcmNoaXZlci5EVVBMSUNBVEVTX0FERDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldER1cGxpY2F0ZUJlaGF2aW9yKCBmaW5hbCBTdHJpbmcgZHVwbGljYXRlICkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXREaXJlY3RvcnlNb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0RmlsZU1vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRPdmVycmlkZURpcmVjdG9yeU1vZGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oICJub3Qgc3VwcG9ydGVkIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBnZXRPdmVycmlkZUZpbGVNb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERpcmVjdG9yeU1vZGUoIGZpbmFsIGludCBtb2RlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCAibm90IHN1cHBvcnRlZCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbGVNb2RlKCBmaW5hbCBpbnQgbW9kZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIm5vdCBzdXBwb3J0ZWQiICk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9mb3JtYXQvUmVhZGVyRm9ybWF0dGVyVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2Zvcm1hdC9SZWFkZXJGb3JtYXR0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzE5NmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2Zvcm1hdC9SZWFkZXJGb3JtYXR0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5mb3JtYXQ7Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uSU9VdGlsczsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3R1dGlscy5Qb2pvQ29uZmlnU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5zaGFyZWQuZmlsdGVyaW5nLkRlZmF1bHRNYXZlblJlYWRlckZpbHRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLnJlc291cmNlcy5QbGV4dXNJb1ZpcnR1YWxGaWxlUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21wb25lbnRzLmlvLmZ1bmN0aW9ucy5JbnB1dFN0cmVhbVRyYW5zZm9ybWVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5jb25zb2xlLkNvbnNvbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuZm9ybWF0LlJlYWRlckZvcm1hdHRlci5nZXRGaWxlU2V0VHJhbnNmb3JtZXJzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLQotCi1AU3VwcHJlc3NXYXJuaW5ncyggIkNvbnN0YW50Q29uZGl0aW9ucyIgKQotcHVibGljIGNsYXNzIFJlYWRlckZvcm1hdHRlclRlc3QKLXsKLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIGxpbmVEb3NGZWVkKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFBvam9Db25maWdTb3VyY2UgY2ZnID0gZ2V0UG9qb0NvbmZpZ1NvdXJjZSgpOwotICAgICAgICBJbnB1dFN0cmVhbVRyYW5zZm9ybWVyIGZpbGVTZXRUcmFuc2Zvcm1lcnMgPSBnZXRGaWxlU2V0VHJhbnNmb3JtZXJzKCBjZmcsIHRydWUsICJkb3MiICk7Ci0gICAgICAgIElucHV0U3RyZWFtIGZ1ZCA9IGZpbGVTZXRUcmFuc2Zvcm1lcnMudHJhbnNmb3JtKCBkdW1teVJlc291cmNlKCksIHBheWxvYWQoICJUaGlzIGlzIGFcbnRlc3QuIiApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggIlRoaXMgaXMgYVxyXG50ZXN0LiIsIHJlYWRSZXN1bHRTdHJlYW0oIGZ1ZCApICk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCBsaW5lRG9zRmVlZF93aXRob3V0RmlsdGVyaW5nKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIFBvam9Db25maWdTb3VyY2UgY2ZnID0gZ2V0UG9qb0NvbmZpZ1NvdXJjZSgpOwotICAgICAgICBJbnB1dFN0cmVhbVRyYW5zZm9ybWVyIGZpbGVTZXRUcmFuc2Zvcm1lcnMgPSBnZXRGaWxlU2V0VHJhbnNmb3JtZXJzKCBjZmcsIGZhbHNlLCAiZG9zIiApOwotICAgICAgICBJbnB1dFN0cmVhbSBmdWQgPSBmaWxlU2V0VHJhbnNmb3JtZXJzLnRyYW5zZm9ybSggZHVtbXlSZXNvdXJjZSgpLCBwYXlsb2FkKCAiVGhpcyBpcyBhXG50ZXN0LiIgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJUaGlzIGlzIGFcclxudGVzdC4iLCByZWFkUmVzdWx0U3RyZWFtKCBmdWQgKSApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgbGluZVVuaXhGZWVkV2l0aEludGVycG9sYXRpb24oKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgUG9qb0NvbmZpZ1NvdXJjZSBjZmcgPSBnZXRQb2pvQ29uZmlnU291cmNlKCk7Ci0gICAgICAgIElucHV0U3RyZWFtVHJhbnNmb3JtZXIgZmlsZVNldFRyYW5zZm9ybWVycyA9IGdldEZpbGVTZXRUcmFuc2Zvcm1lcnMoIGNmZywgdHJ1ZSwgInVuaXgiICk7Ci0gICAgICAgIElucHV0U3RyZWFtIGZ1ZCA9IGZpbGVTZXRUcmFuc2Zvcm1lcnMudHJhbnNmb3JtKCBkdW1teVJlc291cmNlKCksIHBheWxvYWQoICJUaGlzIGlzIGEgdGVzdCBmb3IgcHJvamVjdDogJHthcnRpZmFjdElkfSBAYXJ0aWZhY3RJZEAuIikgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiVGhpcyBpcyBhIHRlc3QgZm9yIHByb2plY3Q6IGFuQXJ0aWZhY3QgYW5BcnRpZmFjdC4iLCByZWFkUmVzdWx0U3RyZWFtKCBmdWQgKSApOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBNYXZlblByb2plY3QgY3JlYXRlQmFzaWNNYXZlblByb2plY3QoKQotICAgIHsKLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggImFuQXJ0aWZhY3QiICk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cCIgKTsKLSAgICAgICAgbW9kZWwuc2V0VmVyc2lvbiggInZlcnNpb24iICk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIFN0cmluZyByZWFkUmVzdWx0U3RyZWFtKCBJbnB1dFN0cmVhbSBmdWQgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGJ5dGVbXSBhY3R1YWwgPSBuZXcgYnl0ZVsxMDBdOwotICAgICAgICBpbnQgcmVhZCA9IElPVXRpbHMucmVhZCggZnVkLCBhY3R1YWwgKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIGFjdHVhbCwgMCwgcmVhZCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBCeXRlQXJyYXlJbnB1dFN0cmVhbSBwYXlsb2FkKCBTdHJpbmcgcGF5bG9hZCApCi0gICAgewotICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCBwYXlsb2FkLmdldEJ5dGVzKCkgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBvam9Db25maWdTb3VyY2UgZ2V0UG9qb0NvbmZpZ1NvdXJjZSgpCi0gICAgewotICAgICAgICBmaW5hbCBQb2pvQ29uZmlnU291cmNlIGNmZyA9ICBuZXcgUG9qb0NvbmZpZ1NvdXJjZSgpOwotICAgICAgICBjZmcuc2V0RW5jb2RpbmcoICJVVEYtOCIgKTsKLSAgICAgICAgRGVmYXVsdE1hdmVuUmVhZGVyRmlsdGVyIG1hdmVuUmVhZGVyRmlsdGVyID0gbmV3IERlZmF1bHRNYXZlblJlYWRlckZpbHRlcigpOwotICAgICAgICBtYXZlblJlYWRlckZpbHRlci5lbmFibGVMb2dnaW5nKCBuZXcgQ29uc29sZUxvZ2dlciggMiwgImZ1ZCIgKSApOwotICAgICAgICBjZmcuc2V0TWF2ZW5SZWFkZXJGaWx0ZXIoIG1hdmVuUmVhZGVyRmlsdGVyICk7Ci0gICAgICAgIGNmZy5zZXRFc2NhcGVTdHJpbmcoIG51bGwgKTsKLSAgICAgICAgY2ZnLnNldE1hdmVuUHJvamVjdCggY3JlYXRlQmFzaWNNYXZlblByb2plY3QoKSApOwotCi0vKiAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0RmlsdGVycygpKS5hbmRSZXR1cm4oIGZpbHRlcnMgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc0luY2x1ZGVQcm9qZWN0QnVpbGRGaWx0ZXJzKCkpLmFuZFJldHVybiggaW5jbHVkZVByb2plY3RCdWlsZEZpbHRlcnMgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXREZWxpbWl0ZXJzKCkpLmFuZFJldHVybiggZGVsaW1pdGVycyApOwotKi8KLSAgICAgICAgcmV0dXJuIGNmZzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFBsZXh1c0lvVmlydHVhbEZpbGVSZXNvdXJjZSBkdW1teVJlc291cmNlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBuZXcgUGxleHVzSW9WaXJ0dWFsRmlsZVJlc291cmNlKCBuZXcgRmlsZSggImZ1ZCIgKSwgImZ1ZCIgKQotICAgICAgICB7Ci0gICAgICAgIH07Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ludGVycG9sYXRpb24vQXNzZW1ibHlFeHByZXNzaW9uRXZhbHVhdG9yVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ludGVycG9sYXRpb24vQXNzZW1ibHlFeHByZXNzaW9uRXZhbHVhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWQ5MmIzLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pbnRlcnBvbGF0aW9uL0Fzc2VtYmx5RXhwcmVzc2lvbkV2YWx1YXRvclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmludGVycG9sYXRpb247Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXBvc2l0b3J5LkFydGlmYWN0UmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmV4ZWN1dGlvbi5NYXZlblNlc3Npb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5CdWlsZDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdHV0aWxzLlBvam9Db25maWdTb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBvbmVudC5jb25maWd1cmF0b3IuZXhwcmVzc2lvbi5FeHByZXNzaW9uRXZhbHVhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmludGVycG9sYXRpb24uZml4ZWQuRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLlByb3BlcnRpZXNCYXNlZFZhbHVlU291cmNlOwotaW1wb3J0IG9yZy5lYXN5bW9jay5jbGFzc2V4dGVuc2lvbi5FYXN5TW9ja1N1cHBvcnQ7Ci1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLklNb2Nrc0NvbnRyb2w7Ci0KLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotCi1wdWJsaWMgY2xhc3MgQXNzZW1ibHlFeHByZXNzaW9uRXZhbHVhdG9yVGVzdAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLQotICAgIHByaXZhdGUgZmluYWwgUG9qb0NvbmZpZ1NvdXJjZSBjb25maWdTb3VyY2VTdHViID0gbmV3IFBvam9Db25maWdTb3VyY2UoKTsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRSZXNvbHZlTW9kZWxHcm91cElkKCkKLSAgICAgICAgdGhyb3dzIEV4cHJlc3Npb25FdmFsdWF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QtaWQiICk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cC5pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0VmVyc2lvbiggIjEiICk7Ci0gICAgICAgIG1vZGVsLnNldFBhY2thZ2luZyggImphciIgKTsKLQotICAgICAgICBjb25maWdTb3VyY2VTdHViLnNldE1hdmVuUHJvamVjdCggbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKSApOwotICAgICAgICBzZXR1cEludGVycG9sYXRpb24oKTsKLQotCi0KLSAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IG5ldyBBc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IoIGNvbmZpZ1NvdXJjZVN0dWIgKS5ldmFsdWF0ZSggImFzc2VtYmx5LiR7Z3JvdXBJZH0iICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYXNzZW1ibHkuZ3JvdXAuaWQiLCByZXN1bHQgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2V0dXBJbnRlcnBvbGF0aW9uKCkKLSAgICB7Ci0gICAgICAgIGNvbmZpZ1NvdXJjZVN0dWIuc2V0Um9vdEludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKTsKLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRFbnZpcm9ubWVudEludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKTsKLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRFbnZJbnRlcnBvbGF0b3IoIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSgpICk7Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUmVzb2x2ZU1vZGVsUHJvcGVydHlCZWZvcmVNb2RlbEdyb3VwSWQoKQotICAgICAgICB0aHJvd3MgRXhwcmVzc2lvbkV2YWx1YXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEFydGlmYWN0SWQoICJhcnRpZmFjdC1pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwLmlkIiApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCAiMSIgKTsKLSAgICAgICAgbW9kZWwuc2V0UGFja2FnaW5nKCAiamFyIiApOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eSggImdyb3VwSWQiLCAib3RoZXIuaWQiICk7Ci0KLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydGllcyggcHJvcHMgKTsKLQotICAgICAgICBjb25maWdTb3VyY2VTdHViLnNldE1hdmVuUHJvamVjdCggbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKSApOwotICAgICAgICBzZXR1cEludGVycG9sYXRpb24oKTsKLQotICAgICAgICBmaW5hbCBPYmplY3QgcmVzdWx0ID0gbmV3IEFzc2VtYmx5RXhwcmVzc2lvbkV2YWx1YXRvciggY29uZmlnU291cmNlU3R1YiApLmV2YWx1YXRlKCAiYXNzZW1ibHkuJHtncm91cElkfSIgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJhc3NlbWJseS5vdGhlci5pZCIsIHJlc3VsdCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRSZXNvbHZlQ29udGV4dFZhbHVlQmVmb3JlTW9kZWxQcm9wZXJ0eU9yTW9kZWxHcm91cElkSW5Bc3NlbWJseUlkKCkKLSAgICAgICAgdGhyb3dzIEV4cHJlc3Npb25FdmFsdWF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QtaWQiICk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cC5pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0VmVyc2lvbiggIjEiICk7Ci0gICAgICAgIG1vZGVsLnNldFBhY2thZ2luZyggImphciIgKTsKLQotICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoICJncm91cElkIiwgIm90aGVyLmlkIiApOwotCi0gICAgICAgIG1vZGVsLnNldFByb3BlcnRpZXMoIHByb3BzICk7Ci0KLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIE1hdmVuU2Vzc2lvbiBzZXNzaW9uID0gbW0uY3JlYXRlQ29udHJvbCgpLmNyZWF0ZU1vY2soIE1hdmVuU2Vzc2lvbi5jbGFzcyApOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnRpZXMgZXhlY1Byb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgZXhlY1Byb3BzLnNldFByb3BlcnR5KCAiZ3JvdXBJZCIsICJzdGlsbC5hbm90aGVyLmlkIiApOwotCi0gICAgICAgIFByb3BlcnRpZXNCYXNlZFZhbHVlU291cmNlIGNsaVByb3BzID0gbmV3IFByb3BlcnRpZXNCYXNlZFZhbHVlU291cmNlKCBleGVjUHJvcHMgKTsKLSAgICAgICAgZXhwZWN0KCBzZXNzaW9uLmdldEV4ZWN1dGlvblByb3BlcnRpZXMoKSkuYW5kUmV0dXJuKCBleGVjUHJvcHMgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIHNlc3Npb24uZ2V0VXNlclByb3BlcnRpZXMoKSkuYW5kUmV0dXJuKCBuZXcgUHJvcGVydGllcygpICkuYW55VGltZXMoKTsKLQotCi0KLQotICAgICAgICBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNzID0gbW0uY3JlYXRlQ29udHJvbCgpLmNyZWF0ZU1vY2soIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MgKTsKLSAgICAgICAgZXhwZWN0KCBjcy5nZXRDb21tYW5kTGluZVByb3BzSW50ZXJwb2xhdG9yKCkgKS5hbmRSZXR1cm4oIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZShjbGlQcm9wcykgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNzLmdldFJlcG9zaXRvcnlJbnRlcnBvbGF0b3IoKSApLmFuZFJldHVybiggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNzLmdldEVudkludGVycG9sYXRvcigpICkuYW5kUmV0dXJuKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoKSApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjcy5nZXRNYXZlblNlc3Npb24oKSApLmFuZFJldHVybiggc2Vzc2lvbiApLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdCggY3MuZ2V0UHJvamVjdCgpICkuYW5kUmV0dXJuKCBuZXcgTWF2ZW5Qcm9qZWN0KCBtb2RlbCApICk7Ci0KLSAgICAgICAgZmluYWwgSU1vY2tzQ29udHJvbCBsckN0bCA9IG1tLmNyZWF0ZUNvbnRyb2woKTsKLSAgICAgICAgZmluYWwgQXJ0aWZhY3RSZXBvc2l0b3J5IGxyID0gbHJDdGwuY3JlYXRlTW9jayggQXJ0aWZhY3RSZXBvc2l0b3J5LmNsYXNzICk7Ci0KLSAgICAgICAgZXhwZWN0KCBsci5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggIi9wYXRoL3RvL2xvY2FsL3JlcG8iICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjcy5nZXRMb2NhbFJlcG9zaXRvcnkoKSkuYW5kUmV0dXJuKCBsciApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgbW0ucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IG5ldyBBc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IoIGNzICkuZXZhbHVhdGUoICJhc3NlbWJseS4ke2dyb3VwSWR9IiApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImFzc2VtYmx5LnN0aWxsLmFub3RoZXIuaWQiLCByZXN1bHQgKTsKLQotICAgICAgICBtbS52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUmV0dXJuVW5jaGFuZ2VkSW5wdXRGb3JVbnJlc29sdmVkRXhwcmVzc2lvbigpCi0gICAgICAgIHRocm93cyBFeHByZXNzaW9uRXZhbHVhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggImFydGlmYWN0LWlkIiApOwotICAgICAgICBtb2RlbC5zZXRHcm91cElkKCAiZ3JvdXAuaWQiICk7Ci0gICAgICAgIG1vZGVsLnNldFZlcnNpb24oICIxIiApOwotICAgICAgICBtb2RlbC5zZXRQYWNrYWdpbmcoICJqYXIiICk7Ci0KLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRNYXZlblByb2plY3QoIG5ldyBNYXZlblByb2plY3QoIG1vZGVsICkgKTsKLSAgICAgICAgc2V0dXBJbnRlcnBvbGF0aW9uKCk7Ci0KLSAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IG5ldyBBc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IoIGNvbmZpZ1NvdXJjZVN0dWIgKS5ldmFsdWF0ZSggImFzc2VtYmx5LiR7dW5yZXNvbHZlZH0iICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYXNzZW1ibHkuJHt1bnJlc29sdmVkfSIsIHJlc3VsdCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGRJbnRlcnBvbGF0ZU11bHRpRG90UHJvamVjdEV4cHJlc3Npb24oKQotICAgICAgICB0aHJvd3MgRXhwcmVzc2lvbkV2YWx1YXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEJ1aWxkIGJ1aWxkID0gbmV3IEJ1aWxkKCk7Ci0gICAgICAgIGJ1aWxkLnNldEZpbmFsTmFtZSggImZpbmFsLW5hbWUiICk7Ci0KLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0QnVpbGQoIGJ1aWxkICk7Ci0KLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRNYXZlblByb2plY3QoIG5ldyBNYXZlblByb2plY3QoIG1vZGVsICkgKTsKLSAgICAgICAgc2V0dXBJbnRlcnBvbGF0aW9uKCk7Ci0KLQotICAgICAgICBmaW5hbCBPYmplY3QgcmVzdWx0ID0KLSAgICAgICAgICAgIG5ldyBBc3NlbWJseUV4cHJlc3Npb25FdmFsdWF0b3IoIGNvbmZpZ1NvdXJjZVN0dWIgKS5ldmFsdWF0ZSggImFzc2VtYmx5LiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IiApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImFzc2VtYmx5LmZpbmFsLW5hbWUiLCByZXN1bHQgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pbnRlcnBvbGF0aW9uL0Fzc2VtYmx5SW50ZXJwb2xhdG9yVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ludGVycG9sYXRpb24vQXNzZW1ibHlJbnRlcnBvbGF0b3JUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4N2Y3N2IuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2ludGVycG9sYXRpb24vQXNzZW1ibHlJbnRlcnBvbGF0b3JUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTYgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pbnRlcnBvbGF0aW9uOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5leGVjdXRpb24uTWF2ZW5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuQnVpbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmlvLkFzc2VtYmx5UmVhZEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pby5EZWZhdWx0QXNzZW1ibHlSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuaW8uRGVmYXVsdEFzc2VtYmx5UmVhZGVyVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Bc3NlbWJseTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3R1dGlscy5Qb2pvQ29uZmlnU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuaW50ZXJwb2xhdGlvbi5maXhlZC5Qcm9wZXJ0aWVzQmFzZWRWYWx1ZVNvdXJjZTsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotCi1wdWJsaWMgY2xhc3MgQXNzZW1ibHlJbnRlcnBvbGF0b3JUZXN0Ci0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gICAgcHVibGljIHZvaWQgdGVzdERlcGVuZGVuY3lTZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmdzQXJlTm90SW50ZXJwb2xhdGVkKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBc3NlbWJseUludGVycG9sYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwKLSAgICAgICAgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEFydGlmYWN0SWQoICJhcnRpZmFjdC1pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwLmlkIiApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCAiMSIgKTsKLSAgICAgICAgbW9kZWwuc2V0UGFja2FnaW5nKCAiamFyIiApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIC8vIGFydGlmYWN0SWQgaXMgYmxhY2tsaXN0ZWQsIGJ1dCBwYWNrYWdpbmcgaXMgbm90LgotICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0RmlsZU5hbWVNYXBwaW5nID0gIiR7YXJ0aWZhY3RJZH0uJHtwYWNrYWdpbmd9IjsKLQotICAgICAgICBmaW5hbCBEZXBlbmRlbmN5U2V0IHNldCA9IG5ldyBEZXBlbmRlbmN5U2V0KCk7Ci0gICAgICAgIHNldC5zZXRPdXRwdXRGaWxlTmFtZU1hcHBpbmcoIG91dHB1dEZpbGVOYW1lTWFwcGluZyApOwotCi0gICAgICAgIGFzc2VtYmx5LmFkZERlcGVuZGVuY3lTZXQoIHNldCApOwotCi0gICAgICAgIGZpbmFsIFBvam9Db25maWdTb3VyY2UgY29uZmlnU291cmNlU3R1YiA9IG5ldyBQb2pvQ29uZmlnU291cmNlKCk7Ci0KLQotICAgICAgICBjb25maWdTb3VyY2VTdHViLnNldFJvb3RJbnRlcnBvbGF0b3IoIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSggICkgKTsKLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRFbnZpcm9ubWVudEludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKTsKLQotICAgICAgICBjb25maWdTb3VyY2VTdHViLnNldE1hdmVuUHJvamVjdCggcHJvamVjdCk7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5IG91dHB1dEFzc2VtYmx5ID0gcm91bmRUcmlwSW50ZXJwb2xhdGlvbiggYXNzZW1ibHksIGNvbmZpZ1NvdXJjZVN0dWIgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PERlcGVuZGVuY3lTZXQ+IG91dHB1dERlcGVuZGVuY3lTZXRzID0gb3V0cHV0QXNzZW1ibHkuZ2V0RGVwZW5kZW5jeVNldHMoKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBvdXRwdXREZXBlbmRlbmN5U2V0cy5zaXplKCkgKTsKLQotICAgICAgICBmaW5hbCBEZXBlbmRlbmN5U2V0IG91dHB1dFNldCA9IG91dHB1dERlcGVuZGVuY3lTZXRzLmdldCggMCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIiR7YXJ0aWZhY3RJZH0uJHtwYWNrYWdpbmd9Iiwgb3V0cHV0U2V0LmdldE91dHB1dEZpbGVOYW1lTWFwcGluZygpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdERlcGVuZGVuY3lTZXRPdXRwdXREaXJlY3RvcnlJc05vdEludGVycG9sYXRlZCgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlJbnRlcnBvbGF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseVJlYWRFeGNlcHRpb24sCi0gICAgICAgIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QtaWQiICk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cC5pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0VmVyc2lvbiggIjEiICk7Ci0gICAgICAgIG1vZGVsLnNldFBhY2thZ2luZyggImphciIgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBvdXRwdXREaXJlY3RvcnkgPSAiJHthcnRpZmFjdElkfS4ke3BhY2thZ2luZ30iOwotCi0gICAgICAgIGZpbmFsIERlcGVuZGVuY3lTZXQgc2V0ID0gbmV3IERlcGVuZGVuY3lTZXQoKTsKLSAgICAgICAgc2V0LnNldE91dHB1dERpcmVjdG9yeSggb3V0cHV0RGlyZWN0b3J5ICk7Ci0KLSAgICAgICAgYXNzZW1ibHkuYWRkRGVwZW5kZW5jeVNldCggc2V0ICk7Ci0KLSAgICAgICAgZmluYWwgUG9qb0NvbmZpZ1NvdXJjZSBjb25maWdTb3VyY2VTdHViID0gbmV3IFBvam9Db25maWdTb3VyY2UoKTsKLQotCi0gICAgICAgIGNvbmZpZ1NvdXJjZVN0dWIuc2V0Um9vdEludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKTsKLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRFbnZpcm9ubWVudEludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCkgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0gICAgICAgIGNvbmZpZ1NvdXJjZVN0dWIuc2V0TWF2ZW5Qcm9qZWN0KCBwcm9qZWN0KTsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgb3V0cHV0QXNzZW1ibHkgPSByb3VuZFRyaXBJbnRlcnBvbGF0aW9uKCBhc3NlbWJseSwgY29uZmlnU291cmNlU3R1YiApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8RGVwZW5kZW5jeVNldD4gb3V0cHV0RGVwZW5kZW5jeVNldHMgPSBvdXRwdXRBc3NlbWJseS5nZXREZXBlbmRlbmN5U2V0cygpOwotICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIG91dHB1dERlcGVuZGVuY3lTZXRzLnNpemUoKSApOwotCi0gICAgICAgIGZpbmFsIERlcGVuZGVuY3lTZXQgb3V0cHV0U2V0ID0gb3V0cHV0RGVwZW5kZW5jeVNldHMuZ2V0KCAwICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiJHthcnRpZmFjdElkfS4ke3BhY2thZ2luZ30iLCBvdXRwdXRTZXQuZ2V0T3V0cHV0RGlyZWN0b3J5KCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXNzZW1ibHkgcm91bmRUcmlwSW50ZXJwb2xhdGlvbiggQXNzZW1ibHkgYXNzZW1ibHksIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY29uZmlnU291cmNlICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdSZWFkZXIgc3RyaW5nUmVhZGVyID0gRGVmYXVsdEFzc2VtYmx5UmVhZGVyVGVzdC53cml0ZVRvU3RyaW5nUmVhZGVyKCBhc3NlbWJseSApOwotICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRBc3NlbWJseVJlYWRlcigpLnJlYWRBc3NlbWJseSggc3RyaW5nUmVhZGVyLCAidGVzdExvY2F0aW9uIiwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdTb3VyY2UgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUmVzb2x2ZU1vZGVsR3JvdXBJZEluQXNzZW1ibHlJZCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUludGVycG9sYXRpb25FeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseVJlYWRFeGNlcHRpb24sCi0gICAgICAgIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QtaWQiICk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cC5pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0VmVyc2lvbiggIjEiICk7Ci0gICAgICAgIG1vZGVsLnNldFBhY2thZ2luZyggImphciIgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIGFzc2VtYmx5LnNldElkKCAiYXNzZW1ibHkuJHtncm91cElkfSIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0gICAgICAgIGZpbmFsIFBvam9Db25maWdTb3VyY2UgY29uZmlnU291cmNlU3R1YiA9IG5ldyBQb2pvQ29uZmlnU291cmNlKCk7Ci0KLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRSb290SW50ZXJwb2xhdG9yKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoKSApOwotICAgICAgICBjb25maWdTb3VyY2VTdHViLnNldEVudmlyb25tZW50SW50ZXJwb2xhdG9yKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoKSApOwotICAgICAgICBjb25maWdTb3VyY2VTdHViLnNldE1hdmVuUHJvamVjdCggcHJvamVjdCk7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5IG91dHB1dEFzc2VtYmx5ID0gcm91bmRUcmlwSW50ZXJwb2xhdGlvbiggYXNzZW1ibHksIGNvbmZpZ1NvdXJjZVN0dWIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYXNzZW1ibHkuZ3JvdXAuaWQiLCBvdXRwdXRBc3NlbWJseS5nZXRJZCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZFJlc29sdmVNb2RlbFByb3BlcnR5QmVmb3JlTW9kZWxHcm91cElkSW5Bc3NlbWJseUlkKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5SW50ZXJwb2xhdGlvbkV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwKLSAgICAgICAgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEFydGlmYWN0SWQoICJhcnRpZmFjdC1pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwLmlkIiApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCAiMSIgKTsKLSAgICAgICAgbW9kZWwuc2V0UGFja2FnaW5nKCAiamFyIiApOwotCi0gICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBwcm9wcy5zZXRQcm9wZXJ0eSggImdyb3VwSWQiLCAib3RoZXIuaWQiICk7Ci0KLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydGllcyggcHJvcHMgKTsKLQotICAgICAgICBmaW5hbCBQb2pvQ29uZmlnU291cmNlIGNvbmZpZ1NvdXJjZVN0dWIgPSBuZXcgUG9qb0NvbmZpZ1NvdXJjZSgpOwotCi0gICAgICAgIGNvbmZpZ1NvdXJjZVN0dWIuc2V0Um9vdEludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCAgKSApOwotICAgICAgICBjb25maWdTb3VyY2VTdHViLnNldEVudmlyb25tZW50SW50ZXJwb2xhdG9yKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoKSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0KLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJhc3NlbWJseS4ke2dyb3VwSWR9IiApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRNYXZlblByb2plY3QoIHByb2plY3QpOwotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQgPSByb3VuZFRyaXBJbnRlcnBvbGF0aW9uKCBhc3NlbWJseSwgY29uZmlnU291cmNlU3R1YiApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImFzc2VtYmx5Lm90aGVyLmlkIiwgcmVzdWx0LmdldElkKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2hvdWxkUmVzb2x2ZUNvbnRleHRWYWx1ZUJlZm9yZU1vZGVsUHJvcGVydHlPck1vZGVsR3JvdXBJZEluQXNzZW1ibHlJZCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUludGVycG9sYXRpb25FeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseVJlYWRFeGNlcHRpb24sCi0gICAgICAgIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNb2RlbCBtb2RlbCA9IG5ldyBNb2RlbCgpOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QtaWQiICk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cC5pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0VmVyc2lvbiggIjEiICk7Ci0gICAgICAgIG1vZGVsLnNldFBhY2thZ2luZyggImphciIgKTsKLQotICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoICJncm91cElkIiwgIm90aGVyLmlkIiApOwotCi0gICAgICAgIG1vZGVsLnNldFByb3BlcnRpZXMoIHByb3BzICk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLQotICAgICAgICBhc3NlbWJseS5zZXRJZCggImFzc2VtYmx5LiR7Z3JvdXBJZH0iICk7Ci0KLSAgICAgICAgZmluYWwgRWFzeU1vY2tTdXBwb3J0IG1tID0gbmV3IEVhc3lNb2NrU3VwcG9ydCgpOwotCi0gICAgICAgIGZpbmFsIE1hdmVuU2Vzc2lvbiBzZXNzaW9uID0gbW0uY3JlYXRlTW9jayggTWF2ZW5TZXNzaW9uLmNsYXNzICk7Ci0KLSAgICAgICAgZmluYWwgUHJvcGVydGllcyBleGVjUHJvcHMgPSBuZXcgUHJvcGVydGllcygpOwotICAgICAgICBleGVjUHJvcHMuc2V0UHJvcGVydHkoICJncm91cElkIiwgInN0aWxsLmFub3RoZXIuaWQiICk7Ci0KLSAgICAgICAgZXhwZWN0KCBzZXNzaW9uLmdldEV4ZWN1dGlvblByb3BlcnRpZXMoKSkuYW5kUmV0dXJuKCBleGVjUHJvcHMgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdCggc2Vzc2lvbi5nZXRVc2VyUHJvcGVydGllcygpKS5hbmRSZXR1cm4oICBuZXcgUHJvcGVydGllcygpKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGZpbmFsIFBvam9Db25maWdTb3VyY2UgY3MgPSBuZXcgUG9qb0NvbmZpZ1NvdXJjZSgpOwotCi0gICAgICAgIGZpbmFsIEFydGlmYWN0UmVwb3NpdG9yeSBsciA9ICBtbS5jcmVhdGVNb2NrKCBBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MgKTsKLQotICAgICAgICBjcy5zZXRMb2NhbFJlcG9zaXRvcnkoIGxyICk7Ci0gICAgICAgIGNzLnNldE1hdmVuU2Vzc2lvbiggc2Vzc2lvbiApOwotICAgICAgICBjcy5zZXRSb290SW50ZXJwb2xhdG9yKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoKSApOwotICAgICAgICBjcy5zZXRFbnZpcm9ubWVudEludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKAotICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNCYXNlZFZhbHVlU291cmNlKGV4ZWNQcm9wcykgKSk7Ci0gICAgICAgIGNzLnNldEVudkludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuZW1wdHkoKSApOwotCi0gICAgICAgIGV4cGVjdCggbHIuZ2V0QmFzZWRpcigpICkuYW5kUmV0dXJuKCAgIi9wYXRoL3RvL2xvY2FsL3JlcG8iKS5hbnlUaW1lcygpOwotCi0gICAgICAgIG1tLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLSAgICAgICAgY3Muc2V0TWF2ZW5Qcm9qZWN0KCBwcm9qZWN0ICk7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdCA9IHJvdW5kVHJpcEludGVycG9sYXRpb24oIGFzc2VtYmx5LCBjcyApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImFzc2VtYmx5LnN0aWxsLmFub3RoZXIuaWQiLCByZXN1bHQuZ2V0SWQoKSApOwotCi0gICAgICAgIG1tLnZlcmlmeUFsbCgpOwotICAgICAgICBtbS5yZXNldEFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaG91bGROb3RUb3VjaFVucmVzb2x2ZWRFeHByZXNzaW9uKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5SW50ZXJwb2xhdGlvbkV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwKLSAgICAgICAgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEFydGlmYWN0SWQoICJhcnRpZmFjdC1pZCIgKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwLmlkIiApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCAiMSIgKTsKLSAgICAgICAgbW9kZWwuc2V0UGFja2FnaW5nKCAiamFyIiApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0KLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJhc3NlbWJseS4ke3VucmVzb2x2ZWR9IiApOwotCi0gICAgICAgIGZpbmFsIFBvam9Db25maWdTb3VyY2UgY29uZmlnU291cmNlU3R1YiA9IG5ldyBQb2pvQ29uZmlnU291cmNlKCk7Ci0KLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRSb290SW50ZXJwb2xhdG9yKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoICApICk7Ci0gICAgICAgIGNvbmZpZ1NvdXJjZVN0dWIuc2V0RW52aXJvbm1lbnRJbnRlcnBvbGF0b3IoIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSgpICk7Ci0KLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0gICAgICAgIGNvbmZpZ1NvdXJjZVN0dWIuc2V0TWF2ZW5Qcm9qZWN0KCBwcm9qZWN0KTsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgcmVzdWx0ID0gcm91bmRUcmlwSW50ZXJwb2xhdGlvbiggYXNzZW1ibHksIGNvbmZpZ1NvdXJjZVN0dWIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYXNzZW1ibHkuJHt1bnJlc29sdmVkfSIsIHJlc3VsdC5nZXRJZCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFNob3VsZEludGVycG9sYXRlTXVsdGlEb3RQcm9qZWN0RXhwcmVzc2lvbigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUludGVycG9sYXRpb25FeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBBc3NlbWJseVJlYWRFeGNlcHRpb24sCi0gICAgICAgIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBCdWlsZCBidWlsZCA9IG5ldyBCdWlsZCgpOwotICAgICAgICBidWlsZC5zZXRGaW5hbE5hbWUoICJmaW5hbC1uYW1lIiApOwotCi0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEJ1aWxkKCBidWlsZCApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0KLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJhc3NlbWJseS4ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfSIgKTsKLQotICAgICAgICBmaW5hbCBQb2pvQ29uZmlnU291cmNlIGNvbmZpZ1NvdXJjZVN0dWIgPSBuZXcgUG9qb0NvbmZpZ1NvdXJjZSgpOwotCi0gICAgICAgIGNvbmZpZ1NvdXJjZVN0dWIuc2V0Um9vdEludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCAgKSApOwotICAgICAgICBjb25maWdTb3VyY2VTdHViLnNldEVudmlyb25tZW50SW50ZXJwb2xhdG9yKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5jcmVhdGUoKSApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLSAgICAgICAgY29uZmlnU291cmNlU3R1Yi5zZXRNYXZlblByb2plY3QoIHByb2plY3QpOwotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQgPSByb3VuZFRyaXBJbnRlcnBvbGF0aW9uKCBhc3NlbWJseSwgY29uZmlnU291cmNlU3R1YiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJhc3NlbWJseS5maW5hbC1uYW1lIiwgcmVzdWx0LmdldElkKCkgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pby9EZWZhdWx0QXNzZW1ibHlSZWFkZXJUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vRGVmYXVsdEFzc2VtYmx5UmVhZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTliOGRhLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS9pby9EZWZhdWx0QXNzZW1ibHlSZWFkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQ1ICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuaW87Ci0KLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmFydGlmYWN0LnJlcG9zaXRvcnkuQXJ0aWZhY3RSZXBvc2l0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuTW9kZWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkuQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkRlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pbnRlcnBvbGF0aW9uLkFzc2VtYmx5SW50ZXJwb2xhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkFzc2VtYmx5OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkNvbXBvbmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5Db250YWluZXJEZXNjcmlwdG9ySGFuZGxlckNvbmZpZzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5EZXBlbmRlbmN5U2V0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVJdGVtOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5Lm1vZGVsLkZpbGVTZXQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuUmVwb3NpdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5pby54cHAzLkFzc2VtYmx5WHBwM1dyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5tb2RlbC5pby54cHAzLkNvbXBvbmVudFhwcDNSZWFkZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuaW8ueHBwMy5Db21wb25lbnRYcHAzV3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnRlc3R1dGlscy5UZXN0RmlsZU1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmludGVycG9sYXRpb24uZml4ZWQuRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3I7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkludGVycG9sYXRpb25TdGF0ZTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuTG9nZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5jb25zb2xlLkNvbnNvbGVMb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLklPVXRpbDsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IHN0YXRpYyBvcmcuZWFzeW1vY2suRWFzeU1vY2suZXhwZWN0OwotCi1AU3VwcHJlc3NXYXJuaW5ncygiUmVzdWx0T2ZNZXRob2RDYWxsSWdub3JlZCIpCi1wdWJsaWMgY2xhc3MgRGVmYXVsdEFzc2VtYmx5UmVhZGVyVGVzdAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLQotICAgIHByaXZhdGUgVGVzdEZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXI7Ci0KLQotICAgIHByaXZhdGUgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjb25maWdTb3VyY2U7Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkKLSAgICB7Ci0gICAgICAgIGZpbGVNYW5hZ2VyID0gbmV3IFRlc3RGaWxlTWFuYWdlciggImFzc2VtYmx5LXJlYWRlci50ZXN0LiIsICIueG1sIiApOwotICAgICAgICBtb2NrTWFuYWdlciA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgICAgICBjb25maWdTb3VyY2UgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MpOwotCi0gICAgICAgIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG8gPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKCBBcnRpZmFjdFJlcG9zaXRvcnkuY2xhc3MgKTsKLQotICAgICAgICBleHBlY3QoIGxvY2FsUmVwby5nZXRCYXNlZGlyKCkpLmFuZFJldHVybigiL3BhdGgvdG8vbG9jYWwvcmVwbyIpLmFueVRpbWVzKCk7Ci0gICAgICAgIGV4cGVjdChjb25maWdTb3VyY2UuZ2V0TG9jYWxSZXBvc2l0b3J5KCkpLmFuZFJldHVybiggbG9jYWxSZXBvICkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0UmVtb3RlUmVwb3NpdG9yaWVzKCkpLmFuZFJldHVybiggQ29sbGVjdGlvbnMuPEFydGlmYWN0UmVwb3NpdG9yeT5lbXB0eUxpc3QoKSkuYW55VGltZXMoKTsKLSAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5nZXRNYXZlblNlc3Npb24oKSkuYW5kUmV0dXJuKCBudWxsKS5hbnlUaW1lcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaWxlTWFuYWdlci5jbGVhblVwKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluY2x1ZGVTaXRlSW5Bc3NlbWJseV9TaG91bGRGYWlsSWZTaXRlRGlyZWN0b3J5Tm9uRXhpc3RlbnQoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGUgc2l0ZURpciA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoICJhc3NlbWJseS1yZWFkZXIuIiwgIi50ZXN0IiApOwotICAgICAgICBzaXRlRGlyLmRlbGV0ZSgpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFNpdGVEaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCBzaXRlRGlyICkuYW55VGltZXMoKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBuZXcgRGVmYXVsdEFzc2VtYmx5UmVhZGVyKCkuaW5jbHVkZVNpdGVJbkFzc2VtYmx5KCBhc3NlbWJseSwgY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgICAgIGZhaWwoICJTaG91bGQgZmFpbCB3aGVuIHNpdGUgZGlyZWN0b3J5IGlzIG5vbi1leGlzdGVudC4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgaGFwcGVuLgotICAgICAgICB9Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluY2x1ZGVTaXRlSW5Bc3NlbWJseV9TaG91bGRBZGRTaXRlRGlyRmlsZVNldFdoZW5EaXJFeGlzdHMoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIHNpdGVEaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0U2l0ZURpcmVjdG9yeSgpKS5hbmRSZXR1cm4oIHNpdGVEaXIgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgbmV3IERlZmF1bHRBc3NlbWJseVJlYWRlcigpLmluY2x1ZGVTaXRlSW5Bc3NlbWJseSggYXNzZW1ibHksIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8RmlsZVNldD4gZmlsZVNldHMgPSBhc3NlbWJseS5nZXRGaWxlU2V0cygpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIGZpbGVTZXRzICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMSwgZmlsZVNldHMuc2l6ZSgpICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZVNldCBmcyA9IGZpbGVTZXRzLmdldCggMCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggc2l0ZURpci5nZXRQYXRoKCksIGZzLmdldERpcmVjdG9yeSgpICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgLy8gcHVibGljIHZvaWQgdGVzdFJlYWRDb21wb25lbnRfU2hvdWxkUmVhZENvbXBvbmVudEZyb21YbWwoKQotICAgIC8vIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uCi0gICAgLy8gewotICAgIC8vIENvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7Ci0gICAgLy8KLSAgICAvLyBGaWxlU2V0IGZpbGVTZXQgPSBuZXcgRmlsZVNldCgpOwotICAgIC8vIGZpbGVTZXQuc2V0RGlyZWN0b3J5KCAiL2RpciIgKTsKLSAgICAvLwotICAgIC8vIGNvbXBvbmVudC5hZGRGaWxlU2V0KCBmaWxlU2V0ICk7Ci0gICAgLy8KLSAgICAvLyBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgLy8KLSAgICAvLyBDb21wb25lbnRYcHAzV3JpdGVyIGNvbXBvbmVudFdyaXRlciA9IG5ldyBDb21wb25lbnRYcHAzV3JpdGVyKCk7Ci0gICAgLy8KLSAgICAvLyBjb21wb25lbnRXcml0ZXIud3JpdGUoIHN3LCBjb21wb25lbnQgKTsKLSAgICAvLwotICAgIC8vIENvbXBvbmVudCByZXN1bHQgPSBuZXcgRGVmYXVsdEFzc2VtYmx5UmVhZGVyKCkucmVhZENvbXBvbmVudCggbmV3IFN0cmluZ1JlYWRlciggc3cudG9TdHJpbmcoKSApICk7Ci0gICAgLy8KLSAgICAvLyBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gcmVzdWx0LmdldEZpbGVTZXRzKCk7Ci0gICAgLy8KLSAgICAvLyBhc3NlcnROb3ROdWxsKCBmaWxlU2V0cyApOwotICAgIC8vIGFzc2VydEVxdWFscyggMSwgZmlsZVNldHMuc2l6ZSgpICk7Ci0gICAgLy8KLSAgICAvLyBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVTZXRzLmdldCggMCApOwotICAgIC8vCi0gICAgLy8gYXNzZXJ0RXF1YWxzKCAiL2RpciIsIGZzLmdldERpcmVjdG9yeSgpICk7Ci0gICAgLy8gfQotICAgIC8vCi0gICAgLy8gcHVibGljIHZvaWQgdGVzdEdldENvbXBvbmVudEZyb21GaWxlX1Nob3VsZFJlYWRDb21wb25lbnQoKQotICAgIC8vIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uCi0gICAgLy8gewotICAgIC8vIENvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7Ci0gICAgLy8KLSAgICAvLyBGaWxlU2V0IGZpbGVTZXQgPSBuZXcgRmlsZVNldCgpOwotICAgIC8vIGZpbGVTZXQuc2V0RGlyZWN0b3J5KCAiL2RpciIgKTsKLSAgICAvLwotICAgIC8vIGNvbXBvbmVudC5hZGRGaWxlU2V0KCBmaWxlU2V0ICk7Ci0gICAgLy8KLSAgICAvLyBGaWxlIGNvbXBvbmVudEZpbGUgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRmlsZSgpOwotICAgIC8vCi0gICAgLy8gRmlsZVdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgIC8vCi0gICAgLy8gdHJ5Ci0gICAgLy8gewotICAgIC8vIHdyaXRlciA9IG5ldyBGaWxlV3JpdGVyKCBjb21wb25lbnRGaWxlICk7Ci0gICAgLy8KLSAgICAvLyBDb21wb25lbnRYcHAzV3JpdGVyIGNvbXBvbmVudFdyaXRlciA9IG5ldyBDb21wb25lbnRYcHAzV3JpdGVyKCk7Ci0gICAgLy8KLSAgICAvLyBjb21wb25lbnRXcml0ZXIud3JpdGUoIHdyaXRlciwgY29tcG9uZW50ICk7Ci0gICAgLy8gfQotICAgIC8vIGZpbmFsbHkKLSAgICAvLyB7Ci0gICAgLy8gSU9VdGlsLmNsb3NlKCB3cml0ZXIgKTsKLSAgICAvLyB9Ci0gICAgLy8KLSAgICAvLyBGaWxlIGJhc2VkaXIgPSBjb21wb25lbnRGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAvLyBTdHJpbmcgZmlsZW5hbWUgPSBjb21wb25lbnRGaWxlLmdldE5hbWUoKTsKLSAgICAvLwotICAgIC8vIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCk7Ci0gICAgLy8gY29uZmlnU291cmNlQ29udHJvbC5zZXRSZXR1cm5WYWx1ZSggYmFzZWRpciApOwotICAgIC8vCi0gICAgLy8gbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0gICAgLy8KLSAgICAvLyBDb21wb25lbnQgcmVzdWx0ID0gbmV3IERlZmF1bHRBc3NlbWJseVJlYWRlcigpLmdldENvbXBvbmVudEZyb21GaWxlKCBmaWxlbmFtZSwgY29uZmlnU291cmNlICk7Ci0gICAgLy8KLSAgICAvLyBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gcmVzdWx0LmdldEZpbGVTZXRzKCk7Ci0gICAgLy8KLSAgICAvLyBhc3NlcnROb3ROdWxsKCBmaWxlU2V0cyApOwotICAgIC8vIGFzc2VydEVxdWFscyggMSwgZmlsZVNldHMuc2l6ZSgpICk7Ci0gICAgLy8KLSAgICAvLyBGaWxlU2V0IGZzID0gKEZpbGVTZXQpIGZpbGVTZXRzLmdldCggMCApOwotICAgIC8vCi0gICAgLy8gYXNzZXJ0RXF1YWxzKCAiL2RpciIsIGZzLmdldERpcmVjdG9yeSgpICk7Ci0gICAgLy8KLSAgICAvLyBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICAvLyB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb21wb25lbnRXaXRoQXNzZW1ibHlfU2hvdWxkQWRkT25lRmlsZVNldFRvRXhpc3RpbmdMaXN0T2ZUd28oKQotICAgIHsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLQotICAgICAgICBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgZnMuc2V0RGlyZWN0b3J5KCAiL2RpciIgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGRGaWxlU2V0KCBmcyApOwotCi0gICAgICAgIGZzID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgZnMuc2V0RGlyZWN0b3J5KCAiL290aGVyLWRpciIgKTsKLSAgICAgICAgYXNzZW1ibHkuYWRkRmlsZVNldCggZnMgKTsKLQotICAgICAgICBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgIGZzLnNldERpcmVjdG9yeSggIi90aGlyZC1kaXIiICk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoKTsKLQotICAgICAgICBjb21wb25lbnQuYWRkRmlsZVNldCggZnMgKTsKLQotICAgICAgICBuZXcgRGVmYXVsdEFzc2VtYmx5UmVhZGVyKCkubWVyZ2VDb21wb25lbnRXaXRoQXNzZW1ibHkoIGNvbXBvbmVudCwgYXNzZW1ibHkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gYXNzZW1ibHkuZ2V0RmlsZVNldHMoKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCBmaWxlU2V0cyApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIDMsIGZpbGVTZXRzLnNpemUoKSApOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgcmZzMSA9IGZpbGVTZXRzLmdldCggMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICIvZGlyIiwgcmZzMS5nZXREaXJlY3RvcnkoKSApOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgcmZzMiA9IGZpbGVTZXRzLmdldCggMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICIvb3RoZXItZGlyIiwgcmZzMi5nZXREaXJlY3RvcnkoKSApOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgcmZzMyA9IGZpbGVTZXRzLmdldCggMiApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICIvdGhpcmQtZGlyIiwgcmZzMy5nZXREaXJlY3RvcnkoKSApOwotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1lcmdlQ29tcG9uZW50V2l0aEFzc2VtYmx5X1Nob3VsZEFkZE9uZUZpbGVJdGVtVG9FeGlzdGluZ0xpc3RPZlR3bygpCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIEZpbGVJdGVtIGZpID0gbmV3IEZpbGVJdGVtKCk7Ci0gICAgICAgIGZpLnNldFNvdXJjZSggImZpbGUiICk7Ci0KLSAgICAgICAgYXNzZW1ibHkuYWRkRmlsZSggZmkgKTsKLQotICAgICAgICBmaSA9IG5ldyBGaWxlSXRlbSgpOwotICAgICAgICBmaS5zZXRTb3VyY2UoICJmaWxlMiIgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGRGaWxlKCBmaSApOwotCi0gICAgICAgIGZpID0gbmV3IEZpbGVJdGVtKCk7Ci0gICAgICAgIGZpLnNldFNvdXJjZSggImZpbGUzIiApOwotCi0gICAgICAgIGZpbmFsIENvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7Ci0KLSAgICAgICAgY29tcG9uZW50LmFkZEZpbGUoIGZpICk7Ci0KLSAgICAgICAgbmV3IERlZmF1bHRBc3NlbWJseVJlYWRlcigpLm1lcmdlQ29tcG9uZW50V2l0aEFzc2VtYmx5KCBjb21wb25lbnQsIGFzc2VtYmx5ICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxGaWxlSXRlbT4gZmlsZUl0ZW1zID0gYXNzZW1ibHkuZ2V0RmlsZXMoKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCBmaWxlSXRlbXMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAzLCBmaWxlSXRlbXMuc2l6ZSgpICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZUl0ZW0gcmYxID0gZmlsZUl0ZW1zLmdldCggMCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJmaWxlIiwgcmYxLmdldFNvdXJjZSgpICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZUl0ZW0gcmYyID0gZmlsZUl0ZW1zLmdldCggMSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJmaWxlMiIsIHJmMi5nZXRTb3VyY2UoKSApOwotCi0gICAgICAgIGZpbmFsIEZpbGVJdGVtIHJmMyA9IGZpbGVJdGVtcy5nZXQoIDIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiZmlsZTMiLCByZjMuZ2V0U291cmNlKCkgKTsKLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUNvbXBvbmVudFdpdGhBc3NlbWJseV9TaG91bGRBZGRPbmVEZXBlbmRlbmN5U2V0VG9FeGlzdGluZ0xpc3RPZlR3bygpCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIERlcGVuZGVuY3lTZXQgZHMgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgICAgICBkcy5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfUlVOVElNRSApOwotCi0gICAgICAgIGFzc2VtYmx5LmFkZERlcGVuZGVuY3lTZXQoIGRzICk7Ci0KLSAgICAgICAgZHMgPSBuZXcgRGVwZW5kZW5jeVNldCgpOwotICAgICAgICBkcy5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfQ09NUElMRSApOwotCi0gICAgICAgIGFzc2VtYmx5LmFkZERlcGVuZGVuY3lTZXQoIGRzICk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoKTsKLQotICAgICAgICBkcyA9IG5ldyBEZXBlbmRlbmN5U2V0KCk7Ci0gICAgICAgIGRzLnNldFNjb3BlKCBBcnRpZmFjdC5TQ09QRV9TWVNURU0gKTsKLQotICAgICAgICBjb21wb25lbnQuYWRkRGVwZW5kZW5jeVNldCggZHMgKTsKLQotICAgICAgICBuZXcgRGVmYXVsdEFzc2VtYmx5UmVhZGVyKCkubWVyZ2VDb21wb25lbnRXaXRoQXNzZW1ibHkoIGNvbXBvbmVudCwgYXNzZW1ibHkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PERlcGVuZGVuY3lTZXQ+IGRlcFNldHMgPSBhc3NlbWJseS5nZXREZXBlbmRlbmN5U2V0cygpOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIGRlcFNldHMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAzLCBkZXBTZXRzLnNpemUoKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggQXJ0aWZhY3QuU0NPUEVfUlVOVElNRSwgZGVwU2V0cy5nZXQoIDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2NvcGUoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUsIGRlcFNldHMuZ2V0KCAxICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjb3BlKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBBcnRpZmFjdC5TQ09QRV9TWVNURU0sIGRlcFNldHMuZ2V0KCAyICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U2NvcGUoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUNvbXBvbmVudFdpdGhBc3NlbWJseV9TaG91bGRBZGRPbmVSZXBvc2l0b3J5VG9FeGlzdGluZ0xpc3RPZlR3bygpCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotCi0gICAgICAgIFJlcG9zaXRvcnkgcmVwbyA9IG5ldyBSZXBvc2l0b3J5KCk7Ci0gICAgICAgIHJlcG8uc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX1JVTlRJTUUgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGRSZXBvc2l0b3J5KCByZXBvICk7Ci0KLSAgICAgICAgcmVwbyA9IG5ldyBSZXBvc2l0b3J5KCk7Ci0gICAgICAgIHJlcG8uc2V0U2NvcGUoIEFydGlmYWN0LlNDT1BFX0NPTVBJTEUgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGRSZXBvc2l0b3J5KCByZXBvICk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoKTsKLQotICAgICAgICByZXBvID0gbmV3IFJlcG9zaXRvcnkoKTsKLSAgICAgICAgcmVwby5zZXRTY29wZSggQXJ0aWZhY3QuU0NPUEVfU1lTVEVNICk7Ci0KLSAgICAgICAgY29tcG9uZW50LmFkZFJlcG9zaXRvcnkoIHJlcG8gKTsKLQotICAgICAgICBuZXcgRGVmYXVsdEFzc2VtYmx5UmVhZGVyKCkubWVyZ2VDb21wb25lbnRXaXRoQXNzZW1ibHkoIGNvbXBvbmVudCwgYXNzZW1ibHkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PFJlcG9zaXRvcnk+IGRlcFNldHMgPSBhc3NlbWJseS5nZXRSZXBvc2l0b3JpZXMoKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCBkZXBTZXRzICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMywgZGVwU2V0cy5zaXplKCkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIEFydGlmYWN0LlNDT1BFX1JVTlRJTUUsIGRlcFNldHMuZ2V0KCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjb3BlKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBBcnRpZmFjdC5TQ09QRV9DT01QSUxFLCBkZXBTZXRzLmdldCggMSApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRTY29wZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggQXJ0aWZhY3QuU0NPUEVfU1lTVEVNLCBkZXBTZXRzLmdldCggMiApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNjb3BlKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb21wb25lbnRXaXRoQXNzZW1ibHlfU2hvdWxkQWRkT25lQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJUb0V4aXN0aW5nTGlzdE9mVHdvKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0KLSAgICAgICAgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJDb25maWcgY2ZnID0gbmV3IENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyQ29uZmlnKCk7Ci0gICAgICAgIGNmZy5zZXRIYW5kbGVyTmFtZSggIm9uZSIgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlciggY2ZnICk7Ci0KLSAgICAgICAgY2ZnID0gbmV3IENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyQ29uZmlnKCk7Ci0gICAgICAgIGNmZy5zZXRIYW5kbGVyTmFtZSggInR3byIgKTsKLQotICAgICAgICBhc3NlbWJseS5hZGRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlciggY2ZnICk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoKTsKLQotICAgICAgICBjZmcgPSBuZXcgQ29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJDb25maWcoKTsKLSAgICAgICAgY2ZnLnNldEhhbmRsZXJOYW1lKCAidGhyZWUiICk7Ci0KLSAgICAgICAgY29tcG9uZW50LmFkZENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyKCBjZmcgKTsKLQotICAgICAgICBuZXcgRGVmYXVsdEFzc2VtYmx5UmVhZGVyKCkubWVyZ2VDb21wb25lbnRXaXRoQXNzZW1ibHkoIGNvbXBvbmVudCwgYXNzZW1ibHkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PENvbnRhaW5lckRlc2NyaXB0b3JIYW5kbGVyQ29uZmlnPiByZXN1bHQgPSBhc3NlbWJseS5nZXRDb250YWluZXJEZXNjcmlwdG9ySGFuZGxlcnMoKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCByZXN1bHQgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAzLCByZXN1bHQuc2l6ZSgpICk7Ci0KLSAgICAgICAgZmluYWwgSXRlcmF0b3I8Q29udGFpbmVyRGVzY3JpcHRvckhhbmRsZXJDb25maWc+IGl0ID0gcmVzdWx0Lml0ZXJhdG9yKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggIm9uZSIsIGl0Lm5leHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRIYW5kbGVyTmFtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggInR3byIsIGl0Lm5leHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRIYW5kbGVyTmFtZSgpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggInRocmVlIiwgaXQubmV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SGFuZGxlck5hbWUoKSApOwotICAgIH0KLQotICAgIC8vIEZJWE1FOiBEZWVwIG1lcmdpbmcgc2hvdWxkIHRha2UgcGxhY2UuLi4KLSAgICAvLyBwdWJsaWMgdm9pZAotICAgIC8vIHRlc3RNZXJnZUNvbXBvbmVudFdpdGhBc3NlbWJseV9TaG91bGRNZXJnZU9uZUZpbGVTZXRUb09uZU9mRXhpc3RpbmdUd28oKQotICAgIC8vIHsKLSAgICAvLyBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgIC8vCi0gICAgLy8gRmlsZVNldCBmcyA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgLy8gZnMuc2V0RGlyZWN0b3J5KCAiL2RpciIgKTsKLSAgICAvLyBmcy5hZGRJbmNsdWRlKCAiKiovdGVzdC50eHQiICk7Ci0gICAgLy8KLSAgICAvLyBhc3NlbWJseS5hZGRGaWxlU2V0KCBmcyApOwotICAgIC8vCi0gICAgLy8gZnMgPSBuZXcgRmlsZVNldCgpOwotICAgIC8vIGZzLnNldERpcmVjdG9yeSggIi9vdGhlci1kaXIiICk7Ci0gICAgLy8gYXNzZW1ibHkuYWRkRmlsZVNldCggZnMgKTsKLSAgICAvLwotICAgIC8vIGZzID0gbmV3IEZpbGVTZXQoKTsKLSAgICAvLyBmcy5zZXREaXJlY3RvcnkoICIvZGlyIiApOwotICAgIC8vIGZzLmFkZEluY2x1ZGUoICIqKi9jb21wb25lbnRzLnR4dCIgKTsKLSAgICAvLwotICAgIC8vIENvbXBvbmVudCBjb21wb25lbnQgPSBuZXcgQ29tcG9uZW50KCk7Ci0gICAgLy8KLSAgICAvLyBjb21wb25lbnQuYWRkRmlsZVNldCggZnMgKTsKLSAgICAvLwotICAgIC8vIG5ldyBEZWZhdWx0QXNzZW1ibHlSZWFkZXIoKS5tZXJnZUNvbXBvbmVudFdpdGhBc3NlbWJseSggY29tcG9uZW50LAotICAgIC8vIGFzc2VtYmx5ICk7Ci0gICAgLy8KLSAgICAvLyBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gYXNzZW1ibHkuZ2V0RmlsZVNldHMoKTsKLSAgICAvLwotICAgIC8vIGFzc2VydE5vdE51bGwoIGZpbGVTZXRzICk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCAyLCBmaWxlU2V0cy5zaXplKCkgKTsKLSAgICAvLwotICAgIC8vIEZpbGVTZXQgcmZzMSA9IChGaWxlU2V0KSBmaWxlU2V0cy5nZXQoIDAgKTsKLSAgICAvLyBhc3NlcnRFcXVhbHMoICIvZGlyIiwgcmZzMS5nZXREaXJlY3RvcnkoKSApOwotICAgIC8vCi0gICAgLy8gTGlzdCBpbmNsdWRlcyA9IHJmczEuZ2V0SW5jbHVkZXMoKTsKLSAgICAvLwotICAgIC8vIGFzc2VydE5vdE51bGwoIGluY2x1ZGVzICk7Ci0gICAgLy8gYXNzZXJ0RXF1YWxzKCAyLCBpbmNsdWRlcy5zaXplKCkgKTsKLSAgICAvLyBhc3NlcnRUcnVlKCBpbmNsdWRlcy5jb250YWlucyggIioqL3Rlc3QudHh0IiApICk7Ci0gICAgLy8gYXNzZXJ0VHJ1ZSggaW5jbHVkZXMuY29udGFpbnMoICIqKi9jb21wb25lbnRzLnR4dCIgKSApOwotICAgIC8vCi0gICAgLy8gRmlsZVNldCByZnMyID0gKEZpbGVTZXQpIGZpbGVTZXRzLmdldCggMSApOwotICAgIC8vIGFzc2VydEVxdWFscyggIi9vdGhlci1kaXIiLCByZnMyLmdldERpcmVjdG9yeSgpICk7Ci0gICAgLy8KLSAgICAvLyB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VDb21wb25lbnRzV2l0aE1haW5Bc3NlbWJseV9TaG91bGRBZGRPbmVGaWxlU2V0VG9Bc3NlbWJseSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBDb21wb25lbnQgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgpOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgZmlsZVNldCA9IG5ldyBGaWxlU2V0KCk7Ci0gICAgICAgIGZpbGVTZXQuc2V0RGlyZWN0b3J5KCAiL2RpciIgKTsKLQotICAgICAgICBjb21wb25lbnQuYWRkRmlsZVNldCggZmlsZVNldCApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgY29tcG9uZW50RmlsZSA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBGaWxlKCk7Ci0KLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBjb21wb25lbnRGaWxlICksICJVVEYtOCIgKTsKLQotICAgICAgICAgICAgZmluYWwgQ29tcG9uZW50WHBwM1dyaXRlciBjb21wb25lbnRXcml0ZXIgPSBuZXcgQ29tcG9uZW50WHBwM1dyaXRlcigpOwotCi0gICAgICAgICAgICBjb21wb25lbnRXcml0ZXIud3JpdGUoIHdyaXRlciwgY29tcG9uZW50ICk7Ci0gICAgICAgICAgICB3cml0ZXIuZmx1c2goKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jbG9zZSggd3JpdGVyICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZW5hbWUgPSBjb21wb25lbnRGaWxlLmdldE5hbWUoKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseS5hZGRDb21wb25lbnREZXNjcmlwdG9yKCBmaWxlbmFtZSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGNvbXBvbmVudEZpbGUuZ2V0UGFyZW50RmlsZSgpOwotCi0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBuZXcgTWF2ZW5Qcm9qZWN0KCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpKS5hbmRSZXR1cm4oIHByb2plY3QgKS5hbnlUaW1lcygpOwotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggYmFzZWRpciApLmFueVRpbWVzKCk7Ci0gICAgICAgIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5zZXR1cEludGVycG9sYXRvcnMoIGNvbmZpZ1NvdXJjZSApOwotICAgICAgICBJbnRlcnBvbGF0aW9uU3RhdGUgaXMgPSBuZXcgSW50ZXJwb2xhdGlvblN0YXRlKCk7Ci0gICAgICAgIENvbXBvbmVudFhwcDNSZWFkZXIuQ29udGVudFRyYW5zZm9ybWVyIGNvbXBvbmVudElwID0gQXNzZW1ibHlJbnRlcnBvbGF0b3IuY29tcG9uZW50SW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuY3JlYXRlKCksIGlzLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAiY29uc29sZSIgKSApOwotCi0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgbmV3IERlZmF1bHRBc3NlbWJseVJlYWRlcigpLm1lcmdlQ29tcG9uZW50c1dpdGhNYWluQXNzZW1ibHkoIGFzc2VtYmx5LCBudWxsLCBjb25maWdTb3VyY2UsIGNvbXBvbmVudElwICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxGaWxlU2V0PiBmaWxlU2V0cyA9IGFzc2VtYmx5LmdldEZpbGVTZXRzKCk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggZmlsZVNldHMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBmaWxlU2V0cy5zaXplKCkgKTsKLQotICAgICAgICBmaW5hbCBGaWxlU2V0IGZzID0gZmlsZVNldHMuZ2V0KCAwICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiL2RpciIsIGZzLmdldERpcmVjdG9yeSgpICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRBc3NlbWJseV9TaG91bGRSZWFkQXNzZW1ibHlXaXRob3V0Q29tcG9uZW50c0ludGVycG9sYXRpb25PclNpdGVEaXJJbmNsdXNpb24oKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIGFzc2VtYmx5LnNldElkKCAidGVzdCIgKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmdSZWFkZXIgc3IgPSB3cml0ZVRvU3RyaW5nUmVhZGVyKCBhc3NlbWJseSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggYmFzZWRpciApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwIiApOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QiICk7Ci0gICAgICAgIG1vZGVsLnNldFZlcnNpb24oICJ2ZXJzaW9uIiApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCkpLmFuZFJldHVybiggcHJvamVjdCApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNTaXRlSW5jbHVkZWQoKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0gICAgICAgIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5zZXR1cEludGVycG9sYXRvcnMoIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdCA9IG5ldyBEZWZhdWx0QXNzZW1ibHlSZWFkZXIoKS5yZWFkQXNzZW1ibHkoIHNyLCAidGVzdExvY2F0aW9uIiwgbnVsbCwgY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc3NlbWJseS5nZXRJZCgpLCByZXN1bHQuZ2V0SWQoKSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQXNzZW1ibHlfU2hvdWxkUmVhZEFzc2VtYmx5V2l0aFNpdGVEaXJJbmNsdXNpb25Gcm9tQXNzZW1ibHlXaXRob3V0Q29tcG9uZW50c09ySW50ZXJwb2xhdGlvbigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJ0ZXN0IiApOwotCi0gICAgICAgIGFzc2VtYmx5LnNldEluY2x1ZGVTaXRlRGlyZWN0b3J5KCB0cnVlICk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nUmVhZGVyIHNyID0gd3JpdGVUb1N0cmluZ1JlYWRlciggYXNzZW1ibHkgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIHNpdGVEaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0U2l0ZURpcmVjdG9yeSgpKS5hbmRSZXR1cm4oIHNpdGVEaXIgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggYmFzZWRpciApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwIiApOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QiICk7Ci0gICAgICAgIG1vZGVsLnNldFZlcnNpb24oICJ2ZXJzaW9uIiApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLQotICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldFByb2plY3QoKSkuYW5kUmV0dXJuKCBwcm9qZWN0ICkuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc1NpdGVJbmNsdWRlZCgpKS5hbmRSZXR1cm4oIGZhbHNlICkuYW55VGltZXMoKTsKLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibHkgcmVzdWx0ID0gbmV3IERlZmF1bHRBc3NlbWJseVJlYWRlcigpLnJlYWRBc3NlbWJseSggc3IsICJ0ZXN0TG9jYXRpb24iLCBudWxsLCBjb25maWdTb3VyY2UgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzc2VtYmx5LmdldElkKCksIHJlc3VsdC5nZXRJZCgpICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxGaWxlU2V0PiBmaWxlU2V0cyA9IHJlc3VsdC5nZXRGaWxlU2V0cygpOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggMSwgZmlsZVNldHMuc2l6ZSgpICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiL3NpdGUiLCBmaWxlU2V0cy5nZXQoIDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldE91dHB1dERpcmVjdG9yeSgpICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRBc3NlbWJseV9TaG91bGRSZWFkQXNzZW1ibHlXaXRoU2l0ZURpckluY2x1c2lvbkZyb21Db25maWdXaXRob3V0Q29tcG9uZW50c09ySW50ZXJwb2xhdGlvbigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJ0ZXN0IiApOwotCi0gICAgICAgIGZpbmFsIFN0cmluZ1JlYWRlciBzciA9IHdyaXRlVG9TdHJpbmdSZWFkZXIoIGFzc2VtYmx5ICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBzaXRlRGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFNpdGVEaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCBzaXRlRGlyICkuYW55VGltZXMoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0QmFzZWRpcigpKS5hbmRSZXR1cm4oIGJhc2VkaXIgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoICJncm91cCIgKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggImFydGlmYWN0IiApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCAidmVyc2lvbiIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpKS5hbmRSZXR1cm4oIHByb2plY3QgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmlzU2l0ZUluY2x1ZGVkKCkpLmFuZFJldHVybiggdHJ1ZSApLmFueVRpbWVzKCk7Ci0gICAgICAgIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5zZXR1cEludGVycG9sYXRvcnMoIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdCA9IG5ldyBEZWZhdWx0QXNzZW1ibHlSZWFkZXIoKS5yZWFkQXNzZW1ibHkoIHNyLCAidGVzdExvY2F0aW9uIiwgbnVsbCwgY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBhc3NlbWJseS5nZXRJZCgpLCByZXN1bHQuZ2V0SWQoKSApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8RmlsZVNldD4gZmlsZVNldHMgPSByZXN1bHQuZ2V0RmlsZVNldHMoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIGZpbGVTZXRzLnNpemUoKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggIi9zaXRlIiwgZmlsZVNldHMuZ2V0KCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRPdXRwdXREaXJlY3RvcnkoKSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQXNzZW1ibHlfU2hvdWxkUmVhZEFzc2VtYmx5V2l0aENvbXBvbmVudFdpdGhvdXRTaXRlRGlySW5jbHVzaW9uT3JJbnRlcnBvbGF0aW9uKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGNvbXBvbmVudHNGaWxlID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcEZpbGUoKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBjb21wb25lbnRzRmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBjb21wb25lbnRzRmlsZW5hbWUgPSBjb21wb25lbnRzRmlsZS5nZXROYW1lKCk7Ci0KLSAgICAgICAgZmluYWwgQ29tcG9uZW50IGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoKTsKLQotICAgICAgICBmaW5hbCBGaWxlU2V0IGZzID0gbmV3IEZpbGVTZXQoKTsKLSAgICAgICAgZnMuc2V0RGlyZWN0b3J5KCAiL2RpciIgKTsKLQotICAgICAgICBjb21wb25lbnQuYWRkRmlsZVNldCggZnMgKTsKLQotICAgICAgICBXcml0ZXIgZncgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBjb21wb25lbnRzRmlsZSApLCAiVVRGLTgiICk7Ci0gICAgICAgICAgICBuZXcgQ29tcG9uZW50WHBwM1dyaXRlcigpLndyaXRlKCBmdywgY29tcG9uZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2UoIGZ3ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseS5zZXRJZCggInRlc3QiICk7Ci0KLSAgICAgICAgYXNzZW1ibHkuYWRkQ29tcG9uZW50RGVzY3JpcHRvciggY29tcG9uZW50c0ZpbGVuYW1lICk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nUmVhZGVyIHNyID0gd3JpdGVUb1N0cmluZ1JlYWRlciggYXNzZW1ibHkgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggYmFzZWRpciApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwIiApOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QiICk7Ci0gICAgICAgIG1vZGVsLnNldFZlcnNpb24oICJ2ZXJzaW9uIiApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpKS5hbmRSZXR1cm4oIHByb2plY3QgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmlzU2l0ZUluY2x1ZGVkKCkpLmFuZFJldHVybiggZmFsc2UgKS5hbnlUaW1lcygpOwotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBjb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQgPSBuZXcgRGVmYXVsdEFzc2VtYmx5UmVhZGVyKCkucmVhZEFzc2VtYmx5KCBzciwgInRlc3RMb2NhdGlvbiIsIG51bGwsIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNzZW1ibHkuZ2V0SWQoKSwgcmVzdWx0LmdldElkKCkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gcmVzdWx0LmdldEZpbGVTZXRzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBmaWxlU2V0cy5zaXplKCkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICIvZGlyIiwgZmlsZVNldHMuZ2V0KCAwICkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldERpcmVjdG9yeSgpICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRBc3NlbWJseV9TaG91bGRSZWFkQXNzZW1ibHlXaXRoQ29tcG9uZW50SW50ZXJwb2xhdGlvbldpdGhvdXRTaXRlRGlySW5jbHVzaW9uT3JBc3NlbWJseUludGVycG9sYXRpb24oKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGUgY29tcG9uZW50c0ZpbGUgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRmlsZSgpOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGNvbXBvbmVudHNGaWxlLmdldFBhcmVudEZpbGUoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIGNvbXBvbmVudHNGaWxlbmFtZSA9IGNvbXBvbmVudHNGaWxlLmdldE5hbWUoKTsKLQotICAgICAgICBmaW5hbCBDb21wb25lbnQgY29tcG9uZW50ID0gbmV3IENvbXBvbmVudCgpOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICBmcy5zZXREaXJlY3RvcnkoICIke2dyb3VwSWR9LWRpciIgKTsKLQotICAgICAgICBjb21wb25lbnQuYWRkRmlsZVNldCggZnMgKTsKLQotICAgICAgICBXcml0ZXIgZncgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBmdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoIG5ldyBGaWxlT3V0cHV0U3RyZWFtKCBjb21wb25lbnRzRmlsZSApLCAiVVRGLTgiICk7Ci0gICAgICAgICAgICBuZXcgQ29tcG9uZW50WHBwM1dyaXRlcigpLndyaXRlKCBmdywgY29tcG9uZW50ICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2UoIGZ3ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseS5zZXRJZCggInRlc3QiICk7Ci0KLSAgICAgICAgYXNzZW1ibHkuYWRkQ29tcG9uZW50RGVzY3JpcHRvciggY29tcG9uZW50c0ZpbGVuYW1lICk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nUmVhZGVyIHNyID0gd3JpdGVUb1N0cmluZ1JlYWRlciggYXNzZW1ibHkgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggYmFzZWRpciApLmF0TGVhc3RPbmNlKCk7Ci0KLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwIiApOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QiICk7Ci0gICAgICAgIG1vZGVsLnNldFZlcnNpb24oICJ2ZXJzaW9uIiApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCkpLmFuZFJldHVybiggcHJvamVjdCApLmF0TGVhc3RPbmNlKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNTaXRlSW5jbHVkZWQoKSkuYW5kUmV0dXJuKCBmYWxzZSApOwotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBjb25maWdTb3VyY2UgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQgPSBuZXcgRGVmYXVsdEFzc2VtYmx5UmVhZGVyKCkucmVhZEFzc2VtYmx5KCBzciwgInRlc3RMb2NhdGlvbiIsIG51bGwsIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNzZW1ibHkuZ2V0SWQoKSwgcmVzdWx0LmdldElkKCkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PEZpbGVTZXQ+IGZpbGVTZXRzID0gcmVzdWx0LmdldEZpbGVTZXRzKCk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAxLCBmaWxlU2V0cy5zaXplKCkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJncm91cC1kaXIiLCBmaWxlU2V0cy5nZXQoIDAgKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREaXJlY3RvcnkoKSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nUmVhZGVyIHdyaXRlVG9TdHJpbmdSZWFkZXIoIEFzc2VtYmx5IGFzc2VtYmx5ICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5WHBwM1dyaXRlciBhc3NlbWJseVdyaXRlciA9IG5ldyBBc3NlbWJseVhwcDNXcml0ZXIoKTsKLQotICAgICAgICBhc3NlbWJseVdyaXRlci53cml0ZSggc3csIGFzc2VtYmx5ICk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdSZWFkZXIoIHN3LnRvU3RyaW5nKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFzc2VtYmx5X1Nob3VsZFJlYWRBc3NlbWJseVdpdGhJbnRlcnBvbGF0aW9uV2l0aG91dENvbXBvbmVudHNPclNpdGVEaXJJbmNsdXNpb24oKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5ID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIGFzc2VtYmx5LnNldElkKCAiJHtncm91cElkfS1hc3NlbWJseSIgKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmdSZWFkZXIgc3IgPSB3cml0ZVRvU3RyaW5nUmVhZGVyKCBhc3NlbWJseSApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggYmFzZWRpciApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggImdyb3VwIiApOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCAiYXJ0aWZhY3QiICk7Ci0gICAgICAgIG1vZGVsLnNldFZlcnNpb24oICJ2ZXJzaW9uIiApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0ID0gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCkpLmFuZFJldHVybiggcHJvamVjdCApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNTaXRlSW5jbHVkZWQoKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibHkgcmVzdWx0ID0gbmV3IERlZmF1bHRBc3NlbWJseVJlYWRlcigpLnJlYWRBc3NlbWJseSggc3IsICJ0ZXN0TG9jYXRpb24iLCBudWxsLCBjb25maWdTb3VyY2UgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJncm91cC1hc3NlbWJseSIsIHJlc3VsdC5nZXRJZCgpICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEFzc2VtYmx5RnJvbURlc2NyaXB0b3JGaWxlX1Nob3VsZFJlYWRBc3NlbWJseSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJ0ZXN0IiApOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICBmcy5zZXREaXJlY3RvcnkoICIvZGlyIiApOwotCi0gICAgICAgIGFzc2VtYmx5LmFkZEZpbGVTZXQoIGZzICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBhc3NlbWJseUZpbGUgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRmlsZSgpOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGFzc2VtYmx5RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0QmFzZWRpcigpKS5hbmRSZXR1cm4oIGJhc2VkaXIpLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0UHJvamVjdCgpKS5hbmRSZXR1cm4oIG5ldyBNYXZlblByb2plY3QoIG5ldyBNb2RlbCgpICkpLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuaXNTaXRlSW5jbHVkZWQoKSkuYW5kUmV0dXJuKCBmYWxzZSApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKCBuZXcgRmlsZU91dHB1dFN0cmVhbSggYXNzZW1ibHlGaWxlICksICJVVEYtOCIgKTsKLSAgICAgICAgICAgIG5ldyBBc3NlbWJseVhwcDNXcml0ZXIoKS53cml0ZSggd3JpdGVyLCBhc3NlbWJseSApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKCB3cml0ZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdCA9IG5ldyBEZWZhdWx0QXNzZW1ibHlSZWFkZXIoKS5nZXRBc3NlbWJseUZyb21EZXNjcmlwdG9yRmlsZSggYXNzZW1ibHlGaWxlLCBjb25maWdTb3VyY2UgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzc2VtYmx5LmdldElkKCksIHJlc3VsdC5nZXRJZCgpICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldEFzc2VtYmx5Rm9yRGVzY3JpcHRvclJlZmVyZW5jZV9TaG91bGRSZWFkQmluYXJ5QXNzZW1ibHlSZWYoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRCYXNlZGlyKCkpLmFuZFJldHVybiggYmFzZWRpcikuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXRQcm9qZWN0KCkpLmFuZFJldHVybiggbmV3IE1hdmVuUHJvamVjdCggbmV3IE1vZGVsKCkgKSkuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc1NpdGVJbmNsdWRlZCgpKS5hbmRSZXR1cm4oIGZhbHNlICkuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5pc0lnbm9yZU1pc3NpbmdEZXNjcmlwdG9yKCkpLmFuZFJldHVybiggZmFsc2UgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5zZXR1cEludGVycG9sYXRvcnMoIGNvbmZpZ1NvdXJjZSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdCA9IG5ldyBEZWZhdWx0QXNzZW1ibHlSZWFkZXIoKS5nZXRBc3NlbWJseUZvckRlc2NyaXB0b3JSZWZlcmVuY2UoICJiaW4iLCBjb25maWdTb3VyY2UgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJiaW4iLCByZXN1bHQuZ2V0SWQoKSApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQXNzZW1ibGllc19TaG91bGRHZXRBc3NlbWJseURlc2NyaXB0b3JGcm9tU2luZ2xlRmlsZSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkuc2V0SWQoICJ0ZXN0IiApOwotCi0gICAgICAgIGZpbmFsIEZpbGVTZXQgZnMgPSBuZXcgRmlsZVNldCgpOwotICAgICAgICBmcy5zZXREaXJlY3RvcnkoICIvZGlyIiApOwotCi0gICAgICAgIGFzc2VtYmx5LmFkZEZpbGVTZXQoIGZzICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBmaWxlcyA9IHdyaXRlQXNzZW1ibGllc1RvRmlsZSggQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggYXNzZW1ibHkgKSwgYmFzZWRpciApOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBhc3NlbWJseUZpbGUgPSBmaWxlcy5nZXQoIDAgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PEFzc2VtYmx5PiBhc3NlbWJsaWVzID0gcGVyZm9ybVJlYWRBc3NlbWJsaWVzKCBiYXNlZGlyLCBhc3NlbWJseUZpbGUsIG51bGwsIG51bGwsIG51bGwsIG51bGwgKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCBhc3NlbWJsaWVzICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMSwgYXNzZW1ibGllcy5zaXplKCkgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQgPSBhc3NlbWJsaWVzLmdldCggMCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNzZW1ibHkuZ2V0SWQoKSwgcmVzdWx0LmdldElkKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFzc2VtYmxpZXNfU2hvdWxkRmFpbFdoZW5TaW5nbGVEZXNjcmlwdG9yRmlsZU1pc3NpbmcoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBhc3NlbWJseUZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRlc3QueG1sIiApOwotICAgICAgICBhc3NlbWJseUZpbGUuZGVsZXRlKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBlcmZvcm1SZWFkQXNzZW1ibGllcyggYmFzZWRpciwgYXNzZW1ibHlGaWxlLmdldEFic29sdXRlUGF0aCgpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBmYWxzZSApOwotCi0gICAgICAgICAgICBmYWlsKCAiU2hvdWxkIGZhaWwgd2hlbiBkZXNjcmlwdG9yIGZpbGUgaXMgbWlzc2luZyBhbmQgaWdub3JlRGVzY3JpcHRvcnMgPT0gZmFsc2UiICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBc3NlbWJseVJlYWRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRBc3NlbWJsaWVzX1Nob3VsZElnbm9yZU1pc3NpbmdTaW5nbGVEZXNjcmlwdG9yRmlsZVdoZW5JZ25vcmVJc0NvbmZpZ3VyZWQoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBhc3NlbWJseUZpbGUgPSBuZXcgRmlsZSggYmFzZWRpciwgInRlc3QueG1sIiApOwotICAgICAgICBhc3NlbWJseUZpbGUuZGVsZXRlKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHBlcmZvcm1SZWFkQXNzZW1ibGllcyggYmFzZWRpciwgYXNzZW1ibHlGaWxlLmdldEFic29sdXRlUGF0aCgpLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB0cnVlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBc3NlbWJseVJlYWRFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoICJTZXR0aW5nIGlnbm9yZU1pc3NpbmdEZXNjcmlwdG9yID09IHRydWUgKHRydWUgZmxhZyBpbiBwZXJmb3JtUmVhZEFzc2VtYmxpZXMsIGFib3ZlKSBzaG91bGQgTk9UIHByb2R1Y2UgYW4gZXhjZXB0aW9uLiIgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQXNzZW1ibGllc19TaG91bGRHZXRBc3NlbWJseURlc2NyaXB0b3JGcm9tU2luZ2xlUmVmKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBc3NlbWJseT4gYXNzZW1ibGllcyA9IHBlcmZvcm1SZWFkQXNzZW1ibGllcyggYmFzZWRpciwgbnVsbCwgImJpbiIsIG51bGwsIG51bGwsIG51bGwgKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCBhc3NlbWJsaWVzICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMSwgYXNzZW1ibGllcy5zaXplKCkgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQgPSBhc3NlbWJsaWVzLmdldCggMCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggImJpbiIsIHJlc3VsdC5nZXRJZCgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlYWRBc3NlbWJsaWVzX1Nob3VsZEdldEFzc2VtYmx5RGVzY3JpcHRvckZyb21GaWxlQXJyYXkoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFzc2VtYmx5UmVhZEV4Y2VwdGlvbiwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5MSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseTEuc2V0SWQoICJ0ZXN0IiApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IGFzc2VtYmx5MiA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseTIuc2V0SWQoICJ0ZXN0MiIgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PEFzc2VtYmx5PiBhc3NlbWJsaWVzID0gbmV3IEFycmF5TGlzdDxBc3NlbWJseT4oKTsKLSAgICAgICAgYXNzZW1ibGllcy5hZGQoIGFzc2VtYmx5MSApOwotICAgICAgICBhc3NlbWJsaWVzLmFkZCggYXNzZW1ibHkyICk7Ci0KLSAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBmaWxlcyA9IHdyaXRlQXNzZW1ibGllc1RvRmlsZSggYXNzZW1ibGllcywgYmFzZWRpciApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8QXNzZW1ibHk+IHJlc3VsdHMgPQotICAgICAgICAgICAgcGVyZm9ybVJlYWRBc3NlbWJsaWVzKCBiYXNlZGlyLCBudWxsLCBudWxsLCBmaWxlcy50b0FycmF5KG5ldyBTdHJpbmdbZmlsZXMuc2l6ZSgpXSksIG51bGwsIG51bGwgKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCByZXN1bHRzICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMiwgcmVzdWx0cy5zaXplKCkgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQxID0gYXNzZW1ibGllcy5nZXQoIDAgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzc2VtYmx5MS5nZXRJZCgpLCByZXN1bHQxLmdldElkKCkgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQyID0gYXNzZW1ibGllcy5nZXQoIDEgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGFzc2VtYmx5Mi5nZXRJZCgpLCByZXN1bHQyLmdldElkKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFzc2VtYmxpZXNfU2hvdWxkR2V0QXNzZW1ibHlEZXNjcmlwdG9yRnJvbU11bHRpcGxlUmVmcygpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSBiYXNlZGlyID0gZmlsZU1hbmFnZXIuY3JlYXRlVGVtcERpcigpOwotCi0gICAgICAgIGZpbmFsIExpc3Q8QXNzZW1ibHk+IGFzc2VtYmxpZXMgPQotICAgICAgICAgICAgcGVyZm9ybVJlYWRBc3NlbWJsaWVzKCBiYXNlZGlyLCBudWxsLCBudWxsLCBudWxsLCBuZXcgU3RyaW5nW10geyAiYmluIiwgInNyYyIgfSwgbnVsbCApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIGFzc2VtYmxpZXMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAyLCBhc3NlbWJsaWVzLnNpemUoKSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdCA9IGFzc2VtYmxpZXMuZ2V0KCAwICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYmluIiwgcmVzdWx0LmdldElkKCkgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSByZXN1bHQyID0gYXNzZW1ibGllcy5nZXQoIDEgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoICJzcmMiLCByZXN1bHQyLmdldElkKCkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFzc2VtYmxpZXNfU2hvdWxkR2V0QXNzZW1ibHlEZXNjcmlwdG9yRnJvbURpcmVjdG9yeSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkxID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIGFzc2VtYmx5MS5zZXRJZCggInRlc3QiICk7Ci0KLSAgICAgICAgZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkyID0gbmV3IEFzc2VtYmx5KCk7Ci0gICAgICAgIGFzc2VtYmx5Mi5zZXRJZCggInRlc3QyIiApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8QXNzZW1ibHk+IGFzc2VtYmxpZXMgPSBuZXcgQXJyYXlMaXN0PEFzc2VtYmx5PigpOwotICAgICAgICBhc3NlbWJsaWVzLmFkZCggYXNzZW1ibHkxICk7Ci0gICAgICAgIGFzc2VtYmxpZXMuYWRkKCBhc3NlbWJseTIgKTsKLQotICAgICAgICBmaW5hbCBGaWxlIGJhc2VkaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgd3JpdGVBc3NlbWJsaWVzVG9GaWxlKCBhc3NlbWJsaWVzLCBiYXNlZGlyICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBc3NlbWJseT4gcmVzdWx0cyA9IHBlcmZvcm1SZWFkQXNzZW1ibGllcyggYmFzZWRpciwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYmFzZWRpciApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIHJlc3VsdHMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAyLCByZXN1bHRzLnNpemUoKSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdDEgPSBhc3NlbWJsaWVzLmdldCggMCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNzZW1ibHkxLmdldElkKCksIHJlc3VsdDEuZ2V0SWQoKSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdDIgPSBhc3NlbWJsaWVzLmdldCggMSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNzZW1ibHkyLmdldElkKCksIHJlc3VsdDIuZ2V0SWQoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQXNzZW1ibGllc19TaG91bGRHZXRUd29Bc3NlbWJseURlc2NyaXB0b3JzRnJvbURpcmVjdG9yeVdpdGhUaHJlZUZpbGVzKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseTEgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkxLnNldElkKCAidGVzdCIgKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseTIgPSBuZXcgQXNzZW1ibHkoKTsKLSAgICAgICAgYXNzZW1ibHkyLnNldElkKCAidGVzdDIiICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBc3NlbWJseT4gYXNzZW1ibGllcyA9IG5ldyBBcnJheUxpc3Q8QXNzZW1ibHk+KCk7Ci0gICAgICAgIGFzc2VtYmxpZXMuYWRkKCBhc3NlbWJseTEgKTsKLSAgICAgICAgYXNzZW1ibGllcy5hZGQoIGFzc2VtYmx5MiApOwotCi0gICAgICAgIGZpbmFsIEZpbGUgYmFzZWRpciA9IGZpbGVNYW5hZ2VyLmNyZWF0ZVRlbXBEaXIoKTsKLQotICAgICAgICB3cml0ZUFzc2VtYmxpZXNUb0ZpbGUoIGFzc2VtYmxpZXMsIGJhc2VkaXIgKTsKLQotICAgICAgICBmaWxlTWFuYWdlci5jcmVhdGVGaWxlKCBiYXNlZGlyLCAicmVhZG1lLnR4dCIsICJUaGlzIGlzIGp1c3QgYSByZWFkbWUgZmlsZSwgbm90IGEgZGVzY3JpcHRvci4iICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBc3NlbWJseT4gcmVzdWx0cyA9IHBlcmZvcm1SZWFkQXNzZW1ibGllcyggYmFzZWRpciwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgYmFzZWRpciApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIHJlc3VsdHMgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAyLCByZXN1bHRzLnNpemUoKSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdDEgPSBhc3NlbWJsaWVzLmdldCggMCApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNzZW1ibHkxLmdldElkKCksIHJlc3VsdDEuZ2V0SWQoKSApOwotCi0gICAgICAgIGZpbmFsIEFzc2VtYmx5IHJlc3VsdDIgPSBhc3NlbWJsaWVzLmdldCggMSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggYXNzZW1ibHkyLmdldElkKCksIHJlc3VsdDIuZ2V0SWQoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHdyaXRlQXNzZW1ibGllc1RvRmlsZSggZmluYWwgTGlzdDxBc3NlbWJseT4gYXNzZW1ibGllcywgZmluYWwgRmlsZSBkaXIgKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBmaWxlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotCi0gICAgICAgIGZvciAoZmluYWwgQXNzZW1ibHkgYXNzZW1ibHkgOiBhc3NlbWJsaWVzKSB7Ci0gICAgICAgICAgICBmaW5hbCBGaWxlIGFzc2VtYmx5RmlsZSA9IG5ldyBGaWxlKGRpciwgYXNzZW1ibHkuZ2V0SWQoKSArICIueG1sIik7Ci0KLSAgICAgICAgICAgIFdyaXRlciB3cml0ZXIgPSBudWxsOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKGFzc2VtYmx5RmlsZSksICJVVEYtOCIpOwotICAgICAgICAgICAgICAgIG5ldyBBc3NlbWJseVhwcDNXcml0ZXIoKS53cml0ZSh3cml0ZXIsIGFzc2VtYmx5KTsKLSAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgSU9VdGlsLmNsb3NlKHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGZpbGVzLmFkZChhc3NlbWJseUZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZpbGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxBc3NlbWJseT4gcGVyZm9ybVJlYWRBc3NlbWJsaWVzKCBmaW5hbCBGaWxlIGJhc2VkaXIsIGZpbmFsIFN0cmluZyBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRvclJlZiwgZmluYWwgU3RyaW5nW10gZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGRlc2NyaXB0b3JSZWZzLCBmaW5hbCBGaWxlIGRlc2NyaXB0b3JEaXIgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlSZWFkRXhjZXB0aW9uLCBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHBlcmZvcm1SZWFkQXNzZW1ibGllcyggYmFzZWRpciwgZGVzY3JpcHRvciwgZGVzY3JpcHRvclJlZiwgZGVzY3JpcHRvcnMsIGRlc2NyaXB0b3JSZWZzLCBkZXNjcmlwdG9yRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgTGlzdDxBc3NlbWJseT4gcGVyZm9ybVJlYWRBc3NlbWJsaWVzKCBmaW5hbCBGaWxlIGJhc2VkaXIsIGZpbmFsIFN0cmluZyBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRvclJlZiwgZmluYWwgU3RyaW5nW10gZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGRlc2NyaXB0b3JSZWZzLCBmaW5hbCBGaWxlIGRlc2NyaXB0b3JEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlTWlzc2luZyApCi0gICAgICAgIHRocm93cyBBc3NlbWJseVJlYWRFeGNlcHRpb24sIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXREZXNjcmlwdG9yKCkpLmFuZFJldHVybiggZGVzY3JpcHRvciApOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldERlc2NyaXB0b3JJZCgpKS5hbmRSZXR1cm4oIGRlc2NyaXB0b3JSZWYgKTsKLQotICAgICAgICBleHBlY3QoIGNvbmZpZ1NvdXJjZS5nZXREZXNjcmlwdG9yUmVmZXJlbmNlcygpKS5hbmRSZXR1cm4oIGRlc2NyaXB0b3JSZWZzICk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0RGVzY3JpcHRvcnMoKSkuYW5kUmV0dXJuKCBkZXNjcmlwdG9ycyApOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldERlc2NyaXB0b3JTb3VyY2VEaXJlY3RvcnkoKSkuYW5kUmV0dXJuKCBkZXNjcmlwdG9yRGlyICk7Ci0KLSAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0QmFzZWRpcigpKS5hbmRSZXR1cm4oIGJhc2VkaXIgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmdldFByb2plY3QoKSkuYW5kUmV0dXJuKCBuZXcgTWF2ZW5Qcm9qZWN0KCBuZXcgTW9kZWwoKSApKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmlzU2l0ZUluY2x1ZGVkKCkpLmFuZFJldHVybiggZmFsc2UgKS5hbnlUaW1lcygpOwotCi0gICAgICAgIGV4cGVjdCggY29uZmlnU291cmNlLmlzSWdub3JlTWlzc2luZ0Rlc2NyaXB0b3IoKSkuYW5kUmV0dXJuKCAgaWdub3JlTWlzc2luZykuYW55VGltZXMoKTsKLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxBc3NlbWJseT4gYXNzZW1ibGllcyA9IG5ldyBEZWZhdWx0QXNzZW1ibHlSZWFkZXIoKS5yZWFkQXNzZW1ibGllcyggY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0KLSAgICAgICAgcmV0dXJuIGFzc2VtYmxpZXM7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vUHJlZml4ZWRDbGFzc3BhdGhMb2NhdG9yU3RyYXRlZ3lUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvaW8vUHJlZml4ZWRDbGFzc3BhdGhMb2NhdG9yU3RyYXRlZ3lUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MjY1ZTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L2lvL1ByZWZpeGVkQ2xhc3NwYXRoTG9jYXRvclN0cmF0ZWd5VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5pbzsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmlvLmxvY2F0aW9uLkxvY2F0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmlvLmxvY2F0aW9uLkxvY2F0b3JTdHJhdGVneTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5pby5sb2dnaW5nLkRlZmF1bHRNZXNzYWdlSG9sZGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uc2hhcmVkLmlvLmxvZ2dpbmcuTWVzc2FnZUhvbGRlcjsKLQotLyoqCi0gKiBAYXV0aG9yIEJlbmphbWluIEJlbnRtYW5uCi0gKi8KLXB1YmxpYyBjbGFzcyBQcmVmaXhlZENsYXNzcGF0aExvY2F0b3JTdHJhdGVneVRlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVByZWZpeFdpdGhMZWFkaW5nU2xhc2hBbmRXaXRoVHJhaWxpbmdTbGFzaCgpCi0gICAgewotICAgICAgICBNZXNzYWdlSG9sZGVyIG1oID0gbmV3IERlZmF1bHRNZXNzYWdlSG9sZGVyKCk7Ci0KLSAgICAgICAgTG9jYXRvclN0cmF0ZWd5IGxzID0gbmV3IFByZWZpeGVkQ2xhc3NwYXRoTG9jYXRvclN0cmF0ZWd5KCAiL2Fzc2VtYmxpZXMvIiApOwotICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IGxzLnJlc29sdmUoICJlbXB0eS54bWwiLCBtaCApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIGxvY2F0aW9uICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMCwgbWguc2l6ZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVQcmVmaXhXaXRoTGVhZGluZ1NsYXNoQW5kV2l0aG91dFRyYWlsaW5nU2xhc2goKQotICAgIHsKLSAgICAgICAgTWVzc2FnZUhvbGRlciBtaCA9IG5ldyBEZWZhdWx0TWVzc2FnZUhvbGRlcigpOwotCi0gICAgICAgIExvY2F0b3JTdHJhdGVneSBscyA9IG5ldyBQcmVmaXhlZENsYXNzcGF0aExvY2F0b3JTdHJhdGVneSggIi9hc3NlbWJsaWVzIiApOwotICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IGxzLnJlc29sdmUoICJlbXB0eS54bWwiLCBtaCApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIGxvY2F0aW9uICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMCwgbWguc2l6ZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVQcmVmaXhXaXRob3V0TGVhZGluZ1NsYXNoQW5kV2l0aFRyYWlsaW5nU2xhc2goKQotICAgIHsKLSAgICAgICAgTWVzc2FnZUhvbGRlciBtaCA9IG5ldyBEZWZhdWx0TWVzc2FnZUhvbGRlcigpOwotCi0gICAgICAgIExvY2F0b3JTdHJhdGVneSBscyA9IG5ldyBQcmVmaXhlZENsYXNzcGF0aExvY2F0b3JTdHJhdGVneSggImFzc2VtYmxpZXMvIiApOwotICAgICAgICBMb2NhdGlvbiBsb2NhdGlvbiA9IGxzLnJlc29sdmUoICJlbXB0eS54bWwiLCBtaCApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIGxvY2F0aW9uICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMCwgbWguc2l6ZSgpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVQcmVmaXhXaXRob3V0TGVhZGluZ1NsYXNoQW5kV2l0aG91dFRyYWlsaW5nU2xhc2goKQotICAgIHsKLSAgICAgICAgTWVzc2FnZUhvbGRlciBtaCA9IG5ldyBEZWZhdWx0TWVzc2FnZUhvbGRlcigpOwotCi0gICAgICAgIExvY2F0b3JTdHJhdGVneSBscyA9IG5ldyBQcmVmaXhlZENsYXNzcGF0aExvY2F0b3JTdHJhdGVneSggImFzc2VtYmxpZXMiICk7Ci0gICAgICAgIExvY2F0aW9uIGxvY2F0aW9uID0gbHMucmVzb2x2ZSggImVtcHR5LnhtbCIsIG1oICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggbG9jYXRpb24gKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAwLCBtaC5zaXplKCkgKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS90ZXN0dXRpbHMvUG9qb0NvbmZpZ1NvdXJjZS5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3R1dGlscy9Qb2pvQ29uZmlnU291cmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3ZDMwOGUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3R1dGlscy9Qb2pvQ29uZmlnU291cmNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDcgKzAsMCBAQAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdHV0aWxzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcmNoaXZlci5NYXZlbkFyY2hpdmVDb25maWd1cmF0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QucmVwb3NpdG9yeS5BcnRpZmFjdFJlcG9zaXRvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5leGVjdXRpb24uTWF2ZW5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LkFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnNoYXJlZC5maWx0ZXJpbmcuTWF2ZW5SZWFkZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5pbnRlcnBvbGF0aW9uLmZpeGVkLkZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yOwotCi1pbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Ob25udWxsOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFBvam9Db25maWdTb3VyY2UgaW1wbGVtZW50cyBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlCi17Ci0gICAgU3RyaW5nIGRlc2NyaXB0b3I7Ci0KLSAgICBwcml2YXRlIEZpbGUgYmFzZWRpcjsKLQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IG1hdmVuUHJvamVjdDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1NpdGVuY2x1ZGVkOwotCi0gICAgcHJpdmF0ZSBGaWxlIHNpdGVEaXJlY3Rvcnk7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBkZWNyaXB0b3JJZDsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZpbmFsTmFtZTsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGRlbGltaXRlcnM7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlc2NhcGVTdHJpbmc7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBlbmNvZGluZzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1VwZGF0ZU9ubHk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNVc2VKdm1DaG1vZDsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0lnbm9yZVBlcm1pc3Npb25zOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgYXJjaGl2ZXJDb25maWc7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNBc3NlbWJseUlkQXBwZW5kZWQ7Ci0KLSAgICBwcml2YXRlIFN0cmluZyBjbGFzc2lmaWVyOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgdGFyTG9uZ0ZpbGVNb2RlOwotCi0gICAgcHJpdmF0ZSBGaWxlIHdvcmtpbmdEaXJlY3Rvcnk7Ci0KLSAgICBwcml2YXRlIE1hdmVuQXJjaGl2ZUNvbmZpZ3VyYXRpb24gamFyQXJjaGl2ZUNvbmZpZ3VyYXRpb247Ci0KLSAgICBwcml2YXRlIE1hdmVuUmVhZGVyRmlsdGVyIG1hdmVuUmVhZGVyRmlsdGVyOwotCi0gICAgcHJpdmF0ZSBGaWxlIG91dHB1dERpcmVjdG9yeTsKLQotICAgIHByaXZhdGUgU3RyaW5nW10gZGVzY3JpcHRvcnM7Ci0KLSAgICBwcml2YXRlIFN0cmluZ1tdIGRlc2NyaXB0b3JSZWZlcmVuY2VzOwotCi0gICAgcHJpdmF0ZSBGaWxlIGRlc2NyaXB0b3JTb3VyY2VSZWZlcmVuY2U7Ci0KLSAgICBwcml2YXRlIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnk7Ci0KLSAgICBwcml2YXRlIEZpbGUgdGVtcG9yYXJ5Um9vdERpcmVjdG9yeTsKLQotICAgIHByaXZhdGUgRmlsZSBhcmNoaXZlQmFzZURpcmVjdG9yeTsKLQotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGZpbHRlcnM7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJbmNsdWRlUHJvamVjdEJ1aWxkRmlsdGVyOwotCi0gICAgcHJpdmF0ZSBMaXN0PE1hdmVuUHJvamVjdD4gcmVhY3RvclByb2plY3RzOwotCi0gICAgcHJpdmF0ZSBMaXN0PEFydGlmYWN0UmVwb3NpdG9yeT4gcmVtb3RlUmVwb3NpdG9yeTsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0RyeVJ1bjsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0lnbm9yZURpckZvcm1hdEV4dGVuc2lvbnM7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJZ25vcmVNaXNzaW5nRGVzY3JpcHRvcjsKLQotICAgIHByaXZhdGUgTWF2ZW5TZXNzaW9uIG1hdmVuU2Vzc2lvbjsKLQotICAgIHByaXZhdGUgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3Igcm9vdEludGVycG9sYXRvciAgPSBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvci5lbXB0eSgpOwotCi0gICAgcHJpdmF0ZSBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBlbnZpcm9ubWVudEludGVycG9sYXRvciA9IEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmVtcHR5KCk7Ci0KLSAgICBwcml2YXRlIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGVudkludGVycG9sYXRvciA9IEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmVtcHR5KCk7Ci0KLSAgICBwcml2YXRlIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIG1haW5Qcm9qZWN0SW50ZXJwb2xhdG9yOwotCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRvcklkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBkZWNyaXB0b3JJZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nW10gZ2V0RGVzY3JpcHRvcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdbXSBnZXREZXNjcmlwdG9yUmVmZXJlbmNlcygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvclJlZmVyZW5jZXM7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0RGVzY3JpcHRvclNvdXJjZURpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvclNvdXJjZVJlZmVyZW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRCYXNlZGlyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBiYXNlZGlyOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXZlblByb2plY3QgZ2V0UHJvamVjdCgpCi0gICAgewotICAgICAgICByZXR1cm4gbWF2ZW5Qcm9qZWN0OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU2l0ZUluY2x1ZGVkKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc1NpdGVuY2x1ZGVkOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldFNpdGVEaXJlY3RvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHNpdGVEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaW5hbE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbmFsTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Fzc2VtYmx5SWRBcHBlbmRlZCgpCi0gICAgewotICAgICAgICByZXR1cm4gaXNBc3NlbWJseUlkQXBwZW5kZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXRDbGFzc2lmaWVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBjbGFzc2lmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyTG9uZ0ZpbGVNb2RlKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0YXJMb25nRmlsZU1vZGU7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0T3V0cHV0RGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvdXRwdXREaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGUgZ2V0V29ya2luZ0RpcmVjdG9yeSgpCi0gICAgewotICAgICAgICByZXR1cm4gd29ya2luZ0RpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBnZXRKYXJBcmNoaXZlQ29uZmlndXJhdGlvbigpCi0gICAgewotICAgICAgICByZXR1cm4gamFyQXJjaGl2ZUNvbmZpZ3VyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIEFydGlmYWN0UmVwb3NpdG9yeSBnZXRMb2NhbFJlcG9zaXRvcnkoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxvY2FsUmVwb3NpdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZSBnZXRUZW1wb3JhcnlSb290RGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiB0ZW1wb3JhcnlSb290RGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlIGdldEFyY2hpdmVCYXNlRGlyZWN0b3J5KCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhcmNoaXZlQmFzZURpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEZpbHRlcnMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpbHRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlUHJvamVjdEJ1aWxkRmlsdGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gaXNJbmNsdWRlUHJvamVjdEJ1aWxkRmlsdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PE1hdmVuUHJvamVjdD4gZ2V0UmVhY3RvclByb2plY3RzKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiByZWFjdG9yUHJvamVjdHM7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiBnZXRSZW1vdGVSZXBvc2l0b3JpZXMoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlbW90ZVJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNEcnlSdW4oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzRHJ5UnVuOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucygpCi0gICAgewotICAgICAgICByZXR1cm4gaXNJZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSWdub3JlTWlzc2luZ0Rlc2NyaXB0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzSWdub3JlTWlzc2luZ0Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIE1hdmVuU2Vzc2lvbiBnZXRNYXZlblNlc3Npb24oKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hdmVuU2Vzc2lvbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEFyY2hpdmVyQ29uZmlnKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBhcmNoaXZlckNvbmZpZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWF2ZW5SZWFkZXJGaWx0ZXIgZ2V0TWF2ZW5SZWFkZXJGaWx0ZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG1hdmVuUmVhZGVyRmlsdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXBkYXRlT25seSgpCi0gICAgewotICAgICAgICByZXR1cm4gaXNVcGRhdGVPbmx5OwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzVXNlSnZtQ2htb2QoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGlzVXNlSnZtQ2htb2Q7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNJZ25vcmVQZXJtaXNzaW9ucygpCi0gICAgewotICAgICAgICByZXR1cm4gaXNJZ25vcmVQZXJtaXNzaW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kaW5nKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBlbmNvZGluZzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nIGdldEVzY2FwZVN0cmluZygpCi0gICAgewotICAgICAgICByZXR1cm4gZXNjYXBlU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RGVsaW1pdGVycygpCi0gICAgewotICAgICAgICByZXR1cm4gZGVsaW1pdGVyczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yKCBTdHJpbmcgZGVzY3JpcHRvciApCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEJhc2VkaXIoIEZpbGUgYmFzZWRpciApCi0gICAgewotICAgICAgICB0aGlzLmJhc2VkaXIgPSBiYXNlZGlyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1hdmVuUHJvamVjdCggTWF2ZW5Qcm9qZWN0IG1hdmVuUHJvamVjdCApCi0gICAgewotICAgICAgICB0aGlzLm1hdmVuUHJvamVjdCA9IG1hdmVuUHJvamVjdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRTaXRlbmNsdWRlZCggYm9vbGVhbiBpc1NpdGVuY2x1ZGVkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaXNTaXRlbmNsdWRlZCA9IGlzU2l0ZW5jbHVkZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0U2l0ZURpcmVjdG9yeSggRmlsZSBzaXRlRGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuc2l0ZURpcmVjdG9yeSA9IHNpdGVEaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVjcmlwdG9ySWQoIFN0cmluZyBkZWNyaXB0b3JJZCApCi0gICAgewotICAgICAgICB0aGlzLmRlY3JpcHRvcklkID0gZGVjcmlwdG9ySWQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RmluYWxOYW1lKCBTdHJpbmcgZmluYWxOYW1lICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmluYWxOYW1lID0gZmluYWxOYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlbGltaXRlcnMoIExpc3Q8U3RyaW5nPiBkZWxpbWl0ZXJzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVsaW1pdGVycyA9IGRlbGltaXRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXNjYXBlU3RyaW5nKCBTdHJpbmcgZXNjYXBlU3RyaW5nICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZXNjYXBlU3RyaW5nID0gZXNjYXBlU3RyaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVuY29kaW5nKCBTdHJpbmcgZW5jb2RpbmcgKQotICAgIHsKLSAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZU9ubHkoIGJvb2xlYW4gaXNVcGRhdGVPbmx5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaXNVcGRhdGVPbmx5ID0gaXNVcGRhdGVPbmx5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFVzZUp2bUNobW9kKCBib29sZWFuIGlzVXNlSnZtQ2htb2QgKQotICAgIHsKLSAgICAgICAgdGhpcy5pc1VzZUp2bUNobW9kID0gaXNVc2VKdm1DaG1vZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVQZXJtaXNzaW9ucyggYm9vbGVhbiBpc0lnbm9yZVBlcm1pc3Npb25zICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaXNJZ25vcmVQZXJtaXNzaW9ucyA9IGlzSWdub3JlUGVybWlzc2lvbnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXJjaGl2ZXJDb25maWcoIFN0cmluZyBhcmNoaXZlckNvbmZpZyApCi0gICAgewotICAgICAgICB0aGlzLmFyY2hpdmVyQ29uZmlnID0gYXJjaGl2ZXJDb25maWc7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXNzZW1ibHlJZEFwcGVuZGVkKCBib29sZWFuIGlzQXNzZW1ibHlJZEFwcGVuZGVkICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaXNBc3NlbWJseUlkQXBwZW5kZWQgPSBpc0Fzc2VtYmx5SWRBcHBlbmRlZDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc2lmaWVyKCBTdHJpbmcgY2xhc3NpZmllciApCi0gICAgewotICAgICAgICB0aGlzLmNsYXNzaWZpZXIgPSBjbGFzc2lmaWVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFRhckxvbmdGaWxlTW9kZSggU3RyaW5nIHRhckxvbmdGaWxlTW9kZSApCi0gICAgewotICAgICAgICB0aGlzLnRhckxvbmdGaWxlTW9kZSA9IHRhckxvbmdGaWxlTW9kZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXb3JraW5nRGlyZWN0b3J5KCBGaWxlIHdvcmtpbmdEaXJlY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy53b3JraW5nRGlyZWN0b3J5ID0gd29ya2luZ0RpcmVjdG9yeTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRKYXJBcmNoaXZlQ29uZmlndXJhdGlvbiggTWF2ZW5BcmNoaXZlQ29uZmlndXJhdGlvbiBqYXJBcmNoaXZlQ29uZmlndXJhdGlvbiApCi0gICAgewotICAgICAgICB0aGlzLmphckFyY2hpdmVDb25maWd1cmF0aW9uID0gamFyQXJjaGl2ZUNvbmZpZ3VyYXRpb247Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWF2ZW5SZWFkZXJGaWx0ZXIoIE1hdmVuUmVhZGVyRmlsdGVyIG1hdmVuUmVhZGVyRmlsdGVyICkKLSAgICB7Ci0gICAgICAgIHRoaXMubWF2ZW5SZWFkZXJGaWx0ZXIgPSBtYXZlblJlYWRlckZpbHRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPdXRwdXREaXJlY3RvcnkoIEZpbGUgb3V0cHV0RGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMub3V0cHV0RGlyZWN0b3J5ID0gb3V0cHV0RGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0b3JzKCBTdHJpbmdbXSBkZXNjcmlwdG9ycyApCi0gICAgewotICAgICAgICB0aGlzLmRlc2NyaXB0b3JzID0gZGVzY3JpcHRvcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvclJlZmVyZW5jZXMoIFN0cmluZ1tdIGRlc2NyaXB0b3JSZWZlcmVuY2VzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRvclJlZmVyZW5jZXMgPSBkZXNjcmlwdG9yUmVmZXJlbmNlczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yU291cmNlUmVmZXJlbmNlKCBGaWxlIGRlc2NyaXB0b3JTb3VyY2VSZWZlcmVuY2UgKQotICAgIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdG9yU291cmNlUmVmZXJlbmNlID0gZGVzY3JpcHRvclNvdXJjZVJlZmVyZW5jZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbFJlcG9zaXRvcnkoIEFydGlmYWN0UmVwb3NpdG9yeSBsb2NhbFJlcG9zaXRvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5sb2NhbFJlcG9zaXRvcnkgPSBsb2NhbFJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VGVtcG9yYXJ5Um9vdERpcmVjdG9yeSggRmlsZSB0ZW1wb3JhcnlSb290RGlyZWN0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMudGVtcG9yYXJ5Um9vdERpcmVjdG9yeSA9IHRlbXBvcmFyeVJvb3REaXJlY3Rvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QXJjaGl2ZUJhc2VEaXJlY3RvcnkoIEZpbGUgYXJjaGl2ZUJhc2VEaXJlY3RvcnkgKQotICAgIHsKLSAgICAgICAgdGhpcy5hcmNoaXZlQmFzZURpcmVjdG9yeSA9IGFyY2hpdmVCYXNlRGlyZWN0b3J5OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoIExpc3Q8U3RyaW5nPiBmaWx0ZXJzICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0SW5jbHVkZVByb2plY3RCdWlsZEZpbHRlciggYm9vbGVhbiBpc0luY2x1ZGVQcm9qZWN0QnVpbGRGaWx0ZXIgKQotICAgIHsKLSAgICAgICAgdGhpcy5pc0luY2x1ZGVQcm9qZWN0QnVpbGRGaWx0ZXIgPSBpc0luY2x1ZGVQcm9qZWN0QnVpbGRGaWx0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UmVhY3RvclByb2plY3RzKCBMaXN0PE1hdmVuUHJvamVjdD4gcmVhY3RvclByb2plY3RzICkKLSAgICB7Ci0gICAgICAgIHRoaXMucmVhY3RvclByb2plY3RzID0gcmVhY3RvclByb2plY3RzOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZVJlcG9zaXRvcnkoIExpc3Q8QXJ0aWZhY3RSZXBvc2l0b3J5PiByZW1vdGVSZXBvc2l0b3J5ICkKLSAgICB7Ci0gICAgICAgIHRoaXMucmVtb3RlUmVwb3NpdG9yeSA9IHJlbW90ZVJlcG9zaXRvcnk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RHJ5UnVuKCBib29sZWFuIGlzRHJ5UnVuICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaXNEcnlSdW4gPSBpc0RyeVJ1bjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVEaXJGb3JtYXRFeHRlbnNpb25zKCBib29sZWFuIGlzSWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucyApCi0gICAgewotICAgICAgICB0aGlzLmlzSWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9ucyA9IGlzSWdub3JlRGlyRm9ybWF0RXh0ZW5zaW9uczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRJZ25vcmVNaXNzaW5nRGVzY3JpcHRvciggYm9vbGVhbiBpc0lnbm9yZU1pc3NpbmdEZXNjcmlwdG9yICkKLSAgICB7Ci0gICAgICAgIHRoaXMuaXNJZ25vcmVNaXNzaW5nRGVzY3JpcHRvciA9IGlzSWdub3JlTWlzc2luZ0Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWF2ZW5TZXNzaW9uKCBNYXZlblNlc3Npb24gbWF2ZW5TZXNzaW9uICkKLSAgICB7Ci0gICAgICAgIHRoaXMubWF2ZW5TZXNzaW9uID0gbWF2ZW5TZXNzaW9uOwotICAgIH0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGdldFJlcG9zaXRvcnlJbnRlcnBvbGF0b3IoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJvb3RJbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgQE5vbm51bGwKLSAgICBwdWJsaWMgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgZ2V0Q29tbWFuZExpbmVQcm9wc0ludGVycG9sYXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gZW52aXJvbm1lbnRJbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Um9vdEludGVycG9sYXRvciggQE5vbm51bGwgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3Igcm9vdEludGVycG9sYXRvciApCi0gICAgewotICAgICAgICB0aGlzLnJvb3RJbnRlcnBvbGF0b3IgPSByb290SW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGdldEVudkludGVycG9sYXRvcigpCi0gICAgewotICAgICAgICByZXR1cm4gZW52SW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEVudkludGVycG9sYXRvciggRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IgZW52SW50ZXJwb2xhdG9yICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW52SW50ZXJwb2xhdG9yID0gZW52SW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIEBOb25udWxsCi0gICAgcHVibGljIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGdldE1haW5Qcm9qZWN0SW50ZXJwb2xhdG9yKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBtYWluUHJvamVjdEludGVycG9sYXRvcjsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyB2b2lkIHNldE1haW5Qcm9qZWN0SW50ZXJwb2xhdG9yKCBGaXhlZFN0cmluZ1NlYXJjaEludGVycG9sYXRvciBtYWluUHJvamVjdEludGVycG9sYXRvciApCi0gICAgewotICAgICAgICB0aGlzLm1haW5Qcm9qZWN0SW50ZXJwb2xhdG9yID0gbWFpblByb2plY3RJbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RW52aXJvbm1lbnRJbnRlcnBvbGF0b3IoIEBOb25udWxsIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yIGVudmlyb25tZW50SW50ZXJwb2xhdG9yICkKLSAgICB7Ci0gICAgICAgIHRoaXMuZW52aXJvbm1lbnRJbnRlcnBvbGF0b3IgPSBlbnZpcm9ubWVudEludGVycG9sYXRvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdGVzdHV0aWxzL1Rlc3RGaWxlTWFuYWdlci5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3Rlc3R1dGlscy9UZXN0RmlsZU1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMxYjJjMy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdGVzdHV0aWxzL1Rlc3RGaWxlTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdHV0aWxzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFRlc3RGaWxlTWFuYWdlcgotewotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUF9ESVJfUEFUSCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSggImphdmEuaW8udG1wZGlyIiApOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEZpbGU+IGZpbGVzVG9EZWxldGUgPSBuZXcgQXJyYXlMaXN0PEZpbGU+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBiYXNlRmlsZW5hbWU7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaWxlU3VmZml4OwotCi0gICAgcHJpdmF0ZSBTdGFja1RyYWNlRWxlbWVudCBjYWxsZXJJbmZvOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIHdhcm5BYm91dENsZWFudXAgPSBmYWxzZTsKLQotICAgIHB1YmxpYyBUZXN0RmlsZU1hbmFnZXIoIGZpbmFsIFN0cmluZyBiYXNlRmlsZW5hbWUsIGZpbmFsIFN0cmluZyBmaWxlU3VmZml4ICkKLSAgICB7Ci0gICAgICAgIHRoaXMuYmFzZUZpbGVuYW1lID0gYmFzZUZpbGVuYW1lOwotICAgICAgICB0aGlzLmZpbGVTdWZmaXggPSBmaWxlU3VmZml4OwotCi0gICAgICAgIGluaXRpYWxpemVDbGVhbnVwTW9uaXRvcmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplQ2xlYW51cE1vbml0b3JpbmcoKQotICAgIHsKLSAgICAgICAgY2FsbGVySW5mbyA9IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpLmdldFN0YWNrVHJhY2UoKVsyXTsKLQotICAgICAgICBmaW5hbCBSdW5uYWJsZSB3YXJuaW5nID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgICAgewotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1heWJlV2FybkFib3V0Q2xlYW5VcCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0KLSAgICAgICAgVGhyZWFkIGNsZWFudXBXYXJuaW5nID0gbmV3IFRocmVhZCggd2FybmluZyApOwotCi0gICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpCi0gICAgICAgICAgICAgICAuYWRkU2h1dGRvd25Ib29rKCBjbGVhbnVwV2FybmluZyApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBtYXliZVdhcm5BYm91dENsZWFuVXAoKQotICAgIHsKLSAgICAgICAgaWYgKCB3YXJuQWJvdXRDbGVhbnVwICkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAiW1dBUk5JTkddIFRlc3RGaWxlTWFuYWdlciBmcm9tOiAiICsgY2FsbGVySW5mby5nZXRDbGFzc05hbWUoKSArICIgbm90IGNsZWFuZWQgdXAhIiApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbWFya0ZvckRlbGV0aW9uKCBmaW5hbCBGaWxlIHRvRGVsZXRlICkKLSAgICB7Ci0gICAgICAgIGZpbGVzVG9EZWxldGUuYWRkKCB0b0RlbGV0ZSApOwotICAgICAgICB3YXJuQWJvdXRDbGVhbnVwID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEZpbGUgY3JlYXRlVGVtcERpcigpCi0gICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgVGhyZWFkLnNsZWVwKCAyMCApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlICkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRmlsZSBkaXIgPSBuZXcgRmlsZSggVEVNUF9ESVJfUEFUSCwgYmFzZUZpbGVuYW1lICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKTsKLQotICAgICAgICAvL25vaW5zcGVjdGlvbiBSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkCi0gICAgICAgIGRpci5ta2RpcnMoKTsKLSAgICAgICAgbWFya0ZvckRlbGV0aW9uKCBkaXIgKTsKLQotICAgICAgICByZXR1cm4gZGlyOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgRmlsZSBjcmVhdGVUZW1wRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgRmlsZSB0ZW1wRmlsZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoIGJhc2VGaWxlbmFtZSwgZmlsZVN1ZmZpeCApOwotICAgICAgICB0ZW1wRmlsZS5kZWxldGVPbkV4aXQoKTsKLSAgICAgICAgbWFya0ZvckRlbGV0aW9uKCB0ZW1wRmlsZSApOwotCi0gICAgICAgIHJldHVybiB0ZW1wRmlsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhblVwKCkKLSAgICB7Ci0gICAgICAgIGZvciAoIGZpbmFsIEl0ZXJhdG9yPEZpbGU+IGl0ID0gZmlsZXNUb0RlbGV0ZS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICAgICAgewotICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gaXQubmV4dCgpOwotCi0gICAgICAgICAgICBpZiAoIGZpbGUuZXhpc3RzKCkgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKCBmaWxlICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoICggZmluYWwgRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCAiRXJyb3Igd2hpbGUgZGVsZXRpbmcgdGVzdCBmaWxlL2RpcjogIiArIGZpbGUgKyAiOyBpZ25vcmluZy4iICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHdhcm5BYm91dENsZWFudXAgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBOT1RFOiB0aGUgZmlsZSBjb250ZW50IGlzIHdyaXR0ZW4gdXNpbmcgcGxhdGZvcm0gZW5jb2RpbmcuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoICJSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkIiApCi0gICAgcHVibGljIEZpbGUgY3JlYXRlRmlsZSggZmluYWwgRmlsZSBkaXIsIGZpbmFsIFN0cmluZyBmaWxlbmFtZSwgZmluYWwgU3RyaW5nIGNvbnRlbnRzICkgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZSggZGlyLCBmaWxlbmFtZSApOwotCi0gICAgICAgIGZpbGUuZ2V0UGFyZW50RmlsZSgpCi0gICAgICAgICAgICAubWtkaXJzKCk7Ci0KLSAgICAgICAgRmlsZVdyaXRlciB3cml0ZXIgPSBudWxsOwotCi0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIgPSBuZXcgRmlsZVdyaXRlciggZmlsZSApOyAvLyBwbGF0Zm9ybSBlbmNvZGluZwotCi0gICAgICAgICAgICB3cml0ZXIud3JpdGUoIGNvbnRlbnRzICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHdyaXRlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgbWFya0ZvckRlbGV0aW9uKCBmaWxlICk7Ci0KLSAgICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTk9URTogdGhlIGZpbGUgY29udGVudCBpcyByZWFkIHVzaW5nIHBsYXRmb3JtIGVuY29kaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZUNvbnRlbnRzKCBmaW5hbCBGaWxlIGZpbGUgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyByZXN1bHQgPSBudWxsOwotCi0gICAgICAgIEZpbGVSZWFkZXIgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCBmaWxlICk7IC8vIHBsYXRmb3JtIGVuY29kaW5nCi0KLSAgICAgICAgICAgIHJlc3VsdCA9IElPVXRpbC50b1N0cmluZyggcmVhZGVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBJT1V0aWwuY2xvc2UoIHJlYWRlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUKLSAgICB7Ci0gICAgICAgIG1heWJlV2FybkFib3V0Q2xlYW5VcCgpOwotCi0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvQXNzZW1ibHlGaWxlVXRpbHNUZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvQXNzZW1ibHlGaWxlVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3YzcyMzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0Fzc2VtYmx5RmlsZVV0aWxzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5hcmNoaXZlLkFyY2hpdmVFeHBhbnNpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkudGVzdHV0aWxzLlRlc3RGaWxlTWFuYWdlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLkFyY2hpdmVyRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIuVW5BcmNoaXZlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmFyY2hpdmVyLm1hbmFnZXIuQXJjaGl2ZXJNYW5hZ2VyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuYXJjaGl2ZXIubWFuYWdlci5Ob1N1Y2hBcmNoaXZlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLQotcHVibGljIGNsYXNzIEFzc2VtYmx5RmlsZVV0aWxzVGVzdAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLQotICAgIHByaXZhdGUgZmluYWwgVGVzdEZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gbmV3IFRlc3RGaWxlTWFuYWdlciggImZpbGUtdXRpbHMudGVzdC4iLCAiIiApOwotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbGVNYW5hZ2VyLmNsZWFuVXAoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VW5wYWNrX1Nob3VsZFNldFNvdXJjZUFuZERlc3RpbmF0aW9uQW5kQ2FsbEV4dHJhY3QoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEFyY2hpdmVFeHBhbnNpb25FeGNlcHRpb24sIE5vU3VjaEFyY2hpdmVyRXhjZXB0aW9uCi0gICAgewotICAgICAgICBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIgPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICAgICAgRmlsZSBzb3VyY2UgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRmlsZSgpOwotICAgICAgICBGaWxlIGRlc3REaXIgPSBmaWxlTWFuYWdlci5jcmVhdGVUZW1wRGlyKCk7Ci0KLSAgICAgICAgVW5BcmNoaXZlciB1bmFyY2hpdmVyID0gbW9ja01hbmFnZXIuY3JlYXRlTW9jayggVW5BcmNoaXZlci5jbGFzcyApOwotCi0gICAgICAgIEFyY2hpdmVyTWFuYWdlciBhcmNoaXZlck1hbmFnZXIgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKCBBcmNoaXZlck1hbmFnZXIuY2xhc3MgKTsKLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KGFyY2hpdmVyTWFuYWdlci5nZXRVbkFyY2hpdmVyKCBzb3VyY2UgKSkuYW5kUmV0dXJuKCB1bmFyY2hpdmVyICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBOb1N1Y2hBcmNoaXZlckV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCggIlNob3VsZCBuZXZlciBoYXBwZW4uIiApOwotICAgICAgICB9Ci0KLSAgICAgICAgdW5hcmNoaXZlci5zZXRTb3VyY2VGaWxlKCBzb3VyY2UgKTsKLSAgICAgICAgdW5hcmNoaXZlci5zZXREZXN0RGlyZWN0b3J5KCBkZXN0RGlyICk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHVuYXJjaGl2ZXIuZXh0cmFjdCgpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggQXJjaGl2ZXJFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoICJTaG91bGQgbmV2ZXIgaGFwcGVuLiIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIEFzc2VtYmx5RmlsZVV0aWxzLnVucGFjayggc291cmNlLCBkZXN0RGlyLCBhcmNoaXZlck1hbmFnZXIgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9Bc3NlbWJseUZvcm1hdFV0aWxzVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0Fzc2VtYmx5Rm9ybWF0VXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkNGVjMWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0Fzc2VtYmx5Rm9ybWF0VXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MzMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5leGVjdXRpb24uTWF2ZW5TZXNzaW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuQnVpbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5Bc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUuRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmFyY2hpdmUudGFzay50ZXN0dXRpbHMuQXJ0aWZhY3RNb2NrOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uYXNzZW1ibHkubW9kZWwuQXNzZW1ibHk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzLkFzc2VtYmx5Rm9ybWF0VXRpbHMuKjsKLWltcG9ydCBzdGF0aWMgb3JnLmVhc3ltb2NrLkVhc3lNb2NrLmV4cGVjdDsKLQotcHVibGljIGNsYXNzIEFzc2VtYmx5Rm9ybWF0VXRpbHNUZXN0Ci0gICAgZXh0ZW5kcyBUZXN0Q2FzZQotewotCi0gICAgcHJpdmF0ZSBmaW5hbCBFYXN5TW9ja1N1cHBvcnQgbW9ja01hbmFnZXIgPSBuZXcgRWFzeU1vY2tTdXBwb3J0KCk7Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4UmVsYXRpdmVQYXRoUmVmc19TaG91bGRSZW1vdmVSZWxhdGl2ZVJlZlRvQ3VycmVudERpcigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggInBhdGgvIiwgQXNzZW1ibHlGb3JtYXRVdGlscy5maXhSZWxhdGl2ZVJlZnMoICIuL3BhdGgvIiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpeFJlbGF0aXZlUGF0aFJlZnNfU2hvdWxkUmVtb3ZlRW1iZWRkZWRTYW1lRGlyUmVmKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAic29tZS9wYXRoLyIsIEFzc2VtYmx5Rm9ybWF0VXRpbHMuZml4UmVsYXRpdmVSZWZzKCAic29tZS8uL3BhdGgvIiApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggInNvbWVcXHBhdGhcXCIsIEFzc2VtYmx5Rm9ybWF0VXRpbHMuZml4UmVsYXRpdmVSZWZzKCAic29tZVxcLlxccGF0aFxcIiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpeFJlbGF0aXZlUGF0aFJlZnNfU2hvdWxkUmVtb3ZlRW1iZWRkZWRQYXJlbnREaXJSZWYoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoICJwYXRoLyIsIEFzc2VtYmx5Rm9ybWF0VXRpbHMuZml4UmVsYXRpdmVSZWZzKCAic29tZS8uLi9wYXRoLyIgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhSZWxhdGl2ZVBhdGhSZWZzX1Nob3VsZFRydW5jYXRlUmVsYXRpdmVSZWZUb1BhcmVudERpcigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggInBhdGgvIiwgQXNzZW1ibHlGb3JtYXRVdGlscy5maXhSZWxhdGl2ZVJlZnMoICIuLi9wYXRoLyIgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREaXN0cm9OYW1lX1Nob3VsZFVzZUp1c3RGaW5hbE5hbWVXaXRoTm9BcHBlbmRBc3NlbWJseUlkT3JDbGFzc2lmaWVyKCkKLSAgICB7Ci0gICAgICAgIHZlcmlmeURpc3Ryb05hbWUoICJhc3NlbWJseSIsIG51bGwsICJmaW5hbE5hbWUiLCBmYWxzZSwgImZpbmFsTmFtZSIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGlzdHJvTmFtZV9TaG91bGRVc2VGaW5hbE5hbWVQbHVzQ2xhc3NpZmllcldoZW5BcHBlbmRBc3NlbWJseUlkSXNOdWxsKCkKLSAgICB7Ci0gICAgICAgIHZlcmlmeURpc3Ryb05hbWUoICJhc3NlbWJseSIsICJjbGFzc2lmaWVyIiwgImZpbmFsTmFtZSIsIGZhbHNlLCAiZmluYWxOYW1lLWNsYXNzaWZpZXIiICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE91dHB1dERpcl9TaG91bGRSZXNvbHZlR3JvdXBJZEluT3V0RGlyX1VzZUFydGlmYWN0SW5mbygpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nQXJ0aWZhY3RQcm9qZWN0KCAiJHthcnRpZmFjdC5ncm91cElkfSIsIG51bGwsICJncm91cCIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJncm91cC8iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE91dHB1dERpcl9TaG91bGRSZXNvbHZlQXJ0aWZhY3RJZEluT3V0RGlyX1VzZUFydGlmYWN0SW5mbygpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nQXJ0aWZhY3RQcm9qZWN0KCAiJHthcnRpZmFjdC5hcnRpZmFjdElkfSIsIG51bGwsIG51bGwsICJhcnRpZmFjdCIsIG51bGwsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3QvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVzb2x2ZVZlcnNpb25Jbk91dERpcl9Vc2VBcnRpZmFjdEluZm8oKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXJVc2luZ0FydGlmYWN0UHJvamVjdCggIiR7YXJ0aWZhY3QudmVyc2lvbn0iLCBudWxsLCBudWxsLCBudWxsLCAidmVyc2lvbiIsIG51bGwsIG51bGwsICJ2ZXJzaW9uLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVCdWlsZEZpbmFsTmFtZUluT3V0RGlyX1VzZUFydGlmYWN0SW5mbygpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nQXJ0aWZhY3RQcm9qZWN0KCAiJHthcnRpZmFjdC5idWlsZC5maW5hbE5hbWV9IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgImZpbmFsTmFtZSIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmluYWxOYW1lLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVHcm91cElkSW5PdXREaXJfVXNlTW9kdWxlSW5mbygpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nTW9kdWxlUHJvamVjdCggIiR7bW9kdWxlLmdyb3VwSWR9IiwgbnVsbCwgImdyb3VwIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgImdyb3VwLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVBcnRpZmFjdElkSW5PdXREaXJfVXNlTW9kdWxlSW5mbygpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nTW9kdWxlUHJvamVjdCggIiR7bW9kdWxlLmFydGlmYWN0SWR9IiwgbnVsbCwgbnVsbCwgImFydGlmYWN0IiwgbnVsbCwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3QvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVzb2x2ZVZlcnNpb25Jbk91dERpcl9Vc2VNb2R1bGVJbmZvKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyVXNpbmdNb2R1bGVQcm9qZWN0KCAiJHttb2R1bGUudmVyc2lvbn0iLCBudWxsLCBudWxsLCBudWxsLCAidmVyc2lvbiIsIG51bGwsIG51bGwsICJ2ZXJzaW9uLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVCdWlsZEZpbmFsTmFtZUluT3V0RGlyX1VzZU1vZHVsZUluZm8oKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXJVc2luZ01vZHVsZVByb2plY3QoICIke21vZHVsZS5idWlsZC5maW5hbE5hbWV9IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgImZpbmFsTmFtZSIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbmFsTmFtZS8iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE91dHB1dERpcl9TaG91bGRSZXNvbHZlR3JvdXBJZEluT3V0RGlyX1VzZUV4cGxpY2l0TWFpblByb2plY3QoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXJVc2luZ01haW5Qcm9qZWN0KCAiJHtwb20uZ3JvdXBJZH0iLCBudWxsLCAiZ3JvdXAiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiZ3JvdXAvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVzb2x2ZUFydGlmYWN0SWRJbk91dERpcl9Vc2VFeHBsaWNpdE1haW5Qcm9qZWN0KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyVXNpbmdNYWluUHJvamVjdCggIiR7cG9tLmFydGlmYWN0SWR9IiwgbnVsbCwgbnVsbCwgImFydGlmYWN0IiwgbnVsbCwgbnVsbCwgbnVsbCwgImFydGlmYWN0LyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVWZXJzaW9uSW5PdXREaXJfVXNlRXhwbGljaXRNYWluUHJvamVjdCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nTWFpblByb2plY3QoICIke3BvbS52ZXJzaW9ufSIsIG51bGwsIG51bGwsIG51bGwsICJ2ZXJzaW9uIiwgbnVsbCwgbnVsbCwgInZlcnNpb24vIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVzb2x2ZUJ1aWxkRmluYWxOYW1lSW5PdXREaXJfVXNlRXhwbGljaXRNYWluUHJvamVjdCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nTWFpblByb2plY3QoICIke3BvbS5idWlsZC5maW5hbE5hbWV9IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgImZpbmFsTmFtZSIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaW5hbE5hbWUvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVzb2x2ZUdyb3VwSWRJbk91dERpcl9Vc2VFeHBsaWNpdE1haW5Qcm9qZWN0X3Byb2plY3RSZWYoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXJVc2luZ01haW5Qcm9qZWN0KCAiJHtwcm9qZWN0Lmdyb3VwSWR9IiwgbnVsbCwgImdyb3VwIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgImdyb3VwLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVBcnRpZmFjdElkSW5PdXREaXJfVXNlRXhwbGljaXRNYWluUHJvamVjdF9wcm9qZWN0UmVmKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyVXNpbmdNYWluUHJvamVjdCggIiR7cHJvamVjdC5hcnRpZmFjdElkfSIsIG51bGwsIG51bGwsICJhcnRpZmFjdCIsIG51bGwsIG51bGwsIG51bGwsICJhcnRpZmFjdC8iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE91dHB1dERpcl9TaG91bGRSZXNvbHZlVmVyc2lvbkluT3V0RGlyX1VzZUV4cGxpY2l0TWFpblByb2plY3RfcHJvamVjdFJlZigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nTWFpblByb2plY3QoICIke3Byb2plY3QudmVyc2lvbn0iLCBudWxsLCBudWxsLCBudWxsLCAidmVyc2lvbiIsIG51bGwsIG51bGwsICJ2ZXJzaW9uLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVCdWlsZEZpbmFsTmFtZUluT3V0RGlyX1VzZUV4cGxpY2l0TWFpblByb2plY3RfcHJvamVjdFJlZigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpciggIiR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9IiwgbnVsbCwgImZpbmFsTmFtZSIsICJmaW5hbE5hbWUvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkTm90QWx0ZXJPdXREaXJXaGVuSW5jbHVkZUJhc2VGYWxzZUFuZE5vRXhwcmVzc2lvbnMoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXIoICJkaXIvIiwgImZpbmFsTmFtZSIsIG51bGwsICJkaXIvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkTm90QWx0ZXJPdXREaXJXaGVuSW5jbHVkZUJhc2VGYWxzZUFuZE5vRXhwcmVzc2lvbnNfQ2hlY2tXaXRoQmFja3NsYXNoKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyKCAiZGlyXFwiLCAiZmluYWxOYW1lIiwgbnVsbCwgImRpclxcIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkQXBwZW5kU2xhc2hUb091dERpcldoZW5NaXNzaW5nQW5kSW5jbHVkZUJhc2VGYWxzZUFuZE5vRXhwcmVzc2lvbnMoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXIoICJkaXIiLCAiZmluYWxOYW1lIiwgbnVsbCwgImRpci8iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE91dHB1dERpcl9TaG91bGRSZXNvbHZlR3JvdXBJZEluT3V0RGlyKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyVXNpbmdNYWluUHJvamVjdCggIiR7Z3JvdXBJZH0iLCAiZmluYWxOYW1lIiwgImdyb3VwIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgImdyb3VwLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVBcnRpZmFjdElkSW5PdXREaXIoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXJVc2luZ01haW5Qcm9qZWN0KCAiJHthcnRpZmFjdElkfSIsICJmaW5hbE5hbWUiLCBudWxsLCAiYXJ0aWZhY3QiLCBudWxsLCBudWxsLCBudWxsLCAiYXJ0aWZhY3QvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVzb2x2ZVZlcnNpb25Jbk91dERpcigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nTWFpblByb2plY3QoICIke3ZlcnNpb259IiwgImZpbmFsTmFtZSIsIG51bGwsIG51bGwsICJ2ZXJzaW9uIiwgbnVsbCwgbnVsbCwgInZlcnNpb24vIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVzb2x2ZVZlcnNpb25Jbkxhcmdlck91dERpckV4cHIoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXJVc2luZ01haW5Qcm9qZWN0KCAibXktc3BlY2lhbC0ke3ZlcnNpb259IiwgImZpbmFsTmFtZSIsIG51bGwsIG51bGwsICI5OSIsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteS1zcGVjaWFsLTk5LyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVGaW5hbE5hbWVJbk91dERpcigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpciggIiR7ZmluYWxOYW1lfSIsICJmaW5hbE5hbWUiLCBudWxsLCAiZmluYWxOYW1lLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVCdWlsZEZpbmFsTmFtZUluT3V0RGlyKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyKCAiJHtidWlsZC5maW5hbE5hbWV9IiwgImZpbmFsTmFtZSIsIG51bGwsICJmaW5hbE5hbWUvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmV0dXJuRW1wdHlQYXRoV2hlbkFsbElucHV0SXNFbXB0eUFuZEluY2x1ZGVCYXNlRmFsc2UoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXIoIG51bGwsIG51bGwsIG51bGwsICIiICk7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVtb3ZlUmVsYXRpdmVSZWZUb0N1cnJlbnREaXIoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXIoICIuL3BhdGgvIiwgbnVsbCwgbnVsbCwgInBhdGgvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVtb3ZlRW1iZWRkZWRTYW1lRGlyUmVmKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyKCAic29tZS8uL3BhdGgvIiwgbnVsbCwgbnVsbCwgInNvbWUvcGF0aC8iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE91dHB1dERpcl9TaG91bGRSZW1vdmVFbWJlZGRlZFBhcmVudERpclJlZigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeU91dHB1dERpciggInNvbWUvLi4vcGF0aC8iLCBudWxsLCBudWxsLCAicGF0aC8iICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldE91dHB1dERpcl9TaG91bGRUcnVuY2F0ZVJlbGF0aXZlUmVmVG9QYXJlbnREaXIoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlPdXRwdXREaXIoICIuLi9wYXRoLyIsIG51bGwsIG51bGwsICJwYXRoLyIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T3V0cHV0RGlyX1Nob3VsZFJlc29sdmVQcm9qZWN0UHJvcGVydHkoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoICJteVByb3BlcnR5IiwgInZhbHVlIiApOwotCi0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nTWFpblByb2plY3QoICJmaWxlLiR7bXlQcm9wZXJ0eX0iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBwcm9wcywgImZpbGUudmFsdWUvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPdXRwdXREaXJfU2hvdWxkUmVzb2x2ZVByb2plY3RQcm9wZXJ0eUFsdEV4cHIoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKLSAgICAgICAgcHJvcHMuc2V0UHJvcGVydHkoICJteVByb3BlcnR5IiwgInZhbHVlIiApOwotCi0gICAgICAgIHZlcmlmeU91dHB1dERpclVzaW5nTWFpblByb2plY3QoICJmaWxlLiR7cG9tLnByb3BlcnRpZXMubXlQcm9wZXJ0eX0iLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBwcm9wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZpbGUudmFsdWUvIiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVBcnRpZmFjdElkQW5kQmFzZVZlcnNpb25Jbk91dERpcl9Vc2VBcnRpZmFjdEluZm9fV2l0aFZhbGlkTWFpblByb2plY3QoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbWFpblByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAiZ3JvdXAiLCAibWFpbiIsICIxIiwgbnVsbCApOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBhcnRpZmFjdFZlcnNpb24gPSAiMi0yMDA3MDgwNy4xMTIyMzMtMSI7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBhcnRpZmFjdEJhc2VWZXJzaW9uID0gIjItU05BUFNIT1QiOwotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgYXJ0aWZhY3RQcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggImdyb3VwIiwgImFydGlmYWN0IiwgYXJ0aWZhY3RWZXJzaW9uLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhcnRpZmFjdE1vY2sgPQotICAgICAgICAgICAgbmV3IEFydGlmYWN0TW9jayggbW9ja01hbmFnZXIsICJncm91cCIsICJhcnRpZmFjdCIsIGFydGlmYWN0VmVyc2lvbiwgImphciIsIHRydWUsIGFydGlmYWN0QmFzZVZlcnNpb24gKTsKLQotICAgICAgICBhcnRpZmFjdFByb2plY3Quc2V0QXJ0aWZhY3QoIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5TZXNzaW9uIHNlc3Npb24gPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKE1hdmVuU2Vzc2lvbi5jbGFzcyk7Ci0gICAgICAgIGV4cGVjdCggc2Vzc2lvbi5nZXRFeGVjdXRpb25Qcm9wZXJ0aWVzKCkpLmFuZFJldHVybiggbnVsbCApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBzZXNzaW9uLmdldFVzZXJQcm9wZXJ0aWVzKCkpLmFuZFJldHVybiggbmV3IFByb3BlcnRpZXMoICApICkuYW55VGltZXMoKTsKLQotCi0gICAgICAgIGZpbmFsIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UgY3MgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlLmNsYXNzICk7Ci0gICAgICAgIGV4cGVjdCggY3MuZ2V0TWF2ZW5TZXNzaW9uKCkpLmFuZFJldHVybiggc2Vzc2lvbiApLmFueVRpbWVzKCk7Ci0gICAgICAgIERlZmF1bHRBc3NlbWJseUFyY2hpdmVyVGVzdC5zZXR1cEludGVycG9sYXRvcnMoIGNzKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0KLSAgICAgICAgICAgIGV2YWx1YXRlRmlsZU5hbWVNYXBwaW5nKCAiJHthcnRpZmFjdC5hcnRpZmFjdElkfS0ke2FydGlmYWN0LmJhc2VWZXJzaW9ufSIsIGFydGlmYWN0TW9jay5nZXRBcnRpZmFjdCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5Qcm9qZWN0LCBudWxsLCBjcywgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciggbnVsbCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0UHJvamVjdEludGVycG9sYXRvciggYXJ0aWZhY3RQcm9qZWN0ICkgKTsKLQotLyoKLSAgICAgICAgZmluYWwgQXJ0aWZhY3QgYXJ0aWZhY3QgPSBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKTsKLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9Ci0gICAgICAgICAgICBBc3NlbWJseUZvcm1hdFV0aWxzLmV2YWx1YXRlRmlsZU5hbWVNYXBwaW5nKCAiJHthcnRpZmFjdC5hcnRpZmFjdElkfS0ke2FydGlmYWN0LmJhc2VWZXJzaW9ufSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVBcnRpZmFjdEludGVycG9sYXRvciggbnVsbCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUHJvamVjdEludGVycG9sYXRvciggbnVsbCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RJbnRlcnBvbGF0b3IoIGFydGlmYWN0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3IoIGFydGlmYWN0UHJvamVjdCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFpbkFydGlmYWN0UHJvcHNPbmx5KCBtYWluUHJvamVjdCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmllclJ1bGVzKCBhcnRpZmFjdCApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRml4ZWRTdHJpbmdTZWFyY2hJbnRlcnBvbGF0b3IuZW1wdHkoKSApOwotCi0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRFcXVhbHMoICJhcnRpZmFjdC0yLVNOQVBTSE9UIiwgcmVzdWx0ICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0KLSAgICAgICAgLy8gY2xlYXIgb3V0IGZvciBuZXh0IGNhbGwuCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlc2V0QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkUmVzb2x2ZUdyb3VwSWRJbk91dERpcl9Vc2VBcnRpZmFjdEluZm8oKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdBcnRpZmFjdFByb2plY3QoICIke2FydGlmYWN0Lmdyb3VwSWR9IiwgbnVsbCwgImdyb3VwIiwgbnVsbCwgbnVsbCwgbnVsbCwgImdyb3VwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkUmVzb2x2ZUFydGlmYWN0SWRJbk91dERpcl9Vc2VBcnRpZmFjdEluZm8oKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdBcnRpZmFjdFByb2plY3QoICIke2FydGlmYWN0LmFydGlmYWN0SWR9IiwgbnVsbCwgbnVsbCwgImFydGlmYWN0IiwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3QiLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkUmVzb2x2ZVZlcnNpb25Jbk91dERpcl9Vc2VBcnRpZmFjdEluZm8oKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdBcnRpZmFjdFByb2plY3QoICIke2FydGlmYWN0LnZlcnNpb259IiwgbnVsbCwgbnVsbCwgbnVsbCwgInZlcnNpb24iLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2ZXJzaW9uIiwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVHcm91cElkSW5PdXREaXJfVXNlQXJ0aWZhY3RJbmZvQW5kTW9kdWxlUHJlZml4KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZ1VzaW5nTW9kdWxlUHJvamVjdCggIiR7bW9kdWxlLmdyb3VwSWR9IiwgbnVsbCwgImdyb3VwIiwgbnVsbCwgbnVsbCwgbnVsbCwgImdyb3VwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVBcnRpZmFjdElkSW5PdXREaXJfVXNlQXJ0aWZhY3RJbmZvQW5kTW9kdWxlUHJlZml4KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZ1VzaW5nTW9kdWxlUHJvamVjdCggIiR7bW9kdWxlLmFydGlmYWN0SWR9IiwgbnVsbCwgbnVsbCwgImFydGlmYWN0IiwgbnVsbCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0IiwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVWZXJzaW9uSW5PdXREaXJfVXNlQXJ0aWZhY3RJbmZvQW5kTW9kdWxlUHJlZml4KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZ1VzaW5nTW9kdWxlUHJvamVjdCggIiR7bW9kdWxlLnZlcnNpb259IiwgbnVsbCwgbnVsbCwgbnVsbCwgInZlcnNpb24iLCBudWxsLCAidmVyc2lvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZhbEZpbGVOYW1lTWFwcGluZ19TaG91bGRSZXNvbHZlR3JvdXBJZEluT3V0RGlyX1VzZUV4cGxpY2l0TWFpblByb2plY3QoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdNYWluUHJvamVjdCggIiR7cG9tLmdyb3VwSWR9IiwgbnVsbCwgImdyb3VwIiwgbnVsbCwgbnVsbCwgbnVsbCwgImdyb3VwIiwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVBcnRpZmFjdElkSW5PdXREaXJfVXNlRXhwbGljaXRNYWluUHJvamVjdCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeUV2YWxGaWxlTmFtZU1hcHBpbmdVc2luZ01haW5Qcm9qZWN0KCAiJHtwb20uYXJ0aWZhY3RJZH0iLCBudWxsLCBudWxsLCAiYXJ0aWZhY3QiLCBudWxsLCBudWxsLCAiYXJ0aWZhY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVWZXJzaW9uSW5PdXREaXJfVXNlRXhwbGljaXRNYWluUHJvamVjdCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeUV2YWxGaWxlTmFtZU1hcHBpbmdVc2luZ01haW5Qcm9qZWN0KCAiJHtwb20udmVyc2lvbn0iLCBudWxsLCBudWxsLCBudWxsLCAidmVyc2lvbiIsIG51bGwsICJ2ZXJzaW9uIiwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVHcm91cElkSW5PdXREaXJfVXNlRXhwbGljaXRNYWluUHJvamVjdF9wcm9qZWN0UmVmKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZ1VzaW5nTWFpblByb2plY3QoICIke3Byb2plY3QuZ3JvdXBJZH0iLCBudWxsLCAiZ3JvdXAiLCBudWxsLCBudWxsLCBudWxsLCAiZ3JvdXAiLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkUmVzb2x2ZUFydGlmYWN0SWRJbk91dERpcl9Vc2VFeHBsaWNpdE1haW5Qcm9qZWN0X3Byb2plY3RSZWYoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdNYWluUHJvamVjdCggIiR7cHJvamVjdC5hcnRpZmFjdElkfSIsIG51bGwsIG51bGwsICJhcnRpZmFjdCIsIG51bGwsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3QiLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkUmVzb2x2ZVZlcnNpb25Jbk91dERpcl9Vc2VFeHBsaWNpdE1haW5Qcm9qZWN0X3Byb2plY3RSZWYoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdNYWluUHJvamVjdCggIiR7cHJvamVjdC52ZXJzaW9ufSIsIG51bGwsIG51bGwsIG51bGwsICJ2ZXJzaW9uIiwgbnVsbCwgInZlcnNpb24iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlbW92ZVJlbGF0aXZlUmVmVG9DdXJyZW50RGlyKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZ1VzaW5nTWFpblByb2plY3QoICIuL3BhdGgvIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgInBhdGgvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZhbEZpbGVOYW1lTWFwcGluZ19TaG91bGRSZW1vdmVFbWJlZGRlZFNhbWVEaXJSZWYoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdNYWluUHJvamVjdCggInNvbWUvLi9wYXRoLyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJzb21lL3BhdGgvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZhbEZpbGVOYW1lTWFwcGluZ19TaG91bGRSZW1vdmVFbWJlZGRlZFBhcmVudERpclJlZigpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeUV2YWxGaWxlTmFtZU1hcHBpbmdVc2luZ01haW5Qcm9qZWN0KCAic29tZS8uLi9wYXRoLyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJwYXRoLyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkVHJ1bmNhdGVSZWxhdGl2ZVJlZlRvUGFyZW50RGlyKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZ1VzaW5nTWFpblByb2plY3QoICIuLi9wYXRoLyIsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsICJwYXRoLyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkUGFzc0V4cHJlc3Npb25UaHJvdWdoVW5jaGFuZ2VkKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZyggImZpbGVuYW1lIiwgbnVsbCwgbnVsbCwgImZpbGVuYW1lIiwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZEluc2VydENsYXNzaWZpZXJBaGVhZE9mRXh0ZW5zaW9uKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZyggImZpbGVuYW1lLSR7YXJ0aWZhY3QuY2xhc3NpZmllcn0uZXh0IiwgImNsYXNzaWZpZXIiLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmlsZW5hbWUtY2xhc3NpZmllci5leHQiLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkQXBwZW5kRGFzaENsYXNzaWZpZXJXaGVuQ2xhc3NpZmllclByZXNlbnQoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nKCAiZmlsZW5hbWUke2Rhc2hDbGFzc2lmaWVyP30iLCAiY2xhc3NpZmllciIsIG51bGwsICJmaWxlbmFtZS1jbGFzc2lmaWVyIiwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZE5vdEFwcGVuZERhc2hDbGFzc2lmaWVyV2hlbkNsYXNzaWZpZXJNaXNzaW5nKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZyggImZpbGVuYW1lJHtkYXNoQ2xhc3NpZmllcj99IiwgbnVsbCwgbnVsbCwgImZpbGVuYW1lIiwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZE5vdEFwcGVuZERhc2hDbGFzc2lmaWVyV2hlbkNsYXNzaWZpZXJFbXB0eSgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeUV2YWxGaWxlTmFtZU1hcHBpbmcoICJmaWxlbmFtZSR7ZGFzaENsYXNzaWZpZXI/fSIsICIiLCBudWxsLCAiZmlsZW5hbWUiLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkUmVzb2x2ZUdyb3VwSWQoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdNYWluUHJvamVjdCggIiR7Z3JvdXBJZH0iLCBudWxsLCAiZ3JvdXAiLCBudWxsLCBudWxsLCBudWxsLCAiZ3JvdXAiLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEV2YWxGaWxlTmFtZU1hcHBpbmdfU2hvdWxkUmVzb2x2ZUFydGlmYWN0SWQoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdNYWluUHJvamVjdCggIiR7YXJ0aWZhY3RJZH0iLCBudWxsLCBudWxsLCAiYXJ0aWZhY3QiLCBudWxsLCBudWxsLCAiYXJ0aWZhY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVWZXJzaW9uKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZ1VzaW5nTWFpblByb2plY3QoICIke3ZlcnNpb259IiwgbnVsbCwgbnVsbCwgbnVsbCwgInZlcnNpb24iLCBudWxsLCAidmVyc2lvbiIsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZhbEZpbGVOYW1lTWFwcGluZ19TaG91bGRSZXNvbHZlRXh0ZW5zaW9uKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZyggImZpbGUuJHthcnRpZmFjdC5leHRlbnNpb259IiwgbnVsbCwgImV4dCIsICJmaWxlLmV4dCIsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZhbEZpbGVOYW1lTWFwcGluZ19TaG91bGRSZXNvbHZlUHJvamVjdFByb3BlcnR5KCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnNldFByb3BlcnR5KCAibXlQcm9wZXJ0eSIsICJ2YWx1ZSIgKTsKLQotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nKCAiZmlsZS4ke215UHJvcGVydHl9IiwgbnVsbCwgbnVsbCwgImZpbGUudmFsdWUiLCBwcm9wcyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVQcm9qZWN0UHJvcGVydHlBbHRFeHByKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7Ci0gICAgICAgIHByb3BzLnNldFByb3BlcnR5KCAibXlQcm9wZXJ0eSIsICJ2YWx1ZSIgKTsKLQotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nKCAiZmlsZS4ke3BvbS5wcm9wZXJ0aWVzLm15UHJvcGVydHl9IiwgbnVsbCwgbnVsbCwgImZpbGUudmFsdWUiLCBwcm9wcyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFdmFsRmlsZU5hbWVNYXBwaW5nX1Nob3VsZFJlc29sdmVTeXN0ZW1Qcm9wZXJ0eVdpdGhvdXRNYWluUHJvamVjdFByZXNlbnQoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nKCAiZmlsZS4ke2phdmEudmVyc2lvbn0iLCBudWxsLCBudWxsLCAiZmlsZS4iICsgU3lzdGVtLmdldFByb3BlcnR5KCAiamF2YS52ZXJzaW9uIiApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV2YWxGaWxlTmFtZU1hcHBpbmcoIGZpbmFsIFN0cmluZyBleHByZXNzaW9uLCBmaW5hbCBTdHJpbmcgY2xhc3NpZmllciwgZmluYWwgU3RyaW5nIGV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrVmFsdWUsIGZpbmFsIFByb3BlcnRpZXMgcHJvamVjdFByb3BlcnRpZXMgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdNYWluUHJvamVjdCggZXhwcmVzc2lvbiwgY2xhc3NpZmllciwgbnVsbCwgbnVsbCwgbnVsbCwgZXh0ZW5zaW9uLCBjaGVja1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdFByb3BlcnRpZXMgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZ1VzaW5nTWFpblByb2plY3QoIGZpbmFsIFN0cmluZyBleHByZXNzaW9uLCBmaW5hbCBTdHJpbmcgY2xhc3NpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBncm91cElkLCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJzaW9uLCBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrVmFsdWUsIGZpbmFsIFByb3BlcnRpZXMgcHJvamVjdFByb3BlcnRpZXMgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbWFpblByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uLCBwcm9qZWN0UHJvcGVydGllcyApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBhcnRpZmFjdFByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAidW5rbm93biIsICJ1bmtub3duIiwgInVua25vd24iLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBtb2R1bGVQcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggInVua25vd24iLCAidW5rbm93biIsICJ1bmtub3duIiwgbnVsbCApOwotCi0gICAgICAgIHZlcmlmeUV2YWxGaWxlTmFtZU1hcHBpbmcoIGV4cHJlc3Npb24sIGNsYXNzaWZpZXIsIGV4dGVuc2lvbiwgbWFpblByb2plY3QsIG1vZHVsZVByb2plY3QsIGFydGlmYWN0UHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWYWx1ZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlFdmFsRmlsZU5hbWVNYXBwaW5nVXNpbmdBcnRpZmFjdFByb2plY3QoIGZpbmFsIFN0cmluZyBleHByZXNzaW9uLCBmaW5hbCBTdHJpbmcgY2xhc3NpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ3JvdXBJZCwgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZlcnNpb24sIGZpbmFsIFN0cmluZyBleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9qZWN0UHJvcGVydGllcyApCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBhcnRpZmFjdFByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uLCBwcm9qZWN0UHJvcGVydGllcyApOwotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBtYWluUHJvamVjdCA9IGNyZWF0ZVByb2plY3QoICJ1bmtub3duIiwgInVua25vd24iLCAidW5rbm93biIsIG51bGwgKTsKLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZVByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAidW5rbm93biIsICJ1bmtub3duIiwgInVua25vd24iLCBudWxsICk7Ci0KLSAgICAgICAgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZyggZXhwcmVzc2lvbiwgY2xhc3NpZmllciwgZXh0ZW5zaW9uLCBtYWluUHJvamVjdCwgbW9kdWxlUHJvamVjdCwgYXJ0aWZhY3RQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja1ZhbHVlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV2YWxGaWxlTmFtZU1hcHBpbmdVc2luZ01vZHVsZVByb2plY3QoIGZpbmFsIFN0cmluZyBleHByZXNzaW9uLCBmaW5hbCBTdHJpbmcgY2xhc3NpZmllciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgZmluYWwgU3RyaW5nIGV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvamVjdFByb3BlcnRpZXMgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlUHJvamVjdCA9IGNyZWF0ZVByb2plY3QoIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHByb2plY3RQcm9wZXJ0aWVzICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1haW5Qcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggInVua25vd24iLCAidW5rbm93biIsICJ1bmtub3duIiwgbnVsbCApOwotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgYXJ0aWZhY3RQcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggInVua25vd24iLCAidW5rbm93biIsICJ1bmtub3duIiwgbnVsbCApOwotCi0gICAgICAgIHZlcmlmeUV2YWxGaWxlTmFtZU1hcHBpbmcoIGV4cHJlc3Npb24sIGNsYXNzaWZpZXIsIGV4dGVuc2lvbiwgbWFpblByb2plY3QsIG1vZHVsZVByb2plY3QsIGFydGlmYWN0UHJvamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tWYWx1ZSApOwotICAgIH0KLQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IGNyZWF0ZVByb2plY3QoIFN0cmluZyBncm91cElkLCBTdHJpbmcgYXJ0aWZhY3RJZCwgU3RyaW5nIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9qZWN0UHJvcGVydGllcyApCi0gICAgewotICAgICAgICBpZiAoIGFydGlmYWN0SWQgPT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFydGlmYWN0SWQgPSAiYXJ0aWZhY3QiOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCBncm91cElkID09IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBncm91cElkID0gImdyb3VwIjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICggdmVyc2lvbiA9PSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgdmVyc2lvbiA9ICJ2ZXJzaW9uIjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEdyb3VwSWQoIGdyb3VwSWQgKTsKLSAgICAgICAgbW9kZWwuc2V0QXJ0aWZhY3RJZCggYXJ0aWZhY3RJZCApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0KLSAgICAgICAgbW9kZWwuc2V0UHJvcGVydGllcyggcHJvamVjdFByb3BlcnRpZXMgKTsKLQotICAgICAgICByZXR1cm4gbmV3IE1hdmVuUHJvamVjdCggbW9kZWwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RXZhbEZpbGVOYW1lTWFwcGluZyggZmluYWwgU3RyaW5nIGV4cHJlc3Npb24sIGZpbmFsIFN0cmluZyBjbGFzc2lmaWVyLCBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbWFpblByb2plY3QsIGZpbmFsIE1hdmVuUHJvamVjdCBtb2R1bGVQcm9qZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgYXJ0aWZhY3RQcm9qZWN0LCBmaW5hbCBTdHJpbmcgY2hlY2tWYWx1ZSApCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIEFydGlmYWN0TW9jayBhcnRpZmFjdE1vY2sgPQotICAgICAgICAgICAgbmV3IEFydGlmYWN0TW9jayggbW9ja01hbmFnZXIsIGFydGlmYWN0UHJvamVjdC5nZXRHcm91cElkKCksIGFydGlmYWN0UHJvamVjdC5nZXRBcnRpZmFjdElkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdFByb2plY3QuZ2V0VmVyc2lvbigpLCBleHRlbnNpb24sIGNsYXNzaWZpZXIsIGZhbHNlLCBudWxsICk7Ci0KLSAgICAgICAgZmluYWwgQXJ0aWZhY3RNb2NrIG1vZHVsZUFydGlmYWN0TW9jayA9Ci0gICAgICAgICAgICBuZXcgQXJ0aWZhY3RNb2NrKCBtb2NrTWFuYWdlciwgbW9kdWxlUHJvamVjdC5nZXRHcm91cElkKCksIG1vZHVsZVByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlUHJvamVjdC5nZXRWZXJzaW9uKCksICJqYXIiLCBmYWxzZSwgbnVsbCApOwotCi0KLSAgICAgICAgZmluYWwgTWF2ZW5TZXNzaW9uIHNlc3Npb24gPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrKCBNYXZlblNlc3Npb24uY2xhc3MgKTsKLSAgICAgICAgZXhwZWN0KCBzZXNzaW9uLmdldEV4ZWN1dGlvblByb3BlcnRpZXMoKSkuYW5kUmV0dXJuKCBTeXN0ZW0uZ2V0UHJvcGVydGllcygpICkuYW55VGltZXMoKTsKLQotICAgICAgICBleHBlY3Qoc2Vzc2lvbi5nZXRVc2VyUHJvcGVydGllcygpKS5hbmRSZXR1cm4oIG5ldyBQcm9wZXJ0aWVzKCAgKSApLmFueVRpbWVzKCk7Ci0KLQotICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNzID0gbW9ja01hbmFnZXIuY3JlYXRlTW9jayggQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZS5jbGFzcyApOwotICAgICAgICBleHBlY3QoIGNzLmdldE1hdmVuU2Vzc2lvbigpKS5hbmRSZXR1cm4oIHNlc3Npb24gKS5hbnlUaW1lcygpOwotICAgICAgICBEZWZhdWx0QXNzZW1ibHlBcmNoaXZlclRlc3Quc2V0dXBJbnRlcnBvbGF0b3JzKCBjcywgbWFpblByb2plY3QpOwotCi0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9Ci0gICAgICAgICAgICBBc3NlbWJseUZvcm1hdFV0aWxzLmV2YWx1YXRlRmlsZU5hbWVNYXBwaW5nKCBleHByZXNzaW9uLCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSwgbWFpblByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVBcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSwgY3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9qZWN0SW50ZXJwb2xhdG9yKCBtb2R1bGVQcm9qZWN0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdFByb2plY3RJbnRlcnBvbGF0b3IoIGFydGlmYWN0UHJvamVjdCApICk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0KLSAgICAgICAgICAgIEFzc2VtYmx5Rm9ybWF0VXRpbHMuZXZhbHVhdGVGaWxlTmFtZU1hcHBpbmcoIGV4cHJlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVBcnRpZmFjdEludGVycG9sYXRvciggbW9kdWxlQXJ0aWZhY3RNb2NrLmdldEFydGlmYWN0KCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZVByb2plY3RJbnRlcnBvbGF0b3IoIG1vZHVsZVByb2plY3QgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFydGlmYWN0SW50ZXJwb2xhdG9yKCBhcnRpZmFjdE1vY2suZ2V0QXJ0aWZhY3QoKSApLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yKCBhcnRpZmFjdFByb2plY3QgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5BcnRpZmFjdFByb3BzT25seSggbWFpblByb2plY3QgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpZXJSdWxlcyggYXJ0aWZhY3RNb2NrLmdldEFydGlmYWN0KCkgKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkU3RyaW5nU2VhcmNoSW50ZXJwb2xhdG9yLmNyZWF0ZSggbmV3IFByb3BlcnRpZXNCYXNlZFZhbHVlU291cmNlKCBTeXN0ZW0uZ2V0UHJvcGVydGllcygpICApKSApOwotCi0gICAgICAgICAqLwotICAgICAgICBhc3NlcnRFcXVhbHMoIGNoZWNrVmFsdWUsIHJlc3VsdCApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotCi0gICAgICAgIC8vIGNsZWFyIG91dCBmb3IgbmV4dCBjYWxsLgotICAgICAgICBtb2NrTWFuYWdlci5yZXNldEFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlPdXRwdXREaXIoIGZpbmFsIFN0cmluZyBvdXREaXIsIGZpbmFsIFN0cmluZyBmaW5hbE5hbWUsIGZpbmFsIFN0cmluZyBwcm9qZWN0RmluYWxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGVja1ZhbHVlICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyVXNpbmdNYWluUHJvamVjdCggb3V0RGlyLCBmaW5hbE5hbWUsIG51bGwsIG51bGwsIG51bGwsIHByb2plY3RGaW5hbE5hbWUsIG51bGwsIGNoZWNrVmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T3V0cHV0RGlyVXNpbmdNYWluUHJvamVjdCggZmluYWwgU3RyaW5nIG91dERpciwgZmluYWwgU3RyaW5nIGZpbmFsTmFtZSwgZmluYWwgU3RyaW5nIGdyb3VwSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLCBmaW5hbCBTdHJpbmcgdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb2plY3RGaW5hbE5hbWUsIGZpbmFsIFByb3BlcnRpZXMgcHJvcGVydGllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrVmFsdWUgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByb2plY3QoIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHByb3BlcnRpZXMgKTsKLQotICAgICAgICBpZiAoIHByb2plY3RGaW5hbE5hbWUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEJ1aWxkIGJ1aWxkID0gbmV3IEJ1aWxkKCk7Ci0gICAgICAgICAgICBidWlsZC5zZXRGaW5hbE5hbWUoIHByb2plY3RGaW5hbE5hbWUgKTsKLQotICAgICAgICAgICAgcHJvamVjdC5nZXRNb2RlbCgpLnNldEJ1aWxkKCBidWlsZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZVByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAidW5rbm93biIsICJ1bmtub3duIiwgInVua25vd24iLCBudWxsICk7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBhcnRpZmFjdFByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAidW5rbm93biIsICJ1bmtub3duIiwgInVua25vd24iLCBudWxsICk7Ci0KLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyKCBvdXREaXIsIGZpbmFsTmFtZSwgcHJvamVjdCwgbW9kdWxlUHJvamVjdCwgYXJ0aWZhY3RQcm9qZWN0LCBjaGVja1ZhbHVlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU91dHB1dERpclVzaW5nTW9kdWxlUHJvamVjdCggZmluYWwgU3RyaW5nIG91dERpciwgZmluYWwgU3RyaW5nIGZpbmFsTmFtZSwgZmluYWwgU3RyaW5nIGdyb3VwSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsIGZpbmFsIFN0cmluZyB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9qZWN0RmluYWxOYW1lLCBmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrVmFsdWUgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgcHJvamVjdCA9IGNyZWF0ZVByb2plY3QoIGdyb3VwSWQsIGFydGlmYWN0SWQsIHZlcnNpb24sIHByb3BlcnRpZXMgKTsKLQotICAgICAgICBpZiAoIHByb2plY3RGaW5hbE5hbWUgIT0gbnVsbCApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIEJ1aWxkIGJ1aWxkID0gbmV3IEJ1aWxkKCk7Ci0gICAgICAgICAgICBidWlsZC5zZXRGaW5hbE5hbWUoIHByb2plY3RGaW5hbE5hbWUgKTsKLQotICAgICAgICAgICAgcHJvamVjdC5nZXRNb2RlbCgpLnNldEJ1aWxkKCBidWlsZCApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1haW5Qcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggInVua25vd24iLCAidW5rbm93biIsICJ1bmtub3duIiwgbnVsbCApOwotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgYXJ0aWZhY3RQcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggInVua25vd24iLCAidW5rbm93biIsICJ1bmtub3duIiwgbnVsbCApOwotCi0gICAgICAgIHZlcmlmeU91dHB1dERpciggb3V0RGlyLCBmaW5hbE5hbWUsIG1haW5Qcm9qZWN0LCBwcm9qZWN0LCBhcnRpZmFjdFByb2plY3QsIGNoZWNrVmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T3V0cHV0RGlyVXNpbmdBcnRpZmFjdFByb2plY3QoIGZpbmFsIFN0cmluZyBvdXREaXIsIGZpbmFsIFN0cmluZyBmaW5hbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ3JvdXBJZCwgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmVyc2lvbiwgZmluYWwgU3RyaW5nIHByb2plY3RGaW5hbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BlcnRpZXMsIGZpbmFsIFN0cmluZyBjaGVja1ZhbHVlICkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCBncm91cElkLCBhcnRpZmFjdElkLCB2ZXJzaW9uLCBwcm9wZXJ0aWVzICk7Ci0KLSAgICAgICAgaWYgKCBwcm9qZWN0RmluYWxOYW1lICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBmaW5hbCBCdWlsZCBidWlsZCA9IG5ldyBCdWlsZCgpOwotICAgICAgICAgICAgYnVpbGQuc2V0RmluYWxOYW1lKCBwcm9qZWN0RmluYWxOYW1lICk7Ci0KLSAgICAgICAgICAgIHByb2plY3QuZ2V0TW9kZWwoKS5zZXRCdWlsZCggYnVpbGQgKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBtb2R1bGVQcm9qZWN0ID0gY3JlYXRlUHJvamVjdCggInVua25vd24iLCAidW5rbm93biIsICJ1bmtub3duIiwgbnVsbCApOwotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbWFpblByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCAidW5rbm93biIsICJ1bmtub3duIiwgInVua25vd24iLCBudWxsICk7Ci0KLSAgICAgICAgdmVyaWZ5T3V0cHV0RGlyKCBvdXREaXIsIGZpbmFsTmFtZSwgbWFpblByb2plY3QsIG1vZHVsZVByb2plY3QsIHByb2plY3QsIGNoZWNrVmFsdWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5T3V0cHV0RGlyKCBmaW5hbCBTdHJpbmcgb3V0RGlyLCBmaW5hbCBTdHJpbmcgZmluYWxOYW1lLCBmaW5hbCBNYXZlblByb2plY3QgbWFpblByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZVByb2plY3QsIGZpbmFsIE1hdmVuUHJvamVjdCBhcnRpZmFjdFByb2plY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNoZWNrVmFsdWUgKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotCi0gICAgICAgIGZpbmFsIE1hdmVuU2Vzc2lvbiBzZXNzaW9uID0gbW9ja01hbmFnZXIuY3JlYXRlTW9jayggTWF2ZW5TZXNzaW9uLmNsYXNzICk7Ci0gICAgICAgIGV4cGVjdCggc2Vzc2lvbi5nZXRFeGVjdXRpb25Qcm9wZXJ0aWVzKCkpLmFuZFJldHVybiggIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkpLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBzZXNzaW9uLmdldFVzZXJQcm9wZXJ0aWVzKCkpLmFuZFJldHVybiggbmV3IFByb3BlcnRpZXMoICApICkuYW55VGltZXMoKTsKLQotCi0KLSAgICAgICAgZmluYWwgQXNzZW1ibGVyQ29uZmlndXJhdGlvblNvdXJjZSBjcyA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2soIEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MgKTsKLSAgICAgICAgZXhwZWN0KCBjcy5nZXRNYXZlblNlc3Npb24oKSkuYW5kUmV0dXJuKCBzZXNzaW9uICkuYW55VGltZXMoKTsKLSAgICAgICAgRGVmYXVsdEFzc2VtYmx5QXJjaGl2ZXJUZXN0LnNldHVwSW50ZXJwb2xhdG9ycyggY3MsIG1haW5Qcm9qZWN0KTsKLQotICAgICAgICBTdHJpbmcgcmVzdWx0OwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotICAgICAgICByZXN1bHQgPQotICAgICAgICAgICAgQXNzZW1ibHlGb3JtYXRVdGlscy5nZXRPdXRwdXREaXJlY3RvcnkoIG91dERpciwgZmluYWxOYW1lLCBjcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVQcm9qZWN0SW50ZXJwb2xhdG9yKCBtb2R1bGVQcm9qZWN0ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3RQcm9qZWN0SW50ZXJwb2xhdG9yKCBhcnRpZmFjdFByb2plY3QgKSApOwotCi0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjaGVja1ZhbHVlLCByZXN1bHQgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXNldEFsbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlEaXN0cm9OYW1lKCBmaW5hbCBTdHJpbmcgYXNzZW1ibHlJZCwgZmluYWwgU3RyaW5nIGNsYXNzaWZpZXIsIGZpbmFsIFN0cmluZyBmaW5hbE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYXBwZW5kQXNzZW1ibHlJZCwgZmluYWwgU3RyaW5nIGNoZWNrVmFsdWUgKQotICAgIHsKLSAgICAgICAgZmluYWwgTW9ja0FuZENvbnRyb2xGb3JHZXREaXN0cm9OYW1lIG1hYyA9Ci0gICAgICAgICAgICBuZXcgTW9ja0FuZENvbnRyb2xGb3JHZXREaXN0cm9OYW1lKCBmaW5hbE5hbWUsIGFwcGVuZEFzc2VtYmx5SWQsIGNsYXNzaWZpZXIgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBmaW5hbCBBc3NlbWJseSBhc3NlbWJseSA9IG5ldyBBc3NlbWJseSgpOwotICAgICAgICBhc3NlbWJseS5zZXRJZCggYXNzZW1ibHlJZCApOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBBc3NlbWJseUZvcm1hdFV0aWxzLmdldERpc3RyaWJ1dGlvbk5hbWUoIGFzc2VtYmx5LCBtYWMuY29uZmlnU291cmNlICk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjaGVja1ZhbHVlLCByZXN1bHQgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci52ZXJpZnlBbGwoKTsKLQotICAgICAgICAvLyBjbGVhciBpdCBvdXQgZm9yIHRoZSBuZXh0IGNhbGwuCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlc2V0QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFdpbmRvd3NQYXRoKCl7Ci0gICAgICAgIGFzc2VydFRydWUoIEFzc2VtYmx5Rm9ybWF0VXRpbHMuaXNXaW5kb3dzUGF0aCggIkM6XGZvb2JhciIgKSk7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHRlc3RMaW51eFJvb3RSZWZlcmVuY2VQYXRoKCl7Ci0gICAgICAgIGFzc2VydFRydWUoIEFzc2VtYmx5Rm9ybWF0VXRpbHMuaXNMaW51eFJvb3RSZWZlcmVuY2UoICIvZXRjL2hvbWUiICkgKTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTW9ja0FuZENvbnRyb2xGb3JHZXREaXN0cm9OYW1lCi0gICAgewotICAgICAgICBmaW5hbCBBc3NlbWJsZXJDb25maWd1cmF0aW9uU291cmNlIGNvbmZpZ1NvdXJjZTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjbGFzc2lmaWVyOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpc0Fzc2VtYmx5SWRBcHBlbmRlZDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmaW5hbE5hbWU7Ci0KLSAgICAgICAgcHVibGljIE1vY2tBbmRDb250cm9sRm9yR2V0RGlzdHJvTmFtZSggZmluYWwgU3RyaW5nIGZpbmFsTmFtZSwgZmluYWwgYm9vbGVhbiBpc0Fzc2VtYmx5SWRBcHBlbmRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzaWZpZXIgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZpbmFsTmFtZSA9IGZpbmFsTmFtZTsKLSAgICAgICAgICAgIHRoaXMuaXNBc3NlbWJseUlkQXBwZW5kZWQgPSBpc0Fzc2VtYmx5SWRBcHBlbmRlZDsKLSAgICAgICAgICAgIHRoaXMuY2xhc3NpZmllciA9IGNsYXNzaWZpZXI7Ci0KLSAgICAgICAgICAgIGNvbmZpZ1NvdXJjZSA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2sgKEFzc2VtYmxlckNvbmZpZ3VyYXRpb25Tb3VyY2UuY2xhc3MpOwotCi0gICAgICAgICAgICBlbmFibGVFeHBlY3RhdGlvbnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBlbmFibGVFeHBlY3RhdGlvbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBleHBlY3QoY29uZmlnU291cmNlLmdldENsYXNzaWZpZXIoKSkuYW5kUmV0dXJuKCBjbGFzc2lmaWVyICkuYXRMZWFzdE9uY2UoKTsKLQotICAgICAgICAgICAgZXhwZWN0KGNvbmZpZ1NvdXJjZS5pc0Fzc2VtYmx5SWRBcHBlbmRlZCgpKS5hbmRSZXR1cm4oIGlzQXNzZW1ibHlJZEFwcGVuZGVkICkuYXRMZWFzdE9uY2UoKTsKLQotICAgICAgICAgICAgZXhwZWN0KCBjb25maWdTb3VyY2UuZ2V0RmluYWxOYW1lKCkpLmFuZFJldHVybiggZmluYWxOYW1lICkuYXRMZWFzdE9uY2UoKTsKLSAgICAgICAgfQotCi0KLQotICAgIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0ZpbHRlclV0aWxzVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0ZpbHRlclV0aWxzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTM3ZjhjLi4wMDAwMDAwCi0tLSBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9GaWx0ZXJVdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxMyArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QuQXJ0aWZhY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5yZXNvbHZlci5maWx0ZXIuQXJ0aWZhY3RGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5Nb2RlbDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS5JbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMubG9nZ2luZy5Mb2dnZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLmNvbnNvbGUuQ29uc29sZUxvZ2dlcjsKLWltcG9ydCBvcmcuZWFzeW1vY2suY2xhc3NleHRlbnNpb24uRWFzeU1vY2tTdXBwb3J0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1pbXBvcnQgc3RhdGljIG9yZy5lYXN5bW9jay5FYXN5TW9jay5leHBlY3Q7Ci0KLXB1YmxpYyBjbGFzcyBGaWx0ZXJVdGlsc1Rlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwcml2YXRlIGZpbmFsIEVhc3lNb2NrU3VwcG9ydCBtb2NrTWFuYWdlciA9IG5ldyBFYXN5TW9ja1N1cHBvcnQoKTsKLQotICAgIHByaXZhdGUgTG9nZ2VyIGxvZ2dlcjsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkKLSAgICB7Ci0gICAgICAgIGNsZWFyQWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNsZWFyQWxsKCkKLSAgICB7Ci0gICAgICAgIGxvZ2dlciA9IG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJBcnRpZmFjdHNfU2hvdWxkVGhyb3dFeGNlcHRpb25Vc2luZ1N0cmljdE1vZGVXaXRoVW5tYXRjaGVkSW5jbHVkZSgpCi0gICAgewotICAgICAgICBmaW5hbCBBcnRpZmFjdCBhcnRpZmFjdCA9IG1vY2tNYW5hZ2VyLmNyZWF0ZU1vY2soIEFydGlmYWN0LmNsYXNzICk7Ci0KLSAgICAgICAgZXhwZWN0KGFydGlmYWN0LmdldEdyb3VwSWQoKSkuYW5kUmV0dXJuKCAiZ3JvdXAiKS5hdExlYXN0T25jZSgpOwotCi0gICAgICAgIGV4cGVjdCggYXJ0aWZhY3QuZ2V0QXJ0aWZhY3RJZCgpKS5hbmRSZXR1cm4oICJhcnRpZmFjdCIpLmF0TGVhc3RPbmNlKCk7Ci0KLSAgICAgICAgZXhwZWN0KCBhcnRpZmFjdC5nZXRJZCgpKS5hbmRSZXR1cm4oICJncm91cDphcnRpZmFjdDp0eXBlOnZlcnNpb24iKS5hdExlYXN0T25jZSgpOwotCi0gICAgICAgIGV4cGVjdCggYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSkuYW5kUmV0dXJuKCAiZ3JvdXA6YXJ0aWZhY3Q6dHlwZSIpLmF0TGVhc3RPbmNlKCk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGluY2x1ZGVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0KLSAgICAgICAgaW5jbHVkZXMuYWRkKCAib3RoZXIuZ3JvdXA6b3RoZXItYXJ0aWZhY3Q6dHlwZTp2ZXJzaW9uIiApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBleGNsdWRlcyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotCi0gICAgICAgIGZpbmFsIFNldDxBcnRpZmFjdD4gYXJ0aWZhY3RzID0gbmV3IEhhc2hTZXQ8QXJ0aWZhY3Q+KCk7Ci0gICAgICAgIGFydGlmYWN0cy5hZGQoIGFydGlmYWN0ICk7Ci0KLSAgICAgICAgbW9ja01hbmFnZXIucmVwbGF5QWxsKCk7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEZpbHRlclV0aWxzLmZpbHRlckFydGlmYWN0cyggYXJ0aWZhY3RzLCBpbmNsdWRlcywgZXhjbHVkZXMsIHRydWUsIGZhbHNlLCBsb2dnZXIgKTsKLQotICAgICAgICAgICAgZmFpbCggIlNob3VsZCBmYWlsIGJlY2F1c2Ugb2YgdW5tYXRjaGVkIGluY2x1ZGUuIiApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggZmluYWwgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbHRlckFydGlmYWN0c19TaG91bGROb3RSZW1vdmVBcnRpZmFjdERpcmVjdGx5SW5jbHVkZWQoKQotICAgICAgICB0aHJvd3MgSW52YWxpZEFzc2VtYmxlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHZlcmlmeUFydGlmYWN0SW5jbHVzaW9uKCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAiZ3JvdXA6YXJ0aWZhY3QiLCBudWxsLCBudWxsLCBudWxsICk7Ci0gICAgICAgIHZlcmlmeUFydGlmYWN0SW5jbHVzaW9uKCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAiZ3JvdXA6YXJ0aWZhY3Q6amFyIiwgbnVsbCwgbnVsbCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJBcnRpZmFjdHNfU2hvdWxkTm90UmVtb3ZlQXJ0aWZhY3RUcmFuc2l0aXZlbHlJbmNsdWRlZCgpCi0gICAgICAgIHRocm93cyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5QXJ0aWZhY3RJbmNsdXNpb24oICJncm91cCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwOmRlcGVuZGVudEFydGlmYWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJjdXJyZW50OnByb2plY3Q6amFyOjEuMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cDpkZXBlbmRlbnRBcnRpZmFjdDpqYXI6dmVyc2lvbiIpLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbHRlckFydGlmYWN0c19TaG91bGRSZW1vdmVBcnRpZmFjdFRyYW5zaXRpdmVseUV4Y2x1ZGVkKCkKLSAgICAgICAgdGhyb3dzIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlBcnRpZmFjdEV4Y2x1c2lvbiggImdyb3VwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnRpZmFjdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwOmRlcGVuZGVudEFydGlmYWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoImN1cnJlbnQ6cHJvamVjdDpqYXI6MS4wIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwOmRlcGVuZGVudEFydGlmYWN0Omphcjp2ZXJzaW9uIiksIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyQXJ0aWZhY3RzX1Nob3VsZFJlbW92ZUFydGlmYWN0RGlyZWN0bHlFeGNsdWRlZCgpCi0gICAgICAgIHRocm93cyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5QXJ0aWZhY3RFeGNsdXNpb24oICJncm91cCIsICJhcnRpZmFjdCIsIG51bGwsICJncm91cDphcnRpZmFjdCIsIG51bGwsIG51bGwgKTsKLQotICAgICAgICBjbGVhckFsbCgpOwotCi0gICAgICAgIHZlcmlmeUFydGlmYWN0RXhjbHVzaW9uKCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCBudWxsLCAiZ3JvdXA6YXJ0aWZhY3Q6amFyIiwgbnVsbCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJBcnRpZmFjdHNfU2hvdWxkTm90UmVtb3ZlQXJ0aWZhY3ROb3RJbmNsdWRlZEFuZE5vdEV4Y2x1ZGVkKCkKLSAgICAgICAgdGhyb3dzIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlBcnRpZmFjdEluY2x1c2lvbiggImdyb3VwIiwgImFydGlmYWN0IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApOwotICAgICAgICB2ZXJpZnlBcnRpZmFjdEluY2x1c2lvbiggImdyb3VwIiwgImFydGlmYWN0IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJBcnRpZmFjdHNfU2hvdWxkUmVtb3ZlQXJ0aWZhY3RFeGNsdWRlZEJ5QWRkaXRpb25hbEZpbHRlcigpCi0gICAgICAgIHRocm93cyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXJ0aWZhY3RGaWx0ZXIgZmlsdGVyID0gbmV3IEFydGlmYWN0RmlsdGVyKCkKLSAgICAgICAgewotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpbmNsdWRlKCBmaW5hbCBBcnRpZmFjdCBhcnRpZmFjdCApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH07Ci0KLSAgICAgICAgdmVyaWZ5QXJ0aWZhY3RFeGNsdXNpb24oICJncm91cCIsICJhcnRpZmFjdCIsICJmYWlsOmZhaWwiLCBudWxsLCBudWxsLCBmaWx0ZXIgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyUHJvamVjdHNfU2hvdWxkTm90UmVtb3ZlUHJvamVjdERpcmVjdGx5SW5jbHVkZWQoKQotICAgIHsKLSAgICAgICAgdmVyaWZ5UHJvamVjdEluY2x1c2lvbiggImdyb3VwIiwgImFydGlmYWN0IiwgImdyb3VwOmFydGlmYWN0IiwgbnVsbCwgbnVsbCApOwotICAgICAgICB2ZXJpZnlQcm9qZWN0SW5jbHVzaW9uKCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCAiZ3JvdXA6YXJ0aWZhY3Q6amFyIiwgbnVsbCwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJQcm9qZWN0c19TaG91bGROb3RSZW1vdmVQcm9qZWN0VHJhbnNpdGl2ZWx5SW5jbHVkZWQoKQotICAgIHsKLSAgICAgICAgdmVyaWZ5UHJvamVjdEluY2x1c2lvbiggImdyb3VwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFydGlmYWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwOmRlcGVuZGVudEFydGlmYWN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiY3VycmVudDpwcm9qZWN0OmphcjoxLjAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cDpkZXBlbmRlbnRBcnRpZmFjdDpqYXI6dmVyc2lvbiIpICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEZpbHRlclByb2plY3RzX1Nob3VsZFJlbW92ZVByb2plY3RUcmFuc2l0aXZlbHlFeGNsdWRlZCgpCi0gICAgewotICAgICAgICB2ZXJpZnlQcm9qZWN0RXhjbHVzaW9uKCAiZ3JvdXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJ0aWZhY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXA6ZGVwZW5kZW50QXJ0aWZhY3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJjdXJyZW50OnByb2plY3Q6amFyOjEuMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyb3VwOmRlcGVuZGVudEFydGlmYWN0Omphcjp2ZXJzaW9uIikgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyUHJvamVjdHNfU2hvdWxkUmVtb3ZlUHJvamVjdERpcmVjdGx5RXhjbHVkZWQoKQotICAgIHsKLSAgICAgICAgdmVyaWZ5UHJvamVjdEV4Y2x1c2lvbiggImdyb3VwIiwgImFydGlmYWN0IiwgbnVsbCwgImdyb3VwOmFydGlmYWN0IiwgbnVsbCApOwotICAgICAgICB2ZXJpZnlQcm9qZWN0RXhjbHVzaW9uKCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCBudWxsLCAiZ3JvdXA6YXJ0aWZhY3Q6amFyIiwgbnVsbCApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJQcm9qZWN0c19TaG91bGROb3RSZW1vdmVQcm9qZWN0Tm90SW5jbHVkZWRBbmROb3RFeGNsdWRlZCgpCi0gICAgewotICAgICAgICB2ZXJpZnlQcm9qZWN0SW5jbHVzaW9uKCAiZ3JvdXAiLCAiYXJ0aWZhY3QiLCBudWxsLCBudWxsLCBudWxsICk7Ci0gICAgICAgIHZlcmlmeVByb2plY3RJbmNsdXNpb24oICJncm91cCIsICJhcnRpZmFjdCIsIG51bGwsIG51bGwsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5QXJ0aWZhY3RJbmNsdXNpb24oIGZpbmFsIFN0cmluZyBncm91cElkLCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgZmluYWwgU3RyaW5nIGluY2x1c2lvblBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhjbHVzaW9uUGF0dGVybiwgZmluYWwgTGlzdDxTdHJpbmc+IGRlcFRyYWlsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXJ0aWZhY3RGaWx0ZXIgYWRkaXRpb25hbEZpbHRlciApCi0gICAgICAgIHRocm93cyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgdmVyaWZ5QXJ0aWZhY3RGaWx0ZXJpbmcoIGdyb3VwSWQsIGFydGlmYWN0SWQsIGluY2x1c2lvblBhdHRlcm4sIGV4Y2x1c2lvblBhdHRlcm4sIGRlcFRyYWlsLCB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpbHRlciApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBcnRpZmFjdEV4Y2x1c2lvbiggZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLCBmaW5hbCBTdHJpbmcgaW5jbHVzaW9uUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNsdXNpb25QYXR0ZXJuLCBmaW5hbCBMaXN0PFN0cmluZz4gZGVwVHJhaWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcnRpZmFjdEZpbHRlciBhZGRpdGlvbmFsRmlsdGVyICkKLSAgICAgICAgdGhyb3dzIEludmFsaWRBc3NlbWJsZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICB2ZXJpZnlBcnRpZmFjdEZpbHRlcmluZyggZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgaW5jbHVzaW9uUGF0dGVybiwgZXhjbHVzaW9uUGF0dGVybiwgZGVwVHJhaWwsIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbEZpbHRlciApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlBcnRpZmFjdEZpbHRlcmluZyggZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLCBmaW5hbCBTdHJpbmcgaW5jbHVzaW9uUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNsdXNpb25QYXR0ZXJuLCBmaW5hbCBMaXN0PFN0cmluZz4gZGVwVHJhaWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHZlcmlmeUluY2x1c2lvbiwgZmluYWwgQXJ0aWZhY3RGaWx0ZXIgYWRkaXRpb25hbEZpbHRlciApCi0gICAgICAgIHRocm93cyBJbnZhbGlkQXNzZW1ibGVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgQXJ0aWZhY3RNb2NrQW5kQ29udHJvbCBtYWMgPSBuZXcgQXJ0aWZhY3RNb2NrQW5kQ29udHJvbCggZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgZGVwVHJhaWwgKTsKLQotICAgICAgICBtb2NrTWFuYWdlci5yZXBsYXlBbGwoKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gaW5jbHVzaW9uczsKLSAgICAgICAgaWYgKCBpbmNsdXNpb25QYXR0ZXJuICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmNsdXNpb25zID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggaW5jbHVzaW9uUGF0dGVybiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW5jbHVzaW9ucyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvbnM7Ci0gICAgICAgIGlmICggZXhjbHVzaW9uUGF0dGVybiAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhjbHVzaW9ucyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGV4Y2x1c2lvblBhdHRlcm4gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4Y2x1c2lvbnMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIFNldDxBcnRpZmFjdD4gYXJ0aWZhY3RzID0gbmV3IEhhc2hTZXQ8QXJ0aWZhY3Q+KCk7Ci0gICAgICAgIGFydGlmYWN0cy5hZGQoIG1hYy5hcnRpZmFjdCApOwotCi0gICAgICAgIEZpbHRlclV0aWxzLmZpbHRlckFydGlmYWN0cyggYXJ0aWZhY3RzLCBpbmNsdXNpb25zLCBleGNsdXNpb25zLCBmYWxzZSwgZGVwVHJhaWwgIT0gbnVsbCwgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxGaWx0ZXIgKTsKLQotICAgICAgICBpZiAoIHZlcmlmeUluY2x1c2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyggMSwgYXJ0aWZhY3RzLnNpemUoKSApOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBtYWMuYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSwgYXJ0aWZhY3RzLml0ZXJhdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBqdXN0IG1ha2Ugc3VyZSB0aGlzIHRyaXBzLCB0byBtZWV0IHRoZSBtb2NrJ3MgZXhwZWN0YXRpb25zLgotICAgICAgICAgICAgbWFjLmFydGlmYWN0LmdldERlcGVuZGVuY3lDb25mbGljdElkKCk7Ci0KLSAgICAgICAgICAgIGFzc2VydFRydWUoIGFydGlmYWN0cy5pc0VtcHR5KCkgKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnZlcmlmeUFsbCgpOwotCi0gICAgICAgIC8vIGdldCByZWFkeSBmb3IgbXVsdGlwbGUgY2FsbHMgcGVyIHRlc3QuCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlc2V0QWxsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVByb2plY3RJbmNsdXNpb24oIGZpbmFsIFN0cmluZyBncm91cElkLCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgZmluYWwgU3RyaW5nIGluY2x1c2lvblBhdHRlcm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNsdXNpb25QYXR0ZXJuLCBmaW5hbCBMaXN0PFN0cmluZz4gZGVwVHJhaWwgKQotICAgIHsKLSAgICAgICAgdmVyaWZ5UHJvamVjdEZpbHRlcmluZyggZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgaW5jbHVzaW9uUGF0dGVybiwgZXhjbHVzaW9uUGF0dGVybiwgZGVwVHJhaWwsIHRydWUgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UHJvamVjdEV4Y2x1c2lvbiggZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLCBmaW5hbCBTdHJpbmcgaW5jbHVzaW9uUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4Y2x1c2lvblBhdHRlcm4sIGZpbmFsIExpc3Q8U3RyaW5nPiBkZXBUcmFpbCApCi0gICAgewotICAgICAgICB2ZXJpZnlQcm9qZWN0RmlsdGVyaW5nKCBncm91cElkLCBhcnRpZmFjdElkLCBpbmNsdXNpb25QYXR0ZXJuLCBleGNsdXNpb25QYXR0ZXJuLCBkZXBUcmFpbCwgZmFsc2UgKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UHJvamVjdEZpbHRlcmluZyggZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLCBmaW5hbCBTdHJpbmcgaW5jbHVzaW9uUGF0dGVybiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4Y2x1c2lvblBhdHRlcm4sIGZpbmFsIExpc3Q8U3RyaW5nPiBkZXBUcmFpbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2ZXJpZnlJbmNsdXNpb24gKQotICAgIHsKLSAgICAgICAgZmluYWwgUHJvamVjdFdpdGhBcnRpZmFjdE1vY2tDb250cm9sIHBtYWMgPSBuZXcgUHJvamVjdFdpdGhBcnRpZmFjdE1vY2tDb250cm9sKCBncm91cElkLCBhcnRpZmFjdElkLCBkZXBUcmFpbCApOwotCi0gICAgICAgIG1vY2tNYW5hZ2VyLnJlcGxheUFsbCgpOwotCi0gICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgbW9jayBpcyBzYXRpc2ZpZWQuLi55b3UgY2FuJ3QgZGlzYWJsZSB0aGlzIGV4cGVjdGF0aW9uLgotICAgICAgICBwbWFjLm1hYy5hcnRpZmFjdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpOwotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IHByb2plY3RzID0gbmV3IEhhc2hTZXQ8TWF2ZW5Qcm9qZWN0PigpOwotICAgICAgICBwcm9qZWN0cy5hZGQoIHBtYWMgKTsKLQotICAgICAgICBMaXN0PFN0cmluZz4gaW5jbHVzaW9uczsKLSAgICAgICAgaWYgKCBpbmNsdXNpb25QYXR0ZXJuICE9IG51bGwgKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbmNsdXNpb25zID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggaW5jbHVzaW9uUGF0dGVybiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgaW5jbHVzaW9ucyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxTdHJpbmc+IGV4Y2x1c2lvbnM7Ci0gICAgICAgIGlmICggZXhjbHVzaW9uUGF0dGVybiAhPSBudWxsICkKLSAgICAgICAgewotICAgICAgICAgICAgZXhjbHVzaW9ucyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoIGV4Y2x1c2lvblBhdHRlcm4gKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4Y2x1c2lvbnMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKTsKLQotICAgICAgICBTZXQ8TWF2ZW5Qcm9qZWN0PiByZXN1bHQgPQotICAgICAgICAgICAgRmlsdGVyVXRpbHMuZmlsdGVyUHJvamVjdHMoIHByb2plY3RzLCBpbmNsdXNpb25zLCBleGNsdXNpb25zLCBkZXBUcmFpbCAhPSBudWxsLCBsb2dnZXIgKTsKLQotICAgICAgICBpZiAoIHZlcmlmeUluY2x1c2lvbiApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyggMSwgcmVzdWx0LnNpemUoKSApOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCBwbWFjLmdldElkKCksIHJlc3VsdC5pdGVyYXRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmV4dCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSggcmVzdWx0LmlzRW1wdHkoKSApOwotICAgICAgICB9Ci0KLSAgICAgICAgbW9ja01hbmFnZXIudmVyaWZ5QWxsKCk7Ci0KLSAgICAgICAgLy8gZ2V0IHJlYWR5IGZvciBtdWx0aXBsZSBjYWxscyBwZXIgdGVzdC4KLSAgICAgICAgbW9ja01hbmFnZXIucmVzZXRBbGwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBNb2RlbCBidWlsZE1vZGVsKCBmaW5hbCBTdHJpbmcgZ3JvdXBJZCwgZmluYWwgU3RyaW5nIGFydGlmYWN0SWQgKQotICAgIHsKLSAgICAgICAgZmluYWwgTW9kZWwgbW9kZWwgPSBuZXcgTW9kZWwoKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggZ3JvdXBJZCApOwotICAgICAgICBtb2RlbC5zZXRBcnRpZmFjdElkKCBhcnRpZmFjdElkICk7Ci0KLSAgICAgICAgcmV0dXJuIG1vZGVsOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvamVjdFdpdGhBcnRpZmFjdE1vY2tDb250cm9sCi0gICAgICAgIGV4dGVuZHMgTWF2ZW5Qcm9qZWN0Ci0gICAgewotICAgICAgICBmaW5hbCBBcnRpZmFjdE1vY2tBbmRDb250cm9sIG1hYzsKLQotICAgICAgICBQcm9qZWN0V2l0aEFydGlmYWN0TW9ja0NvbnRyb2woIGZpbmFsIFN0cmluZyBncm91cElkLCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgZmluYWwgTGlzdDxTdHJpbmc+IGRlcFRyYWlsICkKLSAgICAgICAgewotICAgICAgICAgICAgc3VwZXIoIGJ1aWxkTW9kZWwoIGdyb3VwSWQsIGFydGlmYWN0SWQgKSApOwotCi0gICAgICAgICAgICBtYWMgPSBuZXcgQXJ0aWZhY3RNb2NrQW5kQ29udHJvbCggZ3JvdXBJZCwgYXJ0aWZhY3RJZCwgZGVwVHJhaWwgKTsKLQotICAgICAgICAgICAgc2V0QXJ0aWZhY3QoIG1hYy5hcnRpZmFjdCApOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFydGlmYWN0TW9ja0FuZENvbnRyb2wKLSAgICB7Ci0gICAgICAgIGZpbmFsIEFydGlmYWN0IGFydGlmYWN0OwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBncm91cElkOwotCi0gICAgICAgIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkOwotCi0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBkZXBlbmRlbmN5VHJhaWw7Ci0KLSAgICAgICAgQXJ0aWZhY3RNb2NrQW5kQ29udHJvbCggZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyBhcnRpZmFjdElkLCBmaW5hbCBMaXN0PFN0cmluZz4gZGVwZW5kZW5jeVRyYWlsICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5ncm91cElkID0gZ3JvdXBJZDsKLSAgICAgICAgICAgIHRoaXMuYXJ0aWZhY3RJZCA9IGFydGlmYWN0SWQ7Ci0gICAgICAgICAgICB0aGlzLmRlcGVuZGVuY3lUcmFpbCA9IGRlcGVuZGVuY3lUcmFpbDsKLQotICAgICAgICAgICAgYXJ0aWZhY3QgPSBtb2NrTWFuYWdlci5jcmVhdGVNb2NrIChBcnRpZmFjdC5jbGFzcyk7Ci0KLSAgICAgICAgICAgIC8vIHRoaXMgaXMgYWx3YXlzIGVuYWJsZWQsIGZvciB2ZXJpZmljYXRpb24gcHVycG9zZXMuCi0gICAgICAgICAgICBlbmFibGVHZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpOwotICAgICAgICAgICAgZW5hYmxlR2V0R3JvdXBJZEFydGlmYWN0SWRBbmRJZCgpOwotCi0gICAgICAgICAgICBpZiAoIGRlcGVuZGVuY3lUcmFpbCAhPSBudWxsICkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbmFibGVHZXREZXBlbmRlbmN5VHJhaWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZW5hYmxlR2V0RGVwZW5kZW5jeVRyYWlsKCkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KCBhcnRpZmFjdC5nZXREZXBlbmRlbmN5VHJhaWwoKSkuYW5kUmV0dXJuKCBkZXBlbmRlbmN5VHJhaWwgKS5hbnlUaW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlbmFibGVHZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGV4cGVjdChhcnRpZmFjdC5nZXREZXBlbmRlbmN5Q29uZmxpY3RJZCgpKS5hbmRSZXR1cm4oIGdyb3VwSWQgKyAiOiIgKyBhcnRpZmFjdElkICsgIjpqYXIiKS5hbnlUaW1lcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlbmFibGVHZXRHcm91cElkQXJ0aWZhY3RJZEFuZElkKCkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0KCBhcnRpZmFjdC5nZXRHcm91cElkKCkpLmFuZFJldHVybiggZ3JvdXBJZCkuYW55VGltZXMoKTsKLQotICAgICAgICAgICAgZXhwZWN0KCBhcnRpZmFjdC5nZXRBcnRpZmFjdElkKCkpLmFuZFJldHVybiggYXJ0aWZhY3RJZCApLmFueVRpbWVzKCk7Ci0KLSAgICAgICAgICAgIGV4cGVjdCggYXJ0aWZhY3QuZ2V0SWQoKSkuYW5kUmV0dXJuKCBncm91cElkICsgIjoiICsgYXJ0aWZhY3RJZCArICI6dmVyc2lvbjpudWxsOmphciIpLmFueVRpbWVzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9MaW5lRW5kaW5nc1V0aWxzVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0xpbmVFbmRpbmdzVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiZTczMmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0xpbmVFbmRpbmdzVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLklPVXRpbDsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLQotcHVibGljIGNsYXNzIExpbmVFbmRpbmdzVXRpbHNUZXN0Ci17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1JMRiA9ICJcclxuIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMRiA9ICJcbiI7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZFdvcmtDYXVzZVdlVGVzdEpka0VudW1Db252ZXJzaW9uKCkKLSAgICB7Ci0gICAgICAgIExpbmVFbmRpbmdzIGxpbmVFbmRpbmcgPSBMaW5lRW5kaW5ncy52YWx1ZU9mKCAid2luZG93cyIgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBDUkxGLCBsaW5lRW5kaW5nLmdldExpbmVFbmRpbmdDaGFyYWN0ZXJzKCkgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZFJldHVybkRvc0xpbmVFbmRpbmcoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBDUkxGLCBMaW5lRW5kaW5ncy53aW5kb3dzLmdldExpbmVFbmRpbmdDaGFyYWN0ZXJzKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBDUkxGLCBMaW5lRW5kaW5ncy5kb3MuZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIENSTEYsIExpbmVFbmRpbmdzLmNybGYuZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoKSApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgc2hvdWxkUmV0dXJuVW5peExpbmVFbmRpbmcoKQotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBMRiwgTGluZUVuZGluZ3MudW5peC5nZXRMaW5lRW5kaW5nQ2hhcmFjdGVycygpICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggTEYsIExpbmVFbmRpbmdzLmxmLmdldExpbmVFbmRpbmdDaGFyYWN0ZXJzKCkgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHNob3VsZFJldHVybk51bGxBc0xpbmVFbmRpbmdGb3JLZWVwKCkKLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggbnVsbCwgTGluZUVuZGluZ3Mua2VlcC5nZXRMaW5lRW5kaW5nQ2hhcmFjdGVycygpICk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGluZUVuZGluZ0NoYXJzX1Nob3VsZFJldHVybkRvc0xpbmVFbmRpbmcoKQotICAgICAgICB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoICJcclxuIiwgTGluZUVuZGluZ3NVdGlscy5nZXRMaW5lRW5kaW5nQ2hhcmFjdGVycyggIndpbmRvd3MiICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiXHJcbiIsIExpbmVFbmRpbmdzVXRpbHMuZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoICJkb3MiICkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiXHJcbiIsIExpbmVFbmRpbmdzVXRpbHMuZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoICJjcmxmIiApICk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGluZUVuZGluZ0NoYXJzX1Nob3VsZFJldHVyblVuaXhMaW5lRW5kaW5nKCkKLSAgICAgICAgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiXG4iLCBMaW5lRW5kaW5nc1V0aWxzLmdldExpbmVFbmRpbmdDaGFyYWN0ZXJzKCAidW5peCIgKSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJcbiIsIExpbmVFbmRpbmdzVXRpbHMuZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoICJsZiIgKSApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEdldExpbmVFbmRpbmdDaGFyc19TaG91bGRSZXR1cm5OdWxsTGluZUVuZGluZygpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFzc2VydE51bGwoIExpbmVFbmRpbmdzVXRpbHMuZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoICJrZWVwIiApICk7Ci0gICAgfQotCi0gICAgQFRlc3QoIGV4cGVjdGVkID0gQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uLmNsYXNzICkKLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGluZUVuZGluZ0NoYXJzX1Nob3VsZFRocm93Rm9ybWF0dGluZ0V4Y2VwdGlvbldpdGhJbnZhbGlkSGludCgpCi0gICAgICAgIHRocm93cyBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIExpbmVFbmRpbmdzVXRpbHMuZ2V0TGluZUVuZGluZ0NoYXJhY3RlcnMoICJpbnZhbGlkIiApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRMaW5lRW5kaW5nc19TaG91bGRSZXBsYWNlTEZXaXRoQ1JMRigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHRlc3QgPSAiVGhpcyBpcyBhIFxudGVzdC4iOwotICAgICAgICBTdHJpbmcgY2hlY2sgPSAiVGhpcyBpcyBhIFxyXG50ZXN0LiI7Ci0KLSAgICAgICAgdGVzdENvbnZlcnNpb24oIHRlc3QsIGNoZWNrLCBMaW5lRW5kaW5ncy5jcmxmLCBudWxsICk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydExpbmVFbmRpbmdzX1Nob3VsZFJlcGxhY2VMRldpdGhDUkxGQXRFT0YoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ID0gIlRoaXMgaXMgYSBcbnRlc3QuXG4iOwotICAgICAgICBTdHJpbmcgY2hlY2sgPSAiVGhpcyBpcyBhIFxyXG50ZXN0LlxyXG4iOwotCi0gICAgICAgIHRlc3RDb252ZXJzaW9uKCB0ZXN0LCBjaGVjaywgTGluZUVuZGluZ3MuY3JsZiwgbnVsbCApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRMaW5lRW5kaW5nc19TaG91bGRSZXBsYWNlQ1JMRldpdGhMRigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHRlc3QgPSAiVGhpcyBpcyBhIFxyXG50ZXN0LiI7Ci0gICAgICAgIFN0cmluZyBjaGVjayA9ICJUaGlzIGlzIGEgXG50ZXN0LiI7Ci0KLSAgICAgICAgdGVzdENvbnZlcnNpb24oIHRlc3QsIGNoZWNrLCBMaW5lRW5kaW5ncy5sZiwgbnVsbCApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRMaW5lRW5kaW5nc19TaG91bGRSZXBsYWNlQ1JMRldpdGhMRkF0RU9GKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJUaGlzIGlzIGEgXHJcbnRlc3QuXHJcbiI7Ci0gICAgICAgIFN0cmluZyBjaGVjayA9ICJUaGlzIGlzIGEgXG50ZXN0LlxuIjsKLQotICAgICAgICB0ZXN0Q29udmVyc2lvbiggdGVzdCwgY2hlY2ssIExpbmVFbmRpbmdzLmxmLCBudWxsICk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydExpbmVFbmRpbmdzX1Nob3VsZFJlcGxhY2VMRldpdGhMRigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHRlc3QgPSAiVGhpcyBpcyBhIFxudGVzdC4iOwotICAgICAgICBTdHJpbmcgY2hlY2sgPSAiVGhpcyBpcyBhIFxudGVzdC4iOwotCi0gICAgICAgIHRlc3RDb252ZXJzaW9uKCB0ZXN0LCBjaGVjaywgTGluZUVuZGluZ3MubGYsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0TGluZUVuZGluZ3NfU2hvdWxkUmVwbGFjZUxGV2l0aExGQXRFT0YoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ID0gIlRoaXMgaXMgYSBcbnRlc3QuXG4iOwotICAgICAgICBTdHJpbmcgY2hlY2sgPSAiVGhpcyBpcyBhIFxudGVzdC5cbiI7Ci0KLSAgICAgICAgdGVzdENvbnZlcnNpb24oIHRlc3QsIGNoZWNrLCBMaW5lRW5kaW5ncy5sZiwgbnVsbCApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRMaW5lRW5kaW5nc19TaG91bGRSZXBsYWNlQ1JMRldpdGhDUkxGKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJUaGlzIGlzIGEgXHJcbnRlc3QuIjsKLSAgICAgICAgU3RyaW5nIGNoZWNrID0gIlRoaXMgaXMgYSBcclxudGVzdC4iOwotCi0gICAgICAgIHRlc3RDb252ZXJzaW9uKCB0ZXN0LCBjaGVjaywgTGluZUVuZGluZ3MuY3JsZiwgbnVsbCApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRMaW5lRW5kaW5nc19TaG91bGRSZXBsYWNlQ1JMRldpdGhDUkxGQXRFT0YoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ID0gIlRoaXMgaXMgYSBcclxudGVzdC5cclxuIjsKLSAgICAgICAgU3RyaW5nIGNoZWNrID0gIlRoaXMgaXMgYSBcclxudGVzdC5cclxuIjsKLQotICAgICAgICB0ZXN0Q29udmVyc2lvbiggdGVzdCwgY2hlY2ssIExpbmVFbmRpbmdzLmNybGYsIG51bGwgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0TGluZUVuZGluZ3NfTEZUb0NSTEZOb0VPRkZvcmNlRU9GKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJUaGlzIGlzIGEgXG50ZXN0LiI7Ci0gICAgICAgIFN0cmluZyBjaGVjayA9ICJUaGlzIGlzIGEgXHJcbnRlc3QuXHJcbiI7Ci0KLSAgICAgICAgdGVzdENvbnZlcnNpb24oIHRlc3QsIGNoZWNrLCBMaW5lRW5kaW5ncy5jcmxmLCB0cnVlICk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydExpbmVFbmRpbmdzX0xGVG9DUkxGV2l0aEVPRkZvcmNlRU9GKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJUaGlzIGlzIGEgXG50ZXN0LlxuIjsKLSAgICAgICAgU3RyaW5nIGNoZWNrID0gIlRoaXMgaXMgYSBcclxudGVzdC5cclxuIjsKLQotICAgICAgICB0ZXN0Q29udmVyc2lvbiggdGVzdCwgY2hlY2ssIExpbmVFbmRpbmdzLmNybGYsIHRydWUgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0TGluZUVuZGluZ3NfTEZUb0NSTEZOb0VPRlN0cmlwRU9GKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJUaGlzIGlzIGEgXG50ZXN0LiI7Ci0gICAgICAgIFN0cmluZyBjaGVjayA9ICJUaGlzIGlzIGEgXHJcbnRlc3QuIjsKLQotICAgICAgICB0ZXN0Q29udmVyc2lvbiggdGVzdCwgY2hlY2ssIExpbmVFbmRpbmdzLmNybGYsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydExpbmVFbmRpbmdzX0xGVG9DUkxGV2l0aEVPRlN0cmlwRU9GKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJUaGlzIGlzIGEgXG50ZXN0LlxuIjsKLSAgICAgICAgU3RyaW5nIGNoZWNrID0gIlRoaXMgaXMgYSBcclxudGVzdC4iOwotCi0gICAgICAgIHRlc3RDb252ZXJzaW9uKCB0ZXN0LCBjaGVjaywgTGluZUVuZGluZ3MuY3JsZiwgZmFsc2UgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0TGluZUVuZGluZ3NfQ1JMRlRvTEZOb0VPRkZvcmNlRU9GKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJUaGlzIGlzIGEgXHJcbnRlc3QuIjsKLSAgICAgICAgU3RyaW5nIGNoZWNrID0gIlRoaXMgaXMgYSBcbnRlc3QuXG4iOwotCi0gICAgICAgIHRlc3RDb252ZXJzaW9uKCB0ZXN0LCBjaGVjaywgTGluZUVuZGluZ3MubGYsIHRydWUgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0TGluZUVuZGluZ3NfQ1JMRlRvTEZXaXRoRU9GRm9yY2VFT0YoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIFN0cmluZyB0ZXN0ID0gIlRoaXMgaXMgYSBcclxudGVzdC5cclxuIjsKLSAgICAgICAgU3RyaW5nIGNoZWNrID0gIlRoaXMgaXMgYSBcbnRlc3QuXG4iOwotCi0gICAgICAgIHRlc3RDb252ZXJzaW9uKCB0ZXN0LCBjaGVjaywgTGluZUVuZGluZ3MubGYsIHRydWUgKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJ0TGluZUVuZGluZ3NfQ1JMRlRvTEZOb0VPRlN0cmlwRU9GKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTdHJpbmcgdGVzdCA9ICJUaGlzIGlzIGEgXHJcbnRlc3QuIjsKLSAgICAgICAgU3RyaW5nIGNoZWNrID0gIlRoaXMgaXMgYSBcbnRlc3QuIjsKLQotICAgICAgICB0ZXN0Q29udmVyc2lvbiggdGVzdCwgY2hlY2ssIExpbmVFbmRpbmdzLmxmLCBmYWxzZSApOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRMaW5lRW5kaW5nc19DUkxGVG9MRldpdGhFT0ZTdHJpcEVPRigpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIHRlc3QgPSAiVGhpcyBpcyBhIFxyXG50ZXN0LlxyXG4iOwotICAgICAgICBTdHJpbmcgY2hlY2sgPSAiVGhpcyBpcyBhIFxudGVzdC4iOwotCi0gICAgICAgIHRlc3RDb252ZXJzaW9uKCB0ZXN0LCBjaGVjaywgTGluZUVuZGluZ3MubGYsIGZhbHNlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRlc3RDb252ZXJzaW9uKCBTdHJpbmcgdGVzdCwgU3RyaW5nIGNoZWNrLCBMaW5lRW5kaW5ncyBsaW5lRW5kaW5nQ2hhcnMsIEJvb2xlYW4gZW9mICkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBGaWxlIHNvdXJjZSA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoICJsaW5lLWNvbnZlcnNpb24tdGVzdC1pbi4iLCAiIiApOwotICAgICAgICBzb3VyY2UuZGVsZXRlT25FeGl0KCk7Ci0gICAgICAgIEZpbGUgZGVzdCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoICJsaW5lLWNvbnZlcnNpb24tdGVzdC1vdXQuIiwgIiIgKTsKLSAgICAgICAgZGVzdC5kZWxldGVPbkV4aXQoKTsKLQotICAgICAgICBGaWxlV3JpdGVyIHNvdXJjZVdyaXRlciA9IG51bGw7Ci0gICAgICAgIFN0cmluZ1JlYWRlciBzb3VyY2VSZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKCB0ZXN0ICk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBzb3VyY2VXcml0ZXIgPSBuZXcgRmlsZVdyaXRlciggc291cmNlICk7Ci0KLSAgICAgICAgICAgIElPVXRpbC5jb3B5KCBzb3VyY2VSZWFkZXIsIHNvdXJjZVdyaXRlciApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgSU9VdGlsLmNsb3NlKCBzb3VyY2VXcml0ZXIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFVzaW5nIHBsYXRmb3JtIGVuY29kaW5nIGZvciB0aGUgY29udmVyc2lvbiB0ZXN0cyBpbiB0aGlzIGNsYXNzIGlzIE9LCi0gICAgICAgIExpbmVFbmRpbmdzVXRpbHMuY29udmVydExpbmVFbmRpbmdzKCBzb3VyY2UsIGRlc3QsIGxpbmVFbmRpbmdDaGFycywgZW9mLCBudWxsICk7Ci0KLSAgICAgICAgRmlsZVJlYWRlciBkZXN0UmVhZGVyID0gbnVsbDsKLSAgICAgICAgU3RyaW5nV3JpdGVyIGRlc3RXcml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBkZXN0UmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoIGRlc3QgKTsKLQotICAgICAgICAgICAgSU9VdGlsLmNvcHkoIGRlc3RSZWFkZXIsIGRlc3RXcml0ZXIgKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbGx5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIElPVXRpbC5jbG9zZSggZGVzdFJlYWRlciApOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBjaGVjaywgZGVzdFdyaXRlci50b1N0cmluZygpICk7Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvTGludXhMaW5lRmVlZElucHV0U3RyZWFtVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL0xpbnV4TGluZUZlZWRJbnB1dFN0cmVhbVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxNWVjNy4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvTGludXhMaW5lRmVlZElucHV0U3RyZWFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIExpbnV4TGluZUZlZWRJbnB1dFN0cmVhbVRlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU3RyaW5nKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYWJjXG4iLCByb3VuZHRyaXAoICJhYmMiICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0SW5UaGVNaWRkbGVPZlRoZUxpbmUoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoICJhXG5iY1xuIiwgcm91bmR0cmlwKCAiYVxyXG5iYyIgKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RDck9ubHkoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoICJhXG5iXG4iLCByb3VuZHRyaXAoICJhXHJiIiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdENyQXRFbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYVxuIiwgcm91bmR0cmlwKCAiYVxyIiApICk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVCbGFua0xpbmVzKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYVxuXG5iY1xuIiwgcm91bmR0cmlwKCAiYVxyXG5cclxuYmMiICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvTGluZXNBdEVuZCgpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggImFcblxuIiwgcm91bmR0cmlwKCAiYVxyXG5cclxuIiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFJldGFpbkxpbmVGZWVkKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYVxuXG4iLCByb3VuZHRyaXAoICJhXHJcblxyXG4iLCBmYWxzZSApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggImEiLCByb3VuZHRyaXAoICJhIiwgZmFsc2UgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJvdW5kdHJpcCggU3RyaW5nIG1zZyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHJvdW5kdHJpcCggbXNnLCB0cnVlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm91bmR0cmlwKCBTdHJpbmcgbXNnLCBib29sZWFuIGVuc3VyZSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSggbXNnLmdldEJ5dGVzKCkgKTsKLSAgICAgICAgTGludXhMaW5lRmVlZElucHV0U3RyZWFtIGxmID0gbmV3IExpbnV4TGluZUZlZWRJbnB1dFN0cmVhbSggYmFvcywgZW5zdXJlICk7Ci0gICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDBdOwotICAgICAgICBmaW5hbCBpbnQgcmVhZCA9IGxmLnJlYWQoIGJ1ZiApOwotICAgICAgICByZXR1cm4gbmV3IFN0cmluZyggYnVmLCAwLCByZWFkICk7Ci0gICAgfQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1Byb2plY3RVdGlsc1Rlc3QuamF2YSBiL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9Qcm9qZWN0VXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMzczYWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1Byb2plY3RVdGlsc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LnV0aWxzOwotCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuY29uc29sZS5Db25zb2xlTG9nZ2VyOwotCi1wdWJsaWMgY2xhc3MgUHJvamVjdFV0aWxzVGVzdAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLQotICAgIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IGNyZWF0ZVRlc3RQcm9qZWN0KCBmaW5hbCBTdHJpbmcgYXJ0aWZhY3RJZCwgZmluYWwgU3RyaW5nIGdyb3VwSWQsIGZpbmFsIFN0cmluZyB2ZXJzaW9uICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgICAgIG1vZGVsLnNldEFydGlmYWN0SWQoIGFydGlmYWN0SWQgKTsKLSAgICAgICAgbW9kZWwuc2V0R3JvdXBJZCggZ3JvdXBJZCApOwotICAgICAgICBtb2RlbC5zZXRWZXJzaW9uKCB2ZXJzaW9uICk7Ci0KLSAgICAgICAgcmV0dXJuIG5ldyBNYXZlblByb2plY3QoIG1vZGVsICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFByb2plY3RNb2R1bGVzX1Nob3VsZEluY2x1ZGVEaXJlY3RNb2R1bGVPZk1hc3RlclByb2plY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBtYXN0ZXIgPSBjcmVhdGVUZXN0UHJvamVjdCggInRlc3QiLCAidGVzdEdyb3VwIiwgIjEuMCIgKTsKLQotICAgICAgICBtYXN0ZXIuc2V0RmlsZSggbmV3IEZpbGUoICJwb20ueG1sIiApICk7Ci0KLSAgICAgICAgbWFzdGVyLmdldE1vZGVsKCkKLSAgICAgICAgICAgICAgLmFkZE1vZHVsZSggIm1vZHVsZSIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlID0gY3JlYXRlVGVzdFByb2plY3QoICJtb2R1bGUiLCAidGVzdEdyb3VwIiwgIjEuMCIgKTsKLQotICAgICAgICBtb2R1bGUuc2V0RmlsZSggbmV3IEZpbGUoICJtb2R1bGUvcG9tLnhtbCIgKSApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiBwcm9qZWN0cyA9IG5ldyBBcnJheUxpc3Q8TWF2ZW5Qcm9qZWN0PiggMiApOwotCi0gICAgICAgIHByb2plY3RzLmFkZCggbWFzdGVyICk7Ci0gICAgICAgIHByb2plY3RzLmFkZCggbW9kdWxlICk7Ci0KLSAgICAgICAgZmluYWwgU2V0PE1hdmVuUHJvamVjdD4gcmVzdWx0ID0KLSAgICAgICAgICAgIFByb2plY3RVdGlscy5nZXRQcm9qZWN0TW9kdWxlcyggbWFzdGVyLCBwcm9qZWN0cywgdHJ1ZSwgbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9JTkZPLCAidGVzdCIgKSApOwotCi0gICAgICAgIGFzc2VydE5vdE51bGwoIHJlc3VsdCApOwotICAgICAgICBhc3NlcnRFcXVhbHMoIDEsIHJlc3VsdC5zaXplKCkgKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCBtb2R1bGUuZ2V0SWQoKSwgcmVzdWx0Lml0ZXJhdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5leHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SWQoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0TW9kdWxlc19TaG91bGROb3RJbmNsdWRlTWFzdGVyUHJvamVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1hc3RlciA9IGNyZWF0ZVRlc3RQcm9qZWN0KCAidGVzdCIsICJ0ZXN0R3JvdXAiLCAiMS4wIiApOwotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IHJlc3VsdCA9Ci0gICAgICAgICAgICBQcm9qZWN0VXRpbHMuZ2V0UHJvamVjdE1vZHVsZXMoIG1hc3RlciwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCggbWFzdGVyICksIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfSU5GTywgInRlc3QiICkgKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCByZXN1bHQgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggcmVzdWx0LmlzRW1wdHkoKSApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9qZWN0TW9kdWxlc19TaG91bGRJbmNsdWRlSW5EaXJlY3RNb2R1bGVPZk1hc3RlcldoZW5JbmNsdWRlU3ViTW9kdWxlc0lzVHJ1ZSgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1hc3RlciA9IGNyZWF0ZVRlc3RQcm9qZWN0KCAidGVzdCIsICJ0ZXN0R3JvdXAiLCAiMS4wIiApOwotCi0gICAgICAgIG1hc3Rlci5zZXRGaWxlKCBuZXcgRmlsZSggInByb2plY3QvcG9tLnhtbCIgKSApOwotCi0gICAgICAgIG1hc3Rlci5nZXRNb2RlbCgpCi0gICAgICAgICAgICAgIC5hZGRNb2R1bGUoICJtb2R1bGUiICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IG1vZHVsZSA9IGNyZWF0ZVRlc3RQcm9qZWN0KCAibW9kdWxlIiwgInRlc3RHcm91cCIsICIxLjAiICk7Ci0KLSAgICAgICAgbW9kdWxlLmdldE1vZGVsKCkKLSAgICAgICAgICAgICAgLmFkZE1vZHVsZSggInN1Ym1vZHVsZSIgKTsKLQotICAgICAgICBtb2R1bGUuc2V0RmlsZSggbmV3IEZpbGUoICJwcm9qZWN0L21vZHVsZS9wb20ueG1sIiApICk7Ci0KLSAgICAgICAgZmluYWwgTWF2ZW5Qcm9qZWN0IHN1Yk1vZHVsZSA9IGNyZWF0ZVRlc3RQcm9qZWN0KCAic3ViLW1vZHVsZSIsICJ0ZXN0R3JvdXAiLCAiMS4wIiApOwotCi0gICAgICAgIHN1Yk1vZHVsZS5zZXRGaWxlKCBuZXcgRmlsZSggInByb2plY3QvbW9kdWxlL3N1Ym1vZHVsZS9wb20ueG1sIiApICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IHByb2plY3RzID0gbmV3IEFycmF5TGlzdDxNYXZlblByb2plY3Q+KCAzICk7Ci0KLSAgICAgICAgcHJvamVjdHMuYWRkKCBtYXN0ZXIgKTsKLSAgICAgICAgcHJvamVjdHMuYWRkKCBtb2R1bGUgKTsKLSAgICAgICAgcHJvamVjdHMuYWRkKCBzdWJNb2R1bGUgKTsKLQotICAgICAgICBmaW5hbCBTZXQ8TWF2ZW5Qcm9qZWN0PiByZXN1bHQgPQotICAgICAgICAgICAgUHJvamVjdFV0aWxzLmdldFByb2plY3RNb2R1bGVzKCBtYXN0ZXIsIHByb2plY3RzLCB0cnVlLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0lORk8sICJ0ZXN0IiApICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggcmVzdWx0ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMiwgcmVzdWx0LnNpemUoKSApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiB2ZXJpZnkgPSBuZXcgQXJyYXlMaXN0PE1hdmVuUHJvamVjdD4oIHByb2plY3RzICk7Ci0gICAgICAgIHZlcmlmeS5yZW1vdmUoIG1hc3RlciApOwotCi0gICAgICAgIHZlcmlmeVByb2plY3RzUHJlc2VudCggdmVyaWZ5LCByZXN1bHQgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvamVjdE1vZHVsZXNfU2hvdWxkRXhjbHVkZUluRGlyZWN0TW9kdWxlT2ZNYXN0ZXJXaGVuSW5jbHVkZVN1Yk1vZHVsZXNJc0ZhbHNlKCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbWFzdGVyID0gY3JlYXRlVGVzdFByb2plY3QoICJ0ZXN0IiwgInRlc3RHcm91cCIsICIxLjAiICk7Ci0KLSAgICAgICAgbWFzdGVyLnNldEZpbGUoIG5ldyBGaWxlKCAicHJvamVjdC9wb20ueG1sIiApICk7Ci0KLSAgICAgICAgbWFzdGVyLmdldE1vZGVsKCkKLSAgICAgICAgICAgICAgLmFkZE1vZHVsZSggIm1vZHVsZSIgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3QgbW9kdWxlID0gY3JlYXRlVGVzdFByb2plY3QoICJtb2R1bGUiLCAidGVzdEdyb3VwIiwgIjEuMCIgKTsKLQotICAgICAgICBtb2R1bGUuZ2V0TW9kZWwoKQotICAgICAgICAgICAgICAuYWRkTW9kdWxlKCAic3VibW9kdWxlIiApOwotCi0gICAgICAgIG1vZHVsZS5zZXRGaWxlKCBuZXcgRmlsZSggInByb2plY3QvbW9kdWxlL3BvbS54bWwiICkgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3Qgc3ViTW9kdWxlID0gY3JlYXRlVGVzdFByb2plY3QoICJzdWItbW9kdWxlIiwgInRlc3RHcm91cCIsICIxLjAiICk7Ci0KLSAgICAgICAgc3ViTW9kdWxlLnNldEZpbGUoIG5ldyBGaWxlKCAicHJvamVjdC9tb2R1bGUvc3VibW9kdWxlL3BvbS54bWwiICkgKTsKLQotICAgICAgICBmaW5hbCBMaXN0PE1hdmVuUHJvamVjdD4gcHJvamVjdHMgPSBuZXcgQXJyYXlMaXN0PE1hdmVuUHJvamVjdD4oIDMgKTsKLQotICAgICAgICBwcm9qZWN0cy5hZGQoIG1hc3RlciApOwotICAgICAgICBwcm9qZWN0cy5hZGQoIG1vZHVsZSApOwotICAgICAgICBwcm9qZWN0cy5hZGQoIHN1Yk1vZHVsZSApOwotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IHJlc3VsdCA9Ci0gICAgICAgICAgICBQcm9qZWN0VXRpbHMuZ2V0UHJvamVjdE1vZHVsZXMoIG1hc3RlciwgcHJvamVjdHMsIGZhbHNlLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0lORk8sICJ0ZXN0IiApICk7Ci0KLSAgICAgICAgYXNzZXJ0Tm90TnVsbCggcmVzdWx0ICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggMSwgcmVzdWx0LnNpemUoKSApOwotCi0gICAgICAgIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiB2ZXJpZnkgPSBuZXcgQXJyYXlMaXN0PE1hdmVuUHJvamVjdD4oIHByb2plY3RzICk7Ci0gICAgICAgIHZlcmlmeS5yZW1vdmUoIG1hc3RlciApOwotICAgICAgICB2ZXJpZnkucmVtb3ZlKCBzdWJNb2R1bGUgKTsKLQotICAgICAgICB2ZXJpZnlQcm9qZWN0c1ByZXNlbnQoIHZlcmlmeSwgcmVzdWx0ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdldFByb2plY3RNb2R1bGVzX1Nob3VsZEV4Y2x1ZGVOb25Nb2R1bGVPZk1hc3RlclByb2plY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCBtYXN0ZXIgPSBjcmVhdGVUZXN0UHJvamVjdCggInRlc3QiLCAidGVzdEdyb3VwIiwgIjEuMCIgKTsKLQotICAgICAgICBtYXN0ZXIuc2V0RmlsZSggbmV3IEZpbGUoICJwcm9qZWN0L3BvbS54bWwiICkgKTsKLQotICAgICAgICBmaW5hbCBNYXZlblByb2plY3Qgb3RoZXIgPSBjcmVhdGVUZXN0UHJvamVjdCggIm90aGVyIiwgInRlc3RHcm91cCIsICIxLjAiICk7Ci0KLSAgICAgICAgb3RoZXIuc2V0RmlsZSggbmV3IEZpbGUoICJvdGhlci9wb20ueG1sIiApICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IHByb2plY3RzID0gbmV3IEFycmF5TGlzdDxNYXZlblByb2plY3Q+KCAzICk7Ci0KLSAgICAgICAgcHJvamVjdHMuYWRkKCBtYXN0ZXIgKTsKLSAgICAgICAgcHJvamVjdHMuYWRkKCBvdGhlciApOwotCi0gICAgICAgIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IHJlc3VsdCA9Ci0gICAgICAgICAgICBQcm9qZWN0VXRpbHMuZ2V0UHJvamVjdE1vZHVsZXMoIG1hc3RlciwgcHJvamVjdHMsIHRydWUsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfSU5GTywgInRlc3QiICkgKTsKLQotICAgICAgICBhc3NlcnROb3ROdWxsKCByZXN1bHQgKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSggcmVzdWx0LmlzRW1wdHkoKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlQcm9qZWN0c1ByZXNlbnQoIGZpbmFsIExpc3Q8TWF2ZW5Qcm9qZWN0PiB2ZXJpZnksIGZpbmFsIFNldDxNYXZlblByb2plY3Q+IHJlc3VsdCApCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PE1hdmVuUHJvamVjdD4gdmVyaWZ5Q29weSA9IG5ldyBBcnJheUxpc3Q8TWF2ZW5Qcm9qZWN0PiggdmVyaWZ5ICk7Ci0KLSAgICAgICAgZmluYWwgTGlzdDxNYXZlblByb2plY3Q+IHVuZXhwZWN0ZWQgPSBuZXcgQXJyYXlMaXN0PE1hdmVuUHJvamVjdD4oKTsKLQotICAgICAgICBmb3IgKGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0IDogcmVzdWx0KSB7Ci0gICAgICAgICAgICBib29sZWFuIHJlbW92ZWQgPSBmYWxzZTsKLQotICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxNYXZlblByb2plY3Q+IHZlcmlmeUl0ZXJhdG9yID0gdmVyaWZ5Q29weS5pdGVyYXRvcigpOyB2ZXJpZnlJdGVyYXRvci5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1hdmVuUHJvamVjdCB2ZXJpZmljYXRpb24gPSB2ZXJpZnlJdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAodmVyaWZpY2F0aW9uLmdldElkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMocHJvamVjdC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICB2ZXJpZnlJdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJlbW92ZWQpIHsKLSAgICAgICAgICAgICAgICB1bmV4cGVjdGVkLmFkZChwcm9qZWN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmICggIXZlcmlmeUNvcHkuaXNFbXB0eSgpICkKLSAgICAgICAgewotICAgICAgICAgICAgZmFpbCggIkZhaWxlZCB0byB2ZXJpZnkgcHJlc2VuY2Ugb2Y6ICIgKyB2ZXJpZnlDb3B5ICk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoICF1bmV4cGVjdGVkLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZhaWwoICJGb3VuZCB1bmV4cGVjdGVkIHByb2plY3RzIGluIHJlc3VsdDogIiArIHVuZXhwZWN0ZWQgKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHByaXZhdGUgdm9pZCB2ZXJpZnlQcm9qZWN0c05vdFByZXNlbnQoIExpc3QgdmVyaWZ5LCBTZXQgcmVzdWx0ICkKLSAgICAvLyB7Ci0gICAgLy8gTGlzdCB2ZXJpZnlDb3B5ID0gbmV3IEFycmF5TGlzdCggdmVyaWZ5ICk7Ci0gICAgLy8KLSAgICAvLyBmb3IgKCBJdGVyYXRvciBpdCA9IHJlc3VsdC5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkKLSAgICAvLyB7Ci0gICAgLy8gTWF2ZW5Qcm9qZWN0IHByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBpdC5uZXh0KCk7Ci0gICAgLy8KLSAgICAvLyBmb3IgKCBJdGVyYXRvciB2ZXJpZnlJdGVyYXRvciA9IHZlcmlmeUNvcHkuaXRlcmF0b3IoKTsgdmVyaWZ5SXRlcmF0b3IuaGFzTmV4dCgpOyApCi0gICAgLy8gewotICAgIC8vIE1hdmVuUHJvamVjdCB2ZXJpZmljYXRpb24gPSAoTWF2ZW5Qcm9qZWN0KSB2ZXJpZnlJdGVyYXRvci5uZXh0KCk7Ci0gICAgLy8KLSAgICAvLyBpZiAoIHZlcmlmaWNhdGlvbi5nZXRJZCgpLmVxdWFscyggcHJvamVjdC5nZXRJZCgpICkgKQotICAgIC8vIHsKLSAgICAvLyB2ZXJpZnlJdGVyYXRvci5yZW1vdmUoKTsKLSAgICAvLyB9Ci0gICAgLy8gfQotICAgIC8vIH0KLSAgICAvLwotICAgIC8vIGlmICggdmVyaWZ5Q29weS5zaXplKCkgIT0gdmVyaWZ5LnNpemUoKSApCi0gICAgLy8gewotICAgIC8vIExpc3QgZm91bmQgPSBuZXcgQXJyYXlMaXN0KCB2ZXJpZnkgKTsKLSAgICAvLyBmb3VuZC5yZW1vdmVBbGwoIHZlcmlmeUNvcHkgKTsKLSAgICAvLwotICAgIC8vIGZhaWwoICJGYWlsZWQgdG8gdmVyaWZ5IGFic2VuY2Ugb2Y6ICIgKyBmb3VuZCApOwotICAgIC8vIH0KLSAgICAvLyB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuLWFzc2VtYmx5LXBsdWdpbi0yLngvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL21hdmVuL3BsdWdpbi9hc3NlbWJseS91dGlscy9UeXBlQ29udmVyc2lvblV0aWxzVGVzdC5qYXZhIGIvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1R5cGVDb252ZXJzaW9uVXRpbHNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzNzkyNmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1R5cGVDb252ZXJzaW9uVXRpbHNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmFzc2VtYmx5LmZvcm1hdC5Bc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmxvZ2dpbmcuY29uc29sZS5Db25zb2xlTG9nZ2VyOwotCi1wdWJsaWMgY2xhc3MgVHlwZUNvbnZlcnNpb25VdGlsc1Rlc3QKLSAgICBleHRlbmRzIFRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZVRvSW50X0ludGVycHJldEFzT2N0YWxXaXRob3V0TGVhZGluZ1plcm8oKSB0aHJvd3MgQXNzZW1ibHlGb3JtYXR0aW5nRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBpbnQgY2hlY2sgPSBJbnRlZ2VyLmRlY29kZSgiMDc3NyIpOwotICAgICAgICBmaW5hbCBpbnQgdGVzdCA9IFR5cGVDb252ZXJzaW9uVXRpbHMubW9kZVRvSW50KCAiNzc3IiwgbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9ERUJVRywgInRlc3QiICkgKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIGNoZWNrLCB0ZXN0ICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE1vZGVUb0ludF9JbnRlcnByZXRWYWx1ZXNXaXRoTGVhZGluZ1plcm9Bc09jdGFsKCkgdGhyb3dzIEFzc2VtYmx5Rm9ybWF0dGluZ0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgZmluYWwgaW50IGNoZWNrID0gSW50ZWdlci5kZWNvZGUoIjA3NzciKTsKLSAgICAgICAgZmluYWwgaW50IHRlc3QgPSBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggIjA3NzciLCBuZXcgQ29uc29sZUxvZ2dlciggTG9nZ2VyLkxFVkVMX0RFQlVHLCAidGVzdCIgKSApOwotCi0gICAgICAgIGFzc2VydEVxdWFscyggY2hlY2ssIHRlc3QgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TW9kZVRvSW50X0ZhaWxPbkludmFsaWRPY3RhbFZhbHVlKCkKLSAgICB7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICBUeXBlQ29udmVyc2lvblV0aWxzLm1vZGVUb0ludCggIjQ5MyIsIG5ldyBDb25zb2xlTG9nZ2VyKCBMb2dnZXIuTEVWRUxfREVCVUcsICJ0ZXN0IiApICk7Ci0KLSAgICAgICAgICAgIGZhaWwoICInNDkzJyBpcyBhbiBpbnZhbGlkIG1vZGUgYW5kIHNob3VsZCB0cmlnZ2VyIGFuIGV4Y2VwdGlvbi4iICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBmaW5hbCBBc3NlbWJseUZvcm1hdHRpbmdFeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIGV4cGVjdGVkLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFZlcmlmeU1vZGVTYW5pdHlfV2Fybk9uTm9uc2Vuc2ljYWxPY3RhbFZhbHVlXzAwMigpCi0gICAgewotICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oIDIgKTsKLSAgICAgICAgbWVzc2FnZXMuYWRkKCAiV29ybGQgaGFzIHdyaXRlIGFjY2VzcywgYnV0IHVzZXIgZG9lcyBub3QuIiApOwotICAgICAgICBtZXNzYWdlcy5hZGQoICJXb3JsZCBoYXMgd3JpdGUgYWNjZXNzLCBidXQgZ3JvdXAgZG9lcyBub3QuIiApOwotCi0gICAgICAgIGNoZWNrRmlsZU1vZGVTYW5pdHkoICIwMDIiLCBmYWxzZSwgbWVzc2FnZXMgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyaWZ5TW9kZVNhbml0eV9XYXJuT25Ob25zZW5zaWNhbE9jdGFsVmFsdWVfMDIwKCkKLSAgICB7Ci0gICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPiggMSApOwotICAgICAgICBtZXNzYWdlcy5hZGQoICJHcm91cCBoYXMgd3JpdGUgYWNjZXNzLCBidXQgdXNlciBkb2VzIG5vdC4iICk7Ci0KLSAgICAgICAgY2hlY2tGaWxlTW9kZVNhbml0eSggIjAyMCIsIGZhbHNlLCBtZXNzYWdlcyApOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJpZnlNb2RlU2FuaXR5X1JldHVyblRydWVGb3JWYWxpZE9jdGFsVmFsdWVfNzc1KCkKLSAgICB7Ci0gICAgICAgIGNoZWNrRmlsZU1vZGVTYW5pdHkoICI3NzUiLCB0cnVlLCBudWxsICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRmlsZU1vZGVTYW5pdHkoIGZpbmFsIFN0cmluZyBtb2RlLCBmaW5hbCBib29sZWFuIGlzU2FuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG1lc3NhZ2VzVG9DaGVja0lmSW5zYW5lICkKLSAgICB7Ci0gICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBmaW5hbCBQcmludFN0cmVhbSBwcyA9IG5ldyBQcmludFN0cmVhbSggYmFvcyApOwotCi0gICAgICAgIGZpbmFsIFByaW50U3RyZWFtIG9sZE91dCA9IFN5c3RlbS5vdXQ7Ci0gICAgICAgIGZpbmFsIFByaW50U3RyZWFtIG9sZEVyciA9IFN5c3RlbS5lcnI7Ci0KLSAgICAgICAgdHJ5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRPdXQoIHBzICk7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0RXJyKCBwcyApOwotCi0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoICJNb2RlIHNhbml0eSBzaG91bGQgYmU6ICIgKyBpc1NhbmUsIGlzU2FuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUNvbnZlcnNpb25VdGlscy52ZXJpZnlNb2RlU2FuaXR5KCBJbnRlZ2VyLnBhcnNlSW50KCBtb2RlLCA4ICksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbnNvbGVMb2dnZXIoIExvZ2dlci5MRVZFTF9XQVJOLCAidGVzdCIgKSApICk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWxseQotICAgICAgICB7Ci0gICAgICAgICAgICBTeXN0ZW0uc2V0T3V0KCBvbGRPdXQgKTsKLSAgICAgICAgICAgIFN5c3RlbS5zZXRFcnIoIG9sZEVyciApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhaXNTYW5lICYmIG1lc3NhZ2VzVG9DaGVja0lmSW5zYW5lICE9IG51bGwgJiYgIW1lc3NhZ2VzVG9DaGVja0lmSW5zYW5lLmlzRW1wdHkoKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gbmV3IFN0cmluZyggYmFvcy50b0J5dGVBcnJheSgpICk7Ci0KLSAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGNoZWNrTWVzc2FnZSA6IG1lc3NhZ2VzVG9DaGVja0lmSW5zYW5lKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiXCciICsgY2hlY2tNZXNzYWdlICsgIlwnIGlzIG5vdCBwcmVzZW50IGluIG91dHB1dC4iLCBtZXNzYWdlLmNvbnRhaW5zKGNoZWNrTWVzc2FnZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvV2luZG93c0xpbmVGZWVkSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9tYXZlbi9wbHVnaW4vYXNzZW1ibHkvdXRpbHMvV2luZG93c0xpbmVGZWVkSW5wdXRTdHJlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMWUwZmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbWF2ZW4vcGx1Z2luL2Fzc2VtYmx5L3V0aWxzL1dpbmRvd3NMaW5lRmVlZElucHV0U3RyZWFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotcGFja2FnZSBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5hc3NlbWJseS51dGlsczsKLQotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFdpbmRvd3NMaW5lRmVlZElucHV0U3RyZWFtVGVzdAotICAgIGV4dGVuZHMgVGVzdENhc2UKLXsKLQotICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVTdHJpbmcoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoICJhYmNcclxuIiwgcm91bmR0cmlwKCAiYWJjIiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEluVGhlTWlkZGxlT2ZUaGVMaW5lKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYVxyXG5iY1xyXG4iLCByb3VuZHRyaXAoICJhXHJcbmJjIiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQmxhbmtMaW5lcygpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIGFzc2VydEVxdWFscyggImFcclxuXHJcbmJjXHJcbiIsIHJvdW5kdHJpcCggImFcclxuXHJcbmJjIiApICk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdFR3b0xpbmVzQXRFbmQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoICJhXHJcblxyXG4iLCByb3VuZHRyaXAoICJhXHJcblxyXG4iICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TGludXhMaW5lZmVlZHMoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBmaW5hbCBTdHJpbmcgcm91bmR0cmlwID0gcm91bmR0cmlwKCAiYWJcbmMiLCBmYWxzZSApOwotICAgICAgICBhc3NlcnRFcXVhbHMoICJhYlxyXG5jIiwgcm91bmR0cmlwICk7Ci0gICAgfQotCi0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWFsZm9ybWVkKCkKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKCAiYVxyYmMiLCByb3VuZHRyaXAoICJhXHJiYyIsIGZhbHNlICkgKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0YWluTGluZUZlZWQoKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBhc3NlcnRFcXVhbHMoICJhXHJcblxyXG4iLCByb3VuZHRyaXAoICJhXHJcblxyXG4iLCBmYWxzZSApICk7Ci0gICAgICAgIGFzc2VydEVxdWFscyggImEiLCByb3VuZHRyaXAoICJhIiwgZmFsc2UgKSApOwotICAgIH0KLQotICAgIHByaXZhdGUgU3RyaW5nIHJvdW5kdHJpcCggU3RyaW5nIG1zZyApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcmV0dXJuIHJvdW5kdHJpcCggbXNnLCB0cnVlICk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBTdHJpbmcgcm91bmR0cmlwKCBTdHJpbmcgbXNnLCBib29sZWFuIGVuc3VyZSApCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSggbXNnLmdldEJ5dGVzKCkgKTsKLSAgICAgICAgV2luZG93c0xpbmVGZWVkSW5wdXRTdHJlYW0gbGYgPSBuZXcgV2luZG93c0xpbmVGZWVkSW5wdXRTdHJlYW0oIGJhb3MsIGVuc3VyZSApOwotICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAwXTsKLSAgICAgICAgZmluYWwgaW50IHJlYWQgPSBsZi5yZWFkKCBidWYgKTsKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoIGJ1ZiwgMCwgcmVhZCApOwotICAgIH0KLQotCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4tYXNzZW1ibHktcGx1Z2luLTIueC9zcmMvdGVzdC9yZXNvdXJjZXMvYXNzZW1ibGllcy9lbXB0eS54bWwgYi9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsaWVzL2VtcHR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUyOWQ5Ni4uMDAwMDAwMAotLS0gYS9tYXZlbi1hc3NlbWJseS1wbHVnaW4tMi54L3NyYy90ZXN0L3Jlc291cmNlcy9hc3NlbWJsaWVzL2VtcHR5LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/PgotPCEtLQotTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi1kaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi1zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi1LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLXNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLXVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCmluZGV4IGY4YmY3ZGEuLjZhYWRhMjggMTAwNjQ0Ci0tLSBhL3BvbS54bWwKKysrIGIvcG9tLnhtbApAQCAtMzM0LDI5ICszMzQsNiBAQAogICA8cHJvZmlsZXM+CiAgICAgPHByb2ZpbGU+CiAgICAgICA8aWQ+cnVuLWl0czwvaWQ+Ci0gICAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICA8aWQ+Y29kZWhhdXMub3JnPC9pZD4KLSAgICAgICAgICA8dXJsPmh0dHA6Ly9zbmFwc2hvdHMucmVwb3NpdG9yeS5jb2RlaGF1cy5vcmc8L3VybD4KLSAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICA8L3JlcG9zaXRvcmllcz4KLSAgICAgIDxwbHVnaW5SZXBvc2l0b3JpZXM+Ci0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICAgIDxpZD5jb2RlaGF1cy5zbmFwc2hvdHM8L2lkPgotICAgICAgICAgIDx1cmw+aHR0cDovL3NuYXBzaG90cy5yZXBvc2l0b3J5LmNvZGVoYXVzLm9yZzwvdXJsPgotICAgICAgICA8L3BsdWdpblJlcG9zaXRvcnk+Ci0gICAgICAgIDxwbHVnaW5SZXBvc2l0b3J5PgotICAgICAgICAgIDxpZD5hcGFjaGUuc25hcHNob3RzPC9pZD4KLSAgICAgICAgICA8dXJsPmh0dHA6Ly9yZXBvc2l0b3J5LmFwYWNoZS5vcmcvc25hcHNob3RzPC91cmw+Ci0gICAgICAgICAgPHJlbGVhc2VzPgotICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgPC9yZWxlYXNlcz4KLSAgICAgICAgPC9wbHVnaW5SZXBvc2l0b3J5PgotICAgICAgPC9wbHVnaW5SZXBvc2l0b3JpZXM+Ci0KICAgICAgIDxwcm9wZXJ0aWVzPgogICAgICAgICA8aW52b2tlclBsdWdpblZlcnNpb24+MS45PC9pbnZva2VyUGx1Z2luVmVyc2lvbj4KICAgICAgICAgPGl0UGFyZW50PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2l0L2l0LXByb2plY3QtcGFyZW50PC9pdFBhcmVudD4K